This is an automated email from the ASF dual-hosted git repository. brandonwilliams pushed a commit to branch CASSANDRA-16588 in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit de62276f3e51509877a0e8a18308d06c7c42b35d Author: Sam Tunnicliffe <[email protected]> AuthorDate: Thu Apr 15 11:52:16 2021 +0100 Check for specific app states in shadow round --- src/java/org/apache/cassandra/gms/EndpointState.java | 5 +++++ src/java/org/apache/cassandra/gms/Gossiper.java | 17 ++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/cassandra/gms/EndpointState.java b/src/java/org/apache/cassandra/gms/EndpointState.java index 674b597..b587635 100644 --- a/src/java/org/apache/cassandra/gms/EndpointState.java +++ b/src/java/org/apache/cassandra/gms/EndpointState.java @@ -83,6 +83,11 @@ public class EndpointState return applicationState.get().get(key); } + public boolean containsApplicationState(ApplicationState key) + { + return applicationState.get().containsKey(key); + } + public Set<Map.Entry<ApplicationState, VersionedValue>> states() { return applicationState.get().entrySet(); diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index 5e6adbf..756b043 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.gms; -import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.*; @@ -1701,16 +1700,12 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean return anyNodeOn30; } - public boolean isShadowRoundStateMap(Map<InetAddress, EndpointState> epStateMap) + public boolean sufficientForStartupSafetyCheck(Map<InetAddress, EndpointState> epStateMap) { // it is possible for a previously queued ack to be sent to us when we come back up in shadow EndpointState localState = epStateMap.get(FBUtilities.getBroadcastAddress()); - if (localState != null && epStateMap.size() == 1) // response only contains our IP - { - logger.debug("Not exiting shadow round because received bogus ACK {} -> {}", FBUtilities.getBroadcastAddress(), localState); - return false; - } - return true; + // return false if response doesn't contain state necessary for safety check + return localState != null && localState.containsApplicationState(ApplicationState.HOST_ID); } protected void maybeFinishShadowRound(InetAddress respondent, boolean isInShadowRound, Map<InetAddress, EndpointState> epStateMap) @@ -1719,8 +1714,12 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean { if (!isInShadowRound) { - if (!isShadowRoundStateMap(epStateMap)) + if (!sufficientForStartupSafetyCheck(epStateMap)) + { + logger.debug("Not exiting shadow round because received ACK with insufficient states {} -> {}", + FBUtilities.getBroadcastAddress(), epStateMap.get(FBUtilities.getBroadcastAddress())); return; + } if (!seeds.contains(respondent)) logger.warn("Received an ack from {}, who isn't a seed. Ensure your seed list includes a live node. Exiting shadow round", --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
