From 8aa71cea524824541e5c9247a71d969d2950873a Mon Sep 17 00:00:00 2001 From: Cameron Zemek Date: Fri, 5 Jun 2026 11:28:52 +1000 Subject: [PATCH] Remove inFlightEcho entry on ECHO_REQ failure patch by Cameron Zemek; reviewed by Stefan Miklosovic, Caleb Rackliffe for CASSANDRA-21428 --- CHANGES.txt | 1 + .../org/apache/cassandra/gms/Gossiper.java | 31 +++++++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 274e2dcecf..e762fb3ec7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.0.21 + * Remove inFlightEcho entry on ECHO_REQ failure (CASSANDRA-21428) * Validate snapshot names (CASSANDRA-21389) * BTree.FastBuilder.reset() fails to clear savedBuffer and savedNextKey, causing ClassCastException and SSTable header corruption during schema disagreement (CASSANDRA-21216, CASSANDRA-21260) * Backport CASSANDRA-17810 fix and improve RTBoundValidator error messages (CASSANDRA-18282) diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index 867bcbbca7..15fae78f90 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -58,6 +58,7 @@ import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.exceptions.RequestFailureReason; import org.apache.cassandra.net.RequestCallback; import org.apache.cassandra.net.Message; import org.apache.cassandra.net.MessagingService; @@ -633,6 +634,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean private void evictFromMembership(InetAddressAndPort endpoint) { checkProperThreadForStateMutation(); + inflightEcho.remove(endpoint); unreachableEndpoints.remove(endpoint); endpointStateMap.remove(endpoint); expireTimeEndpointMap.remove(endpoint); @@ -1339,13 +1341,30 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean { Message echoMessage = Message.out(ECHO_REQ, noPayload); logger.trace("Sending ECHO_REQ to {}", addr); - RequestCallback echoHandler = msg -> + RequestCallback echoHandler = new RequestCallback() { - runInGossipStageBlocking(() -> { - EndpointState epState = inflightEcho.remove(addr); - if (epState != null) - realMarkAlive(addr, epState); - }); + @Override + public void onResponse(Message msg) + { + runInGossipStageBlocking(() -> { + EndpointState epState = inflightEcho.remove(addr); + if (epState != null) + realMarkAlive(addr, epState); + }); + } + + @Override + public boolean invokeOnFailure() + { + return true; + } + + @Override + public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason) + { + logger.trace("ECHO_REQ to {} failed ({})", addr, failureReason); + inflightEcho.remove(addr); + } }; MessagingService.instance().sendWithCallback(echoMessage, addr, echoHandler); }