Author: goffinet
Date: Mon May 30 08:51:33 2011
New Revision: 1129065

URL: http://svn.apache.org/viewvc?rev=1129065&view=rev
Log:
Committed second patch for making bootstrap retry. Added a default bootstrap 
timeout.
patch by goffinet; reviewed by stuhood for CASSANDRA-2644

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java?rev=1129065&r1=1129064&r2=1129065&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java Mon May 
30 08:51:33 2011
@@ -22,6 +22,7 @@ package org.apache.cassandra.dht;
  import java.net.InetAddress;
  import java.util.*;
  import java.util.concurrent.CountDownLatch;
+ import java.util.concurrent.TimeUnit;
  import java.util.concurrent.locks.Condition;
 
  import com.google.common.base.Charsets;
@@ -61,6 +62,7 @@ public class BootStrapper
     /* tokens of the nodes being bootstrapped. */
     protected final Token token;
     protected final TokenMetadata tokenMetadata;
+    private static final long BOOTSTRAP_TIMEOUT = 30000; // default bootstrap 
timeout of 30s
 
     public BootStrapper(InetAddress address, Token token, TokenMetadata tmd)
     {
@@ -220,9 +222,20 @@ public class BootStrapper
                                       StorageService.Verb.BOOTSTRAP_TOKEN, 
                                       ArrayUtils.EMPTY_BYTE_ARRAY, 
                                       
Gossiper.instance.getVersion(maxEndpoint));
-        BootstrapTokenCallback btc = new BootstrapTokenCallback();
-        MessagingService.instance().sendRR(message, maxEndpoint, btc);
-        return btc.getToken();
+        int retries = 5;
+        long timeout = Math.max(MessagingService.getDefaultCallbackTimeout(), 
BOOTSTRAP_TIMEOUT);
+
+        while (retries > 0)
+        {
+            BootstrapTokenCallback btc = new BootstrapTokenCallback();
+            MessagingService.instance().sendRR(message, maxEndpoint, btc, 
timeout);
+            Token token = btc.getToken(timeout);
+            if (token != null)
+                return token;
+
+            retries--;
+        }
+        throw new RuntimeException("Bootstrap failed, could not obtain token 
from: " + maxEndpoint);
     }
 
     public static Multimap<InetAddress, Range> getWorkMap(Multimap<Range, 
InetAddress> rangesWithSourceTarget)
@@ -269,17 +282,19 @@ public class BootStrapper
         private volatile Token<?> token;
         private final Condition condition = new SimpleCondition();
 
-        public Token<?> getToken()
+        public Token<?> getToken(long timeout)
         {
+            boolean success;
             try
             {
-                condition.await();
+                success = condition.await(timeout, TimeUnit.MILLISECONDS);
             }
             catch (InterruptedException e)
             {
                 throw new RuntimeException(e);
             }
-            return token;
+
+            return success ? token : null;
         }
 
         public void response(Message msg)


Reply via email to