You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2016/09/22 01:16:14 UTC
[3/6] cassandra git commit: Fix exceptions when enabling gossip on
nodes that haven't joined the ring
Fix exceptions when enabling gossip on nodes that haven't joined the ring
Patch by Dikang Gu; reviewed by Joel Knighton for CASSANDRA-12253
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/df819ec8
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/df819ec8
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/df819ec8
Branch: refs/heads/trunk
Commit: df819ec8334c7a215f8d409804186a8106e91097
Parents: 50726e7
Author: Joel Knighton <jo...@datastax.com>
Authored: Thu Sep 15 17:11:10 2016 -0500
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Wed Sep 21 18:13:28 2016 -0700
----------------------------------------------------------------------
CHANGES.txt | 1 +
src/java/org/apache/cassandra/gms/Gossiper.java | 4 ++--
.../apache/cassandra/service/StorageService.java | 17 ++++++++++++++---
3 files changed, 17 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/df819ec8/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index ee4015e..bc9fc5b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
2.2.8
+ * Fix exceptions when enabling gossip on nodes that haven't joined the ring (CASSANDRA-12253)
* Fix authentication problem when invoking clqsh copy from a SOURCE command (CASSANDRA-12642)
* Decrement pending range calculator jobs counter in finally block
(CASSANDRA-12554)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/df819ec8/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 a8f9524..06b14c4 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -1446,7 +1446,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
public void stop()
{
EndpointState mystate = endpointStateMap.get(FBUtilities.getBroadcastAddress());
- if (mystate != null && !isSilentShutdownState(mystate))
+ if (mystate != null && !isSilentShutdownState(mystate) && StorageService.instance.isJoined())
{
logger.info("Announcing shutdown");
addLocalApplicationState(ApplicationState.STATUS, StorageService.instance.valueFactory.shutdown(true));
@@ -1456,7 +1456,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
Uninterruptibles.sleepUninterruptibly(Integer.getInteger("cassandra.shutdown_announce_in_ms", 2000), TimeUnit.MILLISECONDS);
}
else
- logger.warn("No local state or state is in silent shutdown, not announcing shutdown");
+ logger.warn("No local state, state is in silent shutdown, or node hasn't joined, not announcing shutdown");
if (scheduledGossipTask != null)
scheduledGossipTask.cancel(false);
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/df819ec8/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 9197ab1..0b6e851 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -185,6 +185,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
// true when keeping strict consistency while bootstrapping
private boolean useStrictConsistency = Boolean.parseBoolean(System.getProperty("cassandra.consistent.rangemovement", "true"));
private static final boolean allowSimultaneousMoves = Boolean.valueOf(System.getProperty("cassandra.consistent.simultaneousmoves.allow","false"));
+ private static final boolean joinRing = Boolean.parseBoolean(System.getProperty("cassandra.join_ring", "true"));
private boolean replacing;
private UUID replacingId;
@@ -292,7 +293,17 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
if (!initialized)
{
logger.warn("Starting gossip by operator request");
- setGossipTokens(getLocalTokens());
+ Collection<Token> tokens = SystemKeyspace.getSavedTokens();
+
+ boolean validTokens = tokens != null && !tokens.isEmpty();
+
+ // shouldn't be called before these are set if we intend to join the ring/are in the process of doing so
+ if (joined || joinRing)
+ assert validTokens : "Cannot start gossiping for a node intended to join without valid tokens";
+
+ if (validTokens)
+ setGossipTokens(tokens);
+
Gossiper.instance.forceNewerGeneration();
Gossiper.instance.start((int) (System.currentTimeMillis() / 1000));
initialized = true;
@@ -631,7 +642,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
logger.warn("Error loading counter cache", t);
}
- if (Boolean.parseBoolean(System.getProperty("cassandra.join_ring", "true")))
+ if (joinRing)
{
joinTokenRing(delay);
}
@@ -674,7 +685,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
{
Map<ApplicationState, VersionedValue> appStates = new EnumMap<>(ApplicationState.class);
- if (replacing && !(Boolean.parseBoolean(System.getProperty("cassandra.join_ring", "true"))))
+ if (replacing && !joinRing)
throw new ConfigurationException("Cannot set both join_ring=false and attempt to replace a node");
if (DatabaseDescriptor.getReplaceTokens().size() > 0 || DatabaseDescriptor.getReplaceNode() != null)
throw new RuntimeException("Replace method removed; use cassandra.replace_address instead");