Preload essential gossip states before startup. Patch by brandonwilliams, reviewed by slebresne for CASSANDRA-5107
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/43c9e815 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/43c9e815 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/43c9e815 Branch: refs/heads/trunk Commit: 43c9e8156a5b9ae3fd5fce07f885365538d6ca50 Parents: 4df8fdc Author: Brandon Williams <[email protected]> Authored: Fri Jan 18 11:49:47 2013 -0600 Committer: Brandon Williams <[email protected]> Committed: Fri Jan 18 11:49:47 2013 -0600 ---------------------------------------------------------------------- src/java/org/apache/cassandra/gms/Gossiper.java | 12 +++++++-- .../apache/cassandra/service/StorageService.java | 18 +++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/43c9e815/src/java/org/apache/cassandra/gms/Gossiper.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index d550bb6..9ee2f61 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -995,11 +995,15 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean } } + public void start(int generationNumber) + { + start(generationNumber, new HashMap<ApplicationState, VersionedValue>()); + } + /** - * Start the gossiper with the generation # retrieved from the System - * table + * Start the gossiper with the generation number, preloading the map of application states before starting */ - public void start(int generationNbr) + public void start(int generationNbr, Map<ApplicationState, VersionedValue> preloadLocalStates) { /* Get the seeds from the config and initialize them. */ Set<InetAddress> seedHosts = DatabaseDescriptor.getSeeds(); @@ -1013,6 +1017,8 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean /* initialize the heartbeat state for this localEndpoint */ maybeInitializeLocalState(generationNbr); EndpointState localState = endpointStateMap.get(FBUtilities.getBroadcastAddress()); + for (Map.Entry<ApplicationState, VersionedValue> entry : preloadLocalStates.entrySet()) + localState.addApplicationState(entry.getKey(), entry.getValue()); //notify snitches that Gossiper is about to start DatabaseDescriptor.getEndpointSnitch().gossiperStarting(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/43c9e815/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 4c0a9ce..2f178b6 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -524,24 +524,24 @@ public class StorageService extends NotificationBroadcasterSupport implements IE // have to start the gossip service before we can see any info on other nodes. this is necessary // for bootstrap to get the load info it needs. // (we won't be part of the storage ring though until we add a counterId to our state, below.) + Map<ApplicationState, VersionedValue> appStates = new HashMap<ApplicationState, VersionedValue>(); + appStates.put(ApplicationState.NET_VERSION, valueFactory.networkVersion()); + appStates.put(ApplicationState.HOST_ID, valueFactory.hostId(SystemTable.getLocalHostId())); + appStates.put(ApplicationState.RPC_ADDRESS, valueFactory.rpcaddress(DatabaseDescriptor.getRpcAddress())); + if (0 != DatabaseDescriptor.getReplaceTokens().size()) + appStates.put(ApplicationState.STATUS, valueFactory.hibernate(true)); + appStates.put(ApplicationState.RELEASE_VERSION, valueFactory.releaseVersion()); Gossiper.instance.register(this); Gossiper.instance.register(migrationManager); - Gossiper.instance.start(SystemTable.incrementAndGetGeneration()); // needed for node-ring gathering. - // gossip network proto version - Gossiper.instance.addLocalApplicationState(ApplicationState.NET_VERSION, valueFactory.networkVersion()); - Gossiper.instance.addLocalApplicationState(ApplicationState.HOST_ID, valueFactory.hostId(SystemTable.getLocalHostId())); + Gossiper.instance.start(SystemTable.incrementAndGetGeneration(), appStates); // needed for node-ring gathering. // gossip snitch infos (local DC and rack) gossipSnitchInfo(); + // gossip Schema.emptyVersion forcing immediate check for schema updates (see MigrationManager#maybeScheduleSchemaPull) Schema.instance.updateVersionAndAnnounce(); // Ensure we know our own actual Schema UUID in preparation for updates - // add rpc listening info - Gossiper.instance.addLocalApplicationState(ApplicationState.RPC_ADDRESS, valueFactory.rpcaddress(DatabaseDescriptor.getRpcAddress())); - if (0 != DatabaseDescriptor.getReplaceTokens().size()) - Gossiper.instance.addLocalApplicationState(ApplicationState.STATUS, valueFactory.hibernate(true)); MessagingService.instance().listen(FBUtilities.getLocalAddress()); LoadBroadcaster.instance.startBroadcasting(); - Gossiper.instance.addLocalApplicationState(ApplicationState.RELEASE_VERSION, valueFactory.releaseVersion()); HintedHandOffManager.instance.start(); BatchlogManager.instance.start();
