Author: jbellis
Date: Tue Feb  9 22:57:32 2010
New Revision: 908267

URL: http://svn.apache.org/viewvc?rev=908267&view=rev
Log:
sleep after moving to get load info before asking for bootstrap token.  patch 
by Stu Hood; reviewed by jbellis for CASSANDRA-762

Modified:
    incubator/cassandra/branches/cassandra-0.5/CHANGES.txt
    
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
    
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
    
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
    
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
    
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java

Modified: incubator/cassandra/branches/cassandra-0.5/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/CHANGES.txt?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
--- incubator/cassandra/branches/cassandra-0.5/CHANGES.txt (original)
+++ incubator/cassandra/branches/cassandra-0.5/CHANGES.txt Tue Feb  9 22:57:32 
2010
@@ -3,6 +3,7 @@
    (CASSANDRA-716)
  * don't omit live subcolumns of deleted supercolumns in thrift result.
    (CASSANDRA-703)
+ * more accurate load estimate for bootstrapping (CASSANDRA-762)
 
 
 0.5.0 final

Modified: 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
 Tue Feb  9 22:57:32 2010
@@ -51,7 +51,7 @@
 {
     private static Logger logger = Logger.getLogger(Streaming.class);
     private static String TABLE_NAME = "STREAMING-TABLE-NAME";
-    public static final long RING_DELAY = 30 * 1000; // delay after which we 
assume ring has stablized
+    public static final int RING_DELAY = 30 * 1000; // delay after which we 
assume ring has stablized
 
     /**
      * Split out files for all tables on disk locally for each range and then 
stream them to the target endpoint.

Modified: 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
 Tue Feb  9 22:57:32 2010
@@ -167,7 +167,7 @@
         }
     }
 
-    private static final long BROADCAST_INTERVAL = 5 * 60 * 1000L;
+    private static final int BROADCAST_INTERVAL = 5 * 60 * 1000;
 
     private static StorageLoadBalancer instance_;
 
@@ -367,18 +367,17 @@
         loadTimer_.schedule(new LoadDisseminator(), 2 * 
Gossiper.intervalInMillis_, BROADCAST_INTERVAL);
     }
 
-    /** wait for node information to be available.  if the rest of the cluster 
just came up,
-        this could be up to threshold_ ms (currently 5 minutes). */
+    /**
+     * Wait for at least BROADCAST_INTERVAL ms, to give all nodes enough time 
to
+     * report in.
+     */
     public void waitForLoadInfo()
     {
+        int duration = BROADCAST_INTERVAL + Streaming.RING_DELAY;
         try
         {
-            while (loadInfo_.isEmpty())
-            {
-                Thread.sleep(100);
-            }
-            // one more sleep in case there are some stragglers
-            Thread.sleep(Streaming.RING_DELAY);
+            logger_.info("Sleeping " + duration + " ms to wait for load 
information...");
+            Thread.sleep(duration);
         }
         catch (InterruptedException e)
         {

Modified: 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
 Tue Feb  9 22:57:32 2010
@@ -300,7 +300,7 @@
         if (DatabaseDescriptor.isAutoBootstrap()
             && 
!(DatabaseDescriptor.getSeeds().contains(FBUtilities.getLocalAddress()) || 
SystemTable.isBootstrapped()))
         {
-            logger_.info("Starting in bootstrap mode (first, sleeping to get 
load information)");
+            logger_.info("Starting in bootstrap mode");
             StorageLoadBalancer.instance().waitForLoadInfo();
             logger_.info("... got load info");
             if (tokenMetadata_.isMember(FBUtilities.getLocalAddress()))
@@ -1276,6 +1276,7 @@
         if 
(tokenMetadata_.getPendingRanges(FBUtilities.getLocalAddress()).size() > 0)
             throw new UnsupportedOperationException("data is currently moving 
to this node; unable to leave the ring");
 
+        // leave the ring
         logger_.info("DECOMMISSIONING");
         startLeaving();
         logger_.info("decommission sleeping " + Streaming.RING_DELAY);
@@ -1355,7 +1356,7 @@
         }
     }
 
-    public void move(String newToken) throws InterruptedException
+    public void move(String newToken) throws IOException, InterruptedException
     {
         move(partitioner_.getTokenFactory().fromString(newToken));
     }
@@ -1370,11 +1371,14 @@
      *
      * @param token new token to boot to, or if null, find balanced token to 
boot to
      */
-    private void move(final Token token) throws InterruptedException
+    private void move(final Token token) throws IOException, 
InterruptedException
     {
         if 
(tokenMetadata_.getPendingRanges(FBUtilities.getLocalAddress()).size() > 0)
             throw new UnsupportedOperationException("data is currently moving 
to this node; unable to leave the ring");
+        if (token != null && tokenMetadata_.sortedTokens().contains(token))
+            throw new IOException("target token " + token + " is already owned 
by another node");
 
+        // leave the ring
         logger_.info("starting move. leaving token " + getLocalToken());
         startLeaving();
         logger_.info("move sleeping " + Streaming.RING_DELAY);
@@ -1388,7 +1392,10 @@
                 {
                     Token bootstrapToken = token;
                     if (bootstrapToken == null)
+                    {
+                        StorageLoadBalancer.instance().waitForLoadInfo();
                         bootstrapToken = 
BootStrapper.getBalancedToken(tokenMetadata_, 
StorageLoadBalancer.instance().getLoadInfo());
+                    }
                     logger_.info("re-bootstrapping to new token " + 
bootstrapToken);
                     startBootstrap(bootstrapToken);
                 }

Modified: 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
 Tue Feb  9 22:57:32 2010
@@ -132,7 +132,7 @@
      * @param newToken token to move this node to.
      * This node will unload its data onto its neighbors, and bootstrap to the 
new token.
      */
-    public void move(String newToken) throws InterruptedException;
+    public void move(String newToken) throws IOException, InterruptedException;
 
     /**
      * This node will unload its data onto its neighbors, and bootstrap to 
share the range

Modified: 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java
 Tue Feb  9 22:57:32 2010
@@ -392,7 +392,7 @@
         ssProxy.loadBalance();
     }
 
-    public void move(String newToken) throws InterruptedException
+    public void move(String newToken) throws IOException, InterruptedException
     {
         ssProxy.move(newToken);
     }


Reply via email to