This is an automated email from the ASF dual-hosted git repository. brandonwilliams pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push: new b1e77ba Avoid token cache invalidation for removing a non-member node b1e77ba is described below commit b1e77baa3d7cef7b417fa787e3005a999a440418 Author: Jay Zhuang <jzhu...@apache.org> AuthorDate: Fri Sep 24 15:20:35 2021 -0500 Avoid token cache invalidation for removing a non-member node Patch by Jay Zhuang; reviewed by brandonwilliams and azotcsit for CASSANDRA-15290 --- CHANGES.txt | 1 + .../apache/cassandra/locator/TokenMetadata.java | 10 ++++-- .../cassandra/locator/TokenMetadataTest.java | 42 ++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index b89bb31..b87dc1e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.1 + * Avoid token cache invalidation for removing a non-member node (CASSANDRA-15290) * Allow configuration of consistency levels on auth operations (CASSANDRA-12988) * Add number of sstables in a compaction to compactionstats output (CASSANDRA-16844) * Upgrade Caffeine to 2.9.2 (CASSANDRA-15153) diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java index ac71f07..390413a 100644 --- a/src/java/org/apache/cassandra/locator/TokenMetadata.java +++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java @@ -496,7 +496,7 @@ public class TokenMetadata try { bootstrapTokens.removeValue(endpoint); - tokenToEndpointMap.removeValue(endpoint); + topology = topology.unbuild().removeEndpoint(endpoint).build(); leavingEndpoints.remove(endpoint); if (replacementToOriginal.remove(endpoint) != null) @@ -504,8 +504,12 @@ public class TokenMetadata logger.debug("Node {} failed during replace.", endpoint); } endpointToHostIdMap.remove(endpoint); - sortedTokens = sortTokens(); - invalidateCachedRingsUnsafe(); + Collection<Token> removedTokens = tokenToEndpointMap.removeValue(endpoint); + if (removedTokens != null && !removedTokens.isEmpty()) + { + sortedTokens = sortTokens(); + invalidateCachedRingsUnsafe(); + } } finally { diff --git a/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java b/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java index 9e34b93..bb8a177 100644 --- a/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java +++ b/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java @@ -19,12 +19,15 @@ package org.apache.cassandra.locator; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.Map; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Iterators; import com.google.common.collect.Multimap; @@ -348,4 +351,43 @@ public class TokenMetadataTest assertEquals(0, tokenMetadata.getSizeOfLeavingEndpoints()); assertEquals(0, tokenMetadata.getSizeOfMovingEndpoints()); } + + + @Test + public void testRemoveEndpointTokenChange() throws Exception + { + TokenMetadata metadata = StorageService.instance.getTokenMetadata(); + metadata.clearUnsafe(); + + Collection<Token> tokens = new HashSet<>(); + tokens.add(DatabaseDescriptor.getPartitioner().getRandomToken()); + tokens.add(DatabaseDescriptor.getPartitioner().getRandomToken()); + + InetAddressAndPort ep1 = InetAddressAndPort.getByName("127.0.0.1"); + InetAddressAndPort ep2 = InetAddressAndPort.getByName("127.0.0.2"); + + Multimap<InetAddressAndPort, Token> endpointTokens = HashMultimap.create(); + for (Token token : tokens) + endpointTokens.put(ep1, token); + + endpointTokens.put(ep2, DatabaseDescriptor.getPartitioner().getRandomToken()); + + long ver = metadata.getRingVersion(); + metadata.updateNormalTokens(endpointTokens); + assertTrue(metadata.getRingVersion() > ver); + + // Remove a normal endpoint + assertTrue(metadata.isMember(ep2)); + ver = metadata.getRingVersion(); + metadata.removeEndpoint(ep2); + assertFalse(metadata.isMember(ep2)); + assertTrue(metadata.getRingVersion() > ver); + + // Remove a non-exist endpoint (e.g. proxy node is not part of token metadata) + InetAddressAndPort ep3 = InetAddressAndPort.getByName("127.0.0.3"); + assertFalse(metadata.isMember(ep3)); + ver = metadata.getRingVersion(); + metadata.removeEndpoint(ep3); + assertEquals(ver, metadata.getRingVersion()); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org