diff --git a/CHANGES.txt b/CHANGES.txt index d477b7fbca..246ba581de 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,6 @@ 4.1.3 Merged from 4.0: + * Remove unnecessary shuffling of GossipDigests in Gossiper#makeRandomGossipDigest (CASSANDRA-18546) Merged from 3.11: Merged from 3.0: diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index bfd25dbb05..ae213c06fd 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -305,7 +305,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean logger.trace("My heartbeat is now {}", endpointStateMap.get(FBUtilities.getBroadcastAddressAndPort()).getHeartBeatState().getHeartBeatVersion()); final List gDigests = new ArrayList<>(); - Gossiper.instance.makeRandomGossipDigest(gDigests); + Gossiper.instance.makeGossipDigest(gDigests); if (gDigests.size() > 0) { @@ -729,29 +729,29 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean } /** - * The gossip digest is built based on randomization - * rather than just looping through the collection of live endpoints. - * - * @param gDigests list of Gossip Digests. + * @param gDigests list of Gossip Digests to be filled */ - private void makeRandomGossipDigest(List gDigests) + private void makeGossipDigest(List gDigests) { EndpointState epState; - int generation = 0; - int maxVersion = 0; + int generation; + int maxVersion; // local epstate will be part of endpointStateMap - List endpoints = new ArrayList<>(endpointStateMap.keySet()); - Collections.shuffle(endpoints, random); - for (InetAddressAndPort endpoint : endpoints) + for (Entry entry : endpointStateMap.entrySet()) { - epState = endpointStateMap.get(endpoint); + epState = entry.getValue(); if (epState != null) { generation = epState.getHeartBeatState().getGeneration(); maxVersion = getMaxEndpointStateVersion(epState); } - gDigests.add(new GossipDigest(endpoint, generation, maxVersion)); + else + { + generation = 0; + maxVersion = 0; + } + gDigests.add(new GossipDigest(entry.getKey(), generation, maxVersion)); } if (logger.isTraceEnabled()) @@ -2529,7 +2529,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean } final List gDigests = new ArrayList(); - Gossiper.instance.makeRandomGossipDigest(gDigests); + Gossiper.instance.makeGossipDigest(gDigests); GossipDigestSyn digestSynMessage = new GossipDigestSyn(getClusterName(), getPartitionerName(),