Author: brandonwilliams
Date: Wed Dec 14 18:44:54 2011
New Revision: 1214399

URL: http://svn.apache.org/viewvc?rev=1214399&view=rev
Log:
Bootstrapping nodes ensure schema is complete before continuing.
Patch by brandonwilliams reviewed by jbellis for CASSANDRA-3629

Modified:
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/MigrationManager.java
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/StorageService.java

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/MigrationManager.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/MigrationManager.java?rev=1214399&r1=1214398&r2=1214399&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/MigrationManager.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/MigrationManager.java
 Wed Dec 14 18:44:54 2011
@@ -53,6 +53,8 @@ public class MigrationManager implements
 
     // avoids re-pushing migrations that we're waiting on target to apply 
already
     private static Map<InetAddress,UUID> lastPushed = new 
MapMaker().expiration(1, TimeUnit.MINUTES).makeMap();
+    
+    private static UUID highestKnown;
 
     public void onJoin(InetAddress endpoint, EndpointState epState) { 
         VersionedValue value = 
epState.getApplicationState(ApplicationState.SCHEMA);
@@ -94,6 +96,7 @@ public class MigrationManager implements
      */
     public static void rectify(UUID theirVersion, InetAddress endpoint)
     {
+        updateHighestKnown(theirVersion);
         UUID myVersion = Schema.instance.getVersion();
         if (theirVersion.timestamp() < myVersion.timestamp()
             && !StorageService.instance.isClientMode())
@@ -112,6 +115,17 @@ public class MigrationManager implements
             }
         }
     }
+    
+    private static void updateHighestKnown(UUID theirversion)
+    {
+        if (highestKnown == null || theirversion.timestamp() > 
highestKnown.timestamp())
+            highestKnown = theirversion;
+    }
+
+    public static boolean isReadyForBootstrap()
+    {
+        return highestKnown.compareTo(Schema.instance.getVersion()) == 0;
+    }
 
     private static void pushMigrations(InetAddress endpoint, 
Collection<IColumn> migrations)
     {

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/StorageService.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/StorageService.java?rev=1214399&r1=1214398&r2=1214399&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/StorageService.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/StorageService.java
 Wed Dec 14 18:44:54 2011
@@ -524,6 +524,7 @@ public class StorageService implements I
                  || !Schema.instance.getNonSystemTables().isEmpty()))
         {
             setMode(Mode.JOINING, "waiting for ring and schema information", 
true);
+            // first sleep the delay to make sure we see the schema
             try
             {
                 Thread.sleep(delay);
@@ -532,6 +533,22 @@ public class StorageService implements I
             {
                 throw new AssertionError(e);
             }
+            // now if our schema hasn't matched, keep sleeping until it does
+            while (!MigrationManager.isReadyForBootstrap())
+            {
+                setMode(Mode.JOINING, "waiting for schema information to 
complete", true);
+                try
+                {
+                    Thread.sleep(delay);
+                }
+                catch (InterruptedException e)
+                {
+                    throw new AssertionError(e);
+                }
+            }
+            setMode(Mode.JOINING, "schema complete, ready to bootstrap", true);
+
+
             if (logger_.isDebugEnabled())
                 logger_.debug("... got ring + schema info");
 


Reply via email to