summaryrefslogtreecommitdiff
path: root/storage/ndb/tools/old_dirs/src/counterviewer/CounterViewer.java
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/tools/old_dirs/src/counterviewer/CounterViewer.java')
-rw-r--r--storage/ndb/tools/old_dirs/src/counterviewer/CounterViewer.java725
1 files changed, 725 insertions, 0 deletions
diff --git a/storage/ndb/tools/old_dirs/src/counterviewer/CounterViewer.java b/storage/ndb/tools/old_dirs/src/counterviewer/CounterViewer.java
new file mode 100644
index 00000000000..317c1c75e28
--- /dev/null
+++ b/storage/ndb/tools/old_dirs/src/counterviewer/CounterViewer.java
@@ -0,0 +1,725 @@
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import java.io.*;
+import java.net.*;
+import javax.swing.*;
+
+class Node extends Observable {
+ public final static int UNDEFINED = -1;
+ public final static int NDB_NODE = 0;
+ public final static int MGM_NODE = 1;
+ public final static int API_NODE = 2;
+
+ public int getNodeType() { return m_nodeType;}
+ public static int getNodeType(String str) {
+ if(str.equals("NDB"))
+ return NDB_NODE;
+ if(str.equals("API"))
+ return API_NODE;
+ if(str.equals("MGM"))
+ return MGM_NODE;
+ return UNDEFINED;
+ }
+
+ protected int m_nodeType;
+}
+
+class NdbNode extends Node {
+ public NdbNode(){
+ m_nodeType = NDB_NODE;
+ }
+
+ public Counters getCounters() { return counters; }
+
+ public void setCounters(Counters _c) {
+
+ if(_c == null){
+ counters = null;
+ setChanged();
+ notifyObservers();
+ return;
+ }
+
+ int old_tps = 0;
+ int old_ops = 0;
+ int old_aps = 0;
+ int diff = 5;
+ if(counters != null){
+ old_tps = counters.tps;
+ old_ops = counters.ops;
+ old_aps = counters.aps;
+ diff = 5; //_c.epochsecs - counters.epochsecs;
+ }
+
+ switch(_c.type){
+ case Counters.TRANSACTIONS:
+ _c.tps = (_c.transactions -_c.aborts)/ diff;
+ _c.aps = _c.aborts / diff;
+ _c.ops = old_ops;
+ break;
+ case Counters.OPERATIONS:
+ _c.tps = old_tps;
+ _c.aps = old_aps;
+ _c.ops = _c.operations / diff;
+ break;
+ }
+
+ counters = _c;
+ setChanged();
+ notifyObservers();
+ }
+
+ public int getNodeState(){
+ return nodeState;
+ }
+
+ public static int getNodeState(String state){
+ if(state.equals("NOT_STARTED") ||
+ state.equals("NO_CONTACT"))
+ return 0;
+ return 1;
+ }
+
+ public void setState(int nodeState){
+ this.nodeState = nodeState;
+ if(nodeState == 0)
+ counters = null;
+ }
+
+ private int nodeState;
+ private Counters counters;
+}
+
+class MgmNode extends Node { public MgmNode(){ m_nodeType = MGM_NODE; } }
+class ApiNode extends Node { public ApiNode(){ m_nodeType = API_NODE; } }
+
+class Counters {
+
+ public static final int TRANSACTIONS = 0;
+ public static final int OPERATIONS = 1;
+
+ public Counters(){
+ transactions = operations = -1;
+ }
+
+ public int type;
+ public int transactions;
+ public int operations;
+ public int aborts;
+ public int tps;
+ public int ops;
+ public int aps;
+ public int epochsecs;
+
+ public String toString(){
+ return "[Counters"+
+ " transactions="+transactions+
+ " operations="+operations+
+ " tps="+tps+
+ " ops="+ops+
+ " ]";
+ }
+}
+
+class NdbCluster extends Observable {
+
+ NdbCluster(int node_types[], int num_nodes, int maxNodeId){
+
+ nodes = new Node[maxNodeId+1];
+ maxCounters = new Counters();
+
+ for(int i = 0; i<maxNodeId; i++)
+ nodes[i] = null;
+
+ for(int i = 1; i<num_nodes; i++)
+ switch(node_types[i]){
+ case Node.NDB_NODE:
+ nodes[i] = new NdbNode();
+ break;
+ case Node.API_NODE:
+ nodes[i] = new ApiNode();
+ break;
+ case Node.MGM_NODE:
+ nodes[i] = new MgmNode();
+ default:
+ }
+ }
+
+ public int getNoOfNdbNodes(){
+ if(nodes == null)
+ return 0;
+ int retVal = 0;
+ for(int i = 1; i<nodes.length; i++)
+ if(getNodeType(i) == Node.NDB_NODE)
+ retVal++;
+ return retVal;
+ }
+
+ public int getNodeType(int nodeId){
+ if(nodes == null || nodeId > nodes.length || nodes[nodeId] == null)
+ return Node.UNDEFINED;
+ return nodes[nodeId].getNodeType();
+ }
+
+ public Counters getCounters(int nodeId){
+ if(nodes == null || nodeId > nodes.length || nodes[nodeId] == null ||
+ nodes[nodeId].getNodeType() != Node.NDB_NODE)
+ return null;
+ return ((NdbNode)nodes[nodeId]).getCounters();
+ }
+
+ public void setCounters(int nodeId, Counters _c){
+ if(nodes == null || nodeId > nodes.length || nodes[nodeId] == null)
+ return;
+ ((NdbNode)nodes[nodeId]).setCounters(_c);
+
+ int maxSum = 0;
+ for(int i = 1; i<nodes.length; i++){
+ Counters c = getCounters(i);
+ if(c != null){
+ int sum = c.tps + c.ops + c.aps;
+ if(sum > maxSum){
+ maxCounters = c;
+ maxSum = sum;
+ }
+ }
+ }
+ setChanged();
+ notifyObservers();
+ }
+
+ public void setState(int nodeId, int nodeType, int nodeState){
+ if(nodes == null || nodeId > nodes.length || nodes[nodeId] == null ||
+ nodes[nodeId].getNodeType() != nodeType)
+ return;
+
+ if(nodeType != Node.NDB_NODE)
+ return;
+
+ ((NdbNode)nodes[nodeId]).setState(nodeState);
+ }
+
+ public void setNoConnection(){
+ for(int i = 1; i<nodes.length; i++){
+ Counters c = getCounters(i);
+ if(c != null){
+ setCounters(i, null);
+ }
+ }
+ }
+
+ public Counters getMaxCounters(){
+ return maxCounters;
+ }
+
+ private Node nodes[];
+ private Counters maxCounters;
+}
+
+class CountersPanel extends JPanel implements Observer
+{
+ public CountersPanel(Dimension dim, NdbCluster _cluster, int maxInRow)
+ {
+ cluster = _cluster;
+ cluster.addObserver(this);
+ maxRow = maxInRow;
+ reSize(dim);
+ }
+
+ private void showCounters(Graphics g, int node, int x, int y, boolean p)
+ {
+ Counters counters = cluster.getCounters(node);
+
+ if (counters == null || p){
+ // Mark processor as not available
+ g.setColor(Color.black);
+ g.fillRect(x, y, width, height);
+ } else {
+ int red = (counters.aps * height) / scale;
+ int green = (counters.tps * height) / scale;
+ int yellow = (counters.ops * height) / scale;
+
+ System.out.println("tps="+counters.tps+" ops="+counters.ops+" scale="+scale+" green="+green+" yellow="+yellow);
+
+ g.setColor(Color.white);
+ g.fillRect(x, y, width, height);
+ if (yellow + green + red <= height){ // Max 100% load
+ int yellow_scaled = yellow;
+ int green_scaled = green;
+ int red_scaled = red;
+ if (red_scaled > 0){
+ g.setColor(Color.red);
+ g.fillRect(x,
+ height + y - red_scaled,
+ width,
+ red_scaled);
+ }
+ if (green_scaled > 0){
+ g.setColor(Color.green);
+ g.fillRect(x,
+ height + y - red_scaled - green_scaled,
+ width,
+ green_scaled);
+ }
+ if (yellow_scaled > 0){
+ g.setColor(Color.yellow);
+ g.fillRect(x,
+ height + y - red_scaled - green_scaled - yellow_scaled,
+ width,
+ yellow_scaled);
+ }
+ }
+ // Draw box
+ g.setColor(Color.black);
+ g.drawRect(x, y, width, height);
+
+ float f = ((float)height)/((float)(lines+1));
+
+ for(int i = 0; i<lines; i++){
+ int ytmp = (int)(y+height-(i+1)*f);
+ g.drawLine(x, ytmp, x+width, ytmp);
+ }
+ }
+ }
+
+ public void paintComponent(Graphics g)
+ {
+ super.paintComponent(g);
+
+ Counters maxCounters = cluster.getMaxCounters();
+ final int sum = maxCounters.tps+maxCounters.ops+maxCounters.aps;
+ boolean skipDraw = false;
+ if(sum == 0){
+ skipDraw = true;
+ } else {
+ lines = (sum / 1000) + 1;
+ scale = (lines+1) * 1000;
+ }
+
+ int nodeId = 0;
+ int nodeNo = 0;
+ final int noOfNdbNodes = cluster.getNoOfNdbNodes();
+ for(int row = 0; row <= noOfNdbNodes / maxRow; row++) {
+ int end = Math.min(noOfNdbNodes, (row + 1) * maxRow);
+ for (int pos = 0; (nodeNo < noOfNdbNodes) && (pos < maxRow); pos++){
+ while(cluster.getNodeType(nodeId) != Node.NDB_NODE)
+ nodeId++;
+ showCounters(g,
+ nodeId,
+ xindent + (xgap + width) * pos,
+ yindent + row * (height + ygap),
+ skipDraw);
+ nodeNo++;
+ nodeId++;
+ }
+ }
+ }
+
+ public void setWidth(int maxInRow)
+ {
+ maxRow = maxInRow;
+ }
+
+ public void reSize(Dimension dim)
+ {
+ final int noOfNdbNodes = cluster.getNoOfNdbNodes();
+
+ // System.out.println(dim);
+ int noRows = (int) Math.ceil((double) noOfNdbNodes / (double) maxRow);
+ xgap = (noOfNdbNodes > 1) ? Math.max(2, dim.width / 50) : 0;
+ ygap = (noOfNdbNodes > 1) ? Math.max(2, dim.height / 20) : 0;
+ xindent = 10;
+ yindent = 10;
+ int heightOfScroll = 20;
+ Insets insets = getInsets();
+ width = (dim.width - (insets.left + insets.right) - 2*xindent + xgap)/maxRow - xgap;
+ height = (dim.height - (insets.top + insets.bottom) - 2*yindent + ygap - heightOfScroll)/noRows - ygap;
+ }
+
+
+ public void update(Observable o, Object arg){
+ repaint();
+ }
+
+ private int width, height, maxRow, xgap, ygap, xindent, yindent;
+ private int scale;
+ private int lines;
+ private NdbCluster cluster;
+}
+
+class CountersFrame extends JFrame
+ implements ComponentListener, AdjustmentListener
+{
+
+ public CountersFrame(NdbCluster cluster)
+ {
+ setTitle("CountersViewer");
+
+ final int noOfNdbNodes = cluster.getNoOfNdbNodes();
+
+ processorWidth = Math.min(noOfNdbNodes, 10);
+ setSize(Math.max(50, processorWidth*20),
+ Math.max(100, 200*noOfNdbNodes/processorWidth));
+ JPanel p = new JPanel();
+ addComponentListener(this);
+ p.addComponentListener(this);
+ getContentPane().add(p, "Center");
+ myPanel = new CountersPanel(getContentPane().getSize(),
+ cluster,
+ processorWidth);
+ getContentPane().add(myPanel, "Center");
+ JPanel labelAndScroll = new JPanel();
+ labelAndScroll.setLayout(new GridLayout (1, 2));
+ myWidthLabel = new JLabel("Width: " + processorWidth);
+ labelAndScroll.add(myWidthLabel);
+ myWidthScroll = new JScrollBar(Adjustable.HORIZONTAL,
+ Math.min(noOfNdbNodes, 10), 0, 1,
+ noOfNdbNodes);
+ myWidthScroll.addAdjustmentListener(this);
+ labelAndScroll.add(myWidthScroll);
+ if (noOfNdbNodes > 1)
+ getContentPane().add(labelAndScroll, "South");
+ }
+
+ public void componentHidden(ComponentEvent e) {
+ }
+
+ public void componentMoved(ComponentEvent e) {
+ }
+
+ public void componentResized(ComponentEvent e) {
+ myPanel.reSize(getContentPane().getSize());
+ repaint();
+ }
+
+ public void componentShown(ComponentEvent e) {
+ }
+
+ public void adjustmentValueChanged(AdjustmentEvent evt)
+ {
+ myPanel.setWidth(myWidthScroll.getValue());
+ myPanel.reSize(getContentPane().getSize());
+ myWidthLabel.setText("Width: " + myWidthScroll.getValue());
+ repaint();
+ }
+
+ private JScrollBar myWidthScroll;
+ private JLabel myWidthLabel;
+ private CountersPanel myPanel;
+ private int processorWidth = 10;
+}
+
+class CountersConnection {
+
+ public CountersConnection(String host, int port){
+ this.host = host;
+ this.port = port;
+ }
+
+ public boolean connect(){
+ if(br == null){
+ try {
+ InetAddress target = InetAddress.getByName(host);
+ sock = new Socket(target, port);
+
+ br = new BufferedReader(new InputStreamReader
+ (sock.getInputStream()));
+ } catch (Exception e){
+ System.out.println("connect: " + e);
+ }
+ }
+
+ if (br == null)
+ return false;
+ return true;
+ }
+
+ public void disconnect(){
+ try {
+ sock.close();
+ } catch (Exception e){
+ System.out.println("disconnect: " + e);
+ }
+ sock = null;
+ br = null;
+ }
+
+ public boolean readCounters(NdbCluster cluster) {
+ if(!connect()){
+ cluster.setNoConnection();
+ return false;
+ }
+ String str = null;
+
+ try {
+ str = br.readLine();
+ } catch (Exception e){
+ System.out.println("readLine: " + e);
+ }
+ if(str == null){
+ disconnect();
+ return false;
+ }
+ StringTokenizer st = new StringTokenizer(str, " ");
+
+ int nodeId = 0;
+ Counters c = new Counters();
+
+ while(st.hasMoreTokens()){
+ String tmp = st.nextToken();
+ int ind = 0;
+ if(tmp.startsWith("nodeid=")){
+ nodeId = Integer.valueOf(tmp.substring(7)).intValue();
+ } else if(tmp.startsWith("trans=")){
+ c.transactions = Integer.valueOf(tmp.substring(6)).intValue();
+ c.type = Counters.TRANSACTIONS;
+ } else if(tmp.startsWith("abort=")){
+ c.aborts = Integer.valueOf(tmp.substring(6)).intValue();
+ c.type = Counters.TRANSACTIONS;
+ } else if(tmp.startsWith("epochsecs=")){
+ c.epochsecs = Integer.valueOf(tmp.substring(11)).intValue();
+ } else if(tmp.startsWith("operations=")){
+ c.operations = Integer.valueOf(tmp.substring(11)).intValue();
+ c.type = Counters.OPERATIONS;
+ }
+ }
+
+ if(nodeId != 0)
+ cluster.setCounters(nodeId, c);
+
+ return true;
+ }
+
+ private Socket sock;
+ private BufferedReader br;
+ private String host;
+ private int port;
+}
+
+class MgmConnection {
+
+ public MgmConnection(String host, int port){
+ this.host = host;
+ this.port = port;
+ }
+
+ public NdbCluster getClusterInfo(){
+ NdbCluster cluster = null;
+ if(!connect())
+ return cluster;
+
+ out.println("get info cluster");
+ String str = null;
+ try {
+ str = br.readLine();
+ if(str.startsWith("GET INFO 0")){
+ StringTokenizer st = new StringTokenizer
+ (str.substring(11));
+ int nodes[] = new int[255];
+
+ int type = Node.UNDEFINED;
+ int num_nodes = 0;
+ int maxNodeId = 0;
+ while(st.hasMoreTokens()){
+ String tmp = st.nextToken();
+ final int t = Node.getNodeType(tmp);
+ if(t != Node.UNDEFINED)
+ type = t;
+
+ int nodeId = 0;
+ try {
+ nodeId = Integer.parseInt(tmp);
+ } catch (Exception e) {}
+ if(nodeId != 0){
+ num_nodes ++;
+ nodes[nodeId] = type;
+ if(nodeId > maxNodeId)
+ maxNodeId = nodeId;
+ }
+ }
+ cluster = new NdbCluster(nodes, num_nodes,
+ maxNodeId);
+ }
+
+ } catch(Exception e){
+ System.out.println("readLine: "+e);
+ }
+ return cluster;
+ }
+
+ public boolean connect(){
+ if(br == null || out == null){
+ try {
+ InetAddress target = InetAddress.getByName(host);
+ sock = new Socket(target, port);
+
+ br = new BufferedReader(new InputStreamReader
+ (sock.getInputStream()));
+ out = new PrintWriter(sock.getOutputStream(), true);
+ } catch (Exception e){
+ System.out.println("connect: " + e);
+ }
+ }
+
+ if (br == null || out == null)
+ return false;
+ return true;
+ }
+
+ public void disconnect(){
+ try {
+ sock.close();
+ } catch (Exception e){
+ System.out.println("disconnect: " + e);
+ }
+ sock = null;
+ br = null;
+ out = null;
+ }
+
+ public boolean readStatus(NdbCluster cluster){
+
+ if(!connect()){
+ cluster.setNoConnection();
+ return false;
+ }
+
+ String str = null;
+ try {
+ out.println("get status");
+ str = br.readLine();
+ } catch (Exception e){
+ System.out.println("readLine: " + e);
+ }
+ if(str == null){
+ disconnect();
+ return false;
+ }
+
+ if(!str.startsWith("GET STATUS")){
+ disconnect();
+ return false;
+ }
+
+ int nodes = 0;
+ try {
+ nodes = Integer.parseInt(str.substring(11));
+ } catch(Exception e){
+ System.out.println("parseInt "+e);
+ }
+ if(nodes == 0){
+ disconnect();
+ return false;
+ }
+
+ try {
+ for(; nodes > 0 ; nodes --){
+ str = br.readLine();
+ StringTokenizer st = new StringTokenizer(str);
+
+ String s_nodeId = st.nextToken();
+ final int nodeId = Integer.parseInt(s_nodeId);
+
+ String s_type = st.nextToken();
+ String s_state = st.nextToken();
+ String s_phase = st.nextToken();
+ int type = Node.getNodeType(s_type);
+ int state = NdbNode.getNodeState(s_state);
+
+ cluster.setState(nodeId, type, state);
+ }
+ } catch (Exception e){
+ disconnect();
+ return false;
+ }
+
+ return true;
+ }
+
+ public int getStatisticsPort(){
+ if(!connect())
+ return -1;
+
+ String str = null;
+ try {
+ out.println("stat port");
+ str = br.readLine();
+ } catch (Exception e){
+ System.out.println("readLine: " + e);
+ }
+ if(str == null){
+ disconnect();
+ return -1;
+ }
+
+ if(!str.startsWith("STAT PORT 0")){
+ disconnect();
+ return -1;
+ }
+
+ try {
+ return Integer.parseInt(str.substring(12));
+ } catch (Exception e){
+ System.out.println("parseInt "+e);
+ }
+ return -1;
+ }
+
+ private Socket sock;
+ private BufferedReader br;
+ private PrintWriter out;
+ private String host;
+ private int port;
+}
+
+class CounterViewer {
+
+ public static void usage(){
+ System.out.println("java CounterViewer <mgm host> <mgm port>");
+ }
+
+ public static void main(String args[]){
+ try {
+ String host = args[0];
+ int port = Integer.parseInt(args[1]);
+ new CounterViewer(host, port).run();
+ return;
+ } catch (Exception e){
+ }
+ usage();
+ }
+
+ MgmConnection mgmConnection;
+ CountersConnection countersConnection;
+
+ NdbCluster cluster;
+ boolean ok;
+
+ CounterViewer(String host, int port){
+ ok = false;
+
+ mgmConnection = new MgmConnection(host, port);
+ int statPort = mgmConnection.getStatisticsPort();
+ if(statPort < 0)
+ return;
+
+ countersConnection = new CountersConnection(host, statPort);
+ cluster = mgmConnection.getClusterInfo();
+
+ CountersFrame f = new CountersFrame(cluster);
+ f.setSize (300, 200);
+ f.show();
+
+ ok = true;
+ }
+
+ void run(){
+ while(ok){
+ mgmConnection.readStatus(cluster);
+ countersConnection.readCounters(cluster);
+ }
+ }
+}
+