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");
