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/08/12 15:50:58 UTC
[cassandra] 01/01: Make assassinate more resilient to missing tokens
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch CASSANDRA-16847
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 7f64f7d53f904a87f47afa942e5e67300325b1ae
Author: Brandon Williams <br...@apache.org>
AuthorDate: Thu Aug 12 10:48:17 2021 -0500
Make assassinate more resilient to missing tokens
---
src/java/org/apache/cassandra/gms/Gossiper.java | 8 +++++---
src/java/org/apache/cassandra/locator/TokenMetadata.java | 2 +-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 1603693..08cd106 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -658,7 +658,6 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
InetAddress endpoint = InetAddress.getByName(address);
runInGossipStageBlocking(() -> {
EndpointState epState = endpointStateMap.get(endpoint);
- Collection<Token> tokens = null;
logger.warn("Assassinating {} via gossip", endpoint);
if (epState == null)
@@ -683,6 +682,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
epState.getHeartBeatState().forceNewerGenerationUnsafe();
}
+ Collection<Token> tokens = null;
try
{
tokens = StorageService.instance.getTokenMetadata().getTokens(endpoint);
@@ -690,8 +690,10 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
catch (Throwable th)
{
JVMStabilityInspector.inspectThrowable(th);
- // TODO this is broken
- logger.warn("Unable to calculate tokens for {}. Will use a random one", address);
+ }
+ if (tokens == null || tokens.isEmpty())
+ {
+ logger.warn("Trying to assassinate an endpoint {} that does not have any tokens assigned. This should not have happened, trying to continue with a random token.", address);
tokens = Collections.singletonList(StorageService.instance.getTokenMetadata().partitioner.getRandomToken());
}
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index cdd3885..8300a39 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -559,11 +559,11 @@ public class TokenMetadata
public Collection<Token> getTokens(InetAddress endpoint)
{
assert endpoint != null;
- assert isMember(endpoint); // don't want to return nulls
lock.readLock().lock();
try
{
+ assert isMember(endpoint); // don't want to return nulls
return new ArrayList<>(tokenToEndpointMap.inverse().get(endpoint));
}
finally
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org