Don't shut MessagingService down when replacing a node. Patch by brandonwilliams, reviewed by Benedict for CASSANDRA-6476
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9359b7a3 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9359b7a3 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9359b7a3 Branch: refs/heads/cassandra-2.0 Commit: 9359b7a318884c9d3a052946d50711ce9f8b51e2 Parents: 2890cc5 Author: Brandon Williams <brandonwilli...@apache.org> Authored: Thu Apr 24 10:21:45 2014 -0500 Committer: Brandon Williams <brandonwilli...@apache.org> Committed: Thu Apr 24 10:21:45 2014 -0500 ---------------------------------------------------------------------- CHANGES.txt | 1 + src/java/org/apache/cassandra/net/MessagingService.java | 5 +++++ .../org/apache/cassandra/service/StorageService.java | 11 ++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/9359b7a3/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 74ddcfd..69e9d37 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -10,6 +10,7 @@ * Fix CQLSH parsing of functions and BLOB literals (CASSANDRA-7018) * Require nodetool rebuild_index to specify index names (CASSANDRA-7038) * Ensure that batchlog and hint timeouts do not produce hints (CASSANDRA-7058) + * Don't shut MessagingService down when replacing a node (CASSANDRA-6476) 1.2.16 http://git-wip-us.apache.org/repos/asf/cassandra/blob/9359b7a3/src/java/org/apache/cassandra/net/MessagingService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java index 3f90d7f..5e4a117 100644 --- a/src/java/org/apache/cassandra/net/MessagingService.java +++ b/src/java/org/apache/cassandra/net/MessagingService.java @@ -471,6 +471,11 @@ public final class MessagingService implements MessagingServiceMBean } } + public boolean isListening() + { + return listenGate.isSignaled(); + } + public void destroyConnectionPool(InetAddress to) { OutboundTcpConnectionPool cp = connectionManagers.get(to); http://git-wip-us.apache.org/repos/asf/cassandra/blob/9359b7a3/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 1e7bed4..3b2d945 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -390,7 +390,8 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public synchronized Collection<Token> prepareReplacementInfo() throws ConfigurationException { logger.info("Gathering node replacement information for {}", DatabaseDescriptor.getReplaceAddress()); - MessagingService.instance().listen(FBUtilities.getLocalAddress()); + if (!MessagingService.instance().isListening()) + MessagingService.instance().listen(FBUtilities.getLocalAddress()); // make magic happen Gossiper.instance.doShadowRound(); @@ -407,7 +408,6 @@ public class StorageService extends NotificationBroadcasterSupport implements IE Collection<Token> tokens = TokenSerializer.deserialize(getPartitioner(), new DataInputStream(new ByteArrayInputStream(getApplicationStateValue(DatabaseDescriptor.getReplaceAddress(), ApplicationState.TOKENS)))); SystemTable.setLocalHostId(hostId); // use the replacee's host Id as our own so we receive hints, etc - MessagingService.instance().shutdown(); Gossiper.instance.resetEndpointStateMap(); // clean up since we have what we need return tokens; } @@ -435,7 +435,6 @@ public class StorageService extends NotificationBroadcasterSupport implements IE break outer; } } - // sleep until any schema migrations have finished while (!MigrationManager.isReadyForBootstrap()) { @@ -464,7 +463,8 @@ public class StorageService extends NotificationBroadcasterSupport implements IE Gossiper.instance.start((int) (System.currentTimeMillis() / 1000)); // needed for node-ring gathering. Gossiper.instance.addLocalApplicationState(ApplicationState.NET_VERSION, valueFactory.networkVersion()); - MessagingService.instance().listen(FBUtilities.getLocalAddress()); + if (!MessagingService.instance().isListening()) + MessagingService.instance().listen(FBUtilities.getLocalAddress()); try { Thread.sleep(ringDelay); @@ -631,7 +631,8 @@ public class StorageService extends NotificationBroadcasterSupport implements IE Schema.instance.updateVersionAndAnnounce(); // Ensure we know our own actual Schema UUID in preparation for updates - MessagingService.instance().listen(FBUtilities.getLocalAddress()); + if (!MessagingService.instance().isListening()) + MessagingService.instance().listen(FBUtilities.getLocalAddress()); LoadBroadcaster.instance.startBroadcasting(); HintedHandOffManager.instance.start();