You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2009/10/07 18:23:25 UTC

svn commit: r822791 - in /incubator/cassandra/trunk/src/java/org/apache/cassandra: service/StorageLoadBalancer.java service/StorageService.java service/StorageServiceMBean.java tools/NodeProbe.java

Author: jbellis
Date: Wed Oct  7 16:23:24 2009
New Revision: 822791

URL: http://svn.apache.org/viewvc?rev=822791&view=rev
Log:
add getLoadMap jmx method; add load info to nodeprobe ring
patch by jbellis; reviewed by Eric Evans for CASSANDRA-385

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageLoadBalancer.java?rev=822791&r1=822790&r2=822791&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageLoadBalancer.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageLoadBalancer.java Wed Oct  7 16:23:24 2009
@@ -338,6 +338,11 @@
         }
         return null;
     }
+
+    public Map<EndPoint, Double> getLoadInfo()
+    {
+        return loadInfo_;
+    }
 }
 
 class MoveMessage implements Serializable

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=822791&r1=822790&r2=822791&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Wed Oct  7 16:23:24 2009
@@ -379,16 +379,13 @@
     */
     public Map<Range, List<EndPoint>> constructRangeToEndPointMap(Range[] ranges)
     {
-        if (logger_.isDebugEnabled())
-          logger_.debug("Constructing range to endpoint map ...");
         Map<Range, List<EndPoint>> rangeToEndPointMap = new HashMap<Range, List<EndPoint>>();
-        for ( Range range : ranges )
+        for (Range range : ranges)
         {
             EndPoint[] endpoints = nodePicker_.getReadStorageEndPoints(range.right());
-            rangeToEndPointMap.put(range, new ArrayList<EndPoint>( Arrays.asList(endpoints) ) );
+            // create a new ArrayList since a bunch of methods like to mutate the endpointmap List
+            rangeToEndPointMap.put(range, new ArrayList<EndPoint>(Arrays.asList(endpoints)));
         }
-        if (logger_.isDebugEnabled())
-          logger_.debug("Done constructing range to endpoint map ...");
         return rangeToEndPointMap;
     }
     
@@ -514,6 +511,22 @@
         return FileUtils.stringifyFileSize(FileUtils.getUsedDiskSpace());
     }
 
+    public Map<String, String> getLoadMap()
+    {
+        Map<String, String> map = new HashMap<String, String>();
+        for (Map.Entry<EndPoint,Double> entry : storageLoadBalancer_.getLoadInfo().entrySet())
+        {
+            map.put(entry.getKey().getHost(), FileUtils.stringifyFileSize(entry.getValue()));
+        }
+        // gossiper doesn't bother sending to itself, so if there are no other nodes around
+        // we need to cheat to get load information for the local node
+        if (!map.containsKey(getLocalControlEndPoint().getHost()))
+        {
+            map.put(getLocalControlEndPoint().getHost(), getLoadString());
+        }
+        return map;
+    }
+
     /*
      * This method updates the token on disk and modifies the cached
      * StorageMetadata instance. This is only for the local endpoint.

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=822791&r1=822790&r2=822791&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java Wed Oct  7 16:23:24 2009
@@ -64,6 +64,9 @@
     /** Human-readable load value */
     public String getLoadString();
 
+    /** Human-readable load value.  Keys are IP addresses. */
+    public Map<String, String> getLoadMap();
+
     /**
      * Return the generation value for this node.
      *

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=822791&r1=822790&r2=822791&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java Wed Oct  7 16:23:24 2009
@@ -205,17 +205,19 @@
         Collections.sort(ranges);
         Set<String> liveNodes = ssProxy.getLiveNodes();
         Set<String> deadNodes = ssProxy.getUnreachableNodes();
+        Map<String, String> loadMap = ssProxy.getLoadMap();
 
         // Print range-to-endpoint mapping
         int counter = 0;
         outs.print(String.format("%-14s", "Address"));
         outs.print(String.format("%-11s", "Status"));
+        outs.print(String.format("%-14s", "Load"));
         outs.print(String.format("%-43s", "Range"));
         outs.println("Ring");
         // emphasize that we're showing the right part of each range
         if (ranges.size() > 1)
         {
-            outs.println(String.format("%-14s%-11s%-43s", "", "", ranges.get(0).left()));
+            outs.println(String.format("%-14s%-11s%-14s%-43s", "", "", "", ranges.get(0).left()));
         }
         // normal range & node info
         for (Range range : ranges) {
@@ -223,12 +225,17 @@
             String primaryEndpoint = endpoints.get(0);
 
             outs.print(String.format("%-14s", primaryEndpoint));
+
             String status = liveNodes.contains(primaryEndpoint)
-                            ? "Up"
-                            : deadNodes.contains(primaryEndpoint)
-                              ? "Down"
-                              : "?";
+                          ? "Up"
+                          : deadNodes.contains(primaryEndpoint)
+                            ? "Down"
+                            : "?";
             outs.print(String.format("%-11s", status));
+
+            String load = loadMap.containsKey(primaryEndpoint) ? loadMap.get(primaryEndpoint) : "?";
+            outs.print(String.format("%-14s", load));
+
             outs.print(String.format("%-43s", range.right()));
 
             String asciiRingArt;