You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2021/04/19 13:47:50 UTC
[cassandra] 02/07: Check for specific app states in shadow round
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 <sa...@beobal.com>
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: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org