Use cloned TokenMetadata in size estimates to avoid race against membership check
patch by Joel Knighton; reviewed by Branimir Lambov for CASSANDRA-10736 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1b201e95 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1b201e95 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1b201e95 Branch: refs/heads/trunk Commit: 1b201e959a6f77aeedd2549ed523200021d8c6e6 Parents: d5c83f4 Author: Joel Knighton <joel.knigh...@datastax.com> Authored: Tue Dec 29 14:59:57 2015 -0600 Committer: Aleksey Yeschenko <alek...@apache.org> Committed: Fri Feb 12 17:28:18 2016 +0000 ---------------------------------------------------------------------- CHANGES.txt | 5 ++++- src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/1b201e95/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index fa25980..49bc581 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,10 +1,13 @@ 2.2.6 + * Use cloned TokenMetadata in size estimates to avoid race against membership check + (CASSANDRA-10736) * Always persist upsampled index summaries (CASSANDRA-10512) * (cqlsh) Fix inconsistent auto-complete (CASSANDRA-10733) * Make SELECT JSON and toJson() threadsafe (CASSANDRA-11048) * Fix SELECT on tuple relations for mixed ASC/DESC clustering order (CASSANDRA-7281) * (cqlsh) Support utf-8/cp65001 encoding on Windows (CASSANDRA-11030) - * Fix paging on DISTINCT queries repeats result when first row in partition changes (CASSANDRA-10010) + * Fix paging on DISTINCT queries repeats result when first row in partition changes + (CASSANDRA-10010) Merged from 2.1: * Properly release sstable ref when doing offline scrub (CASSANDRA-10697) * Improve nodetool status performance for large cluster (CASSANDRA-7238) http://git-wip-us.apache.org/repos/asf/cassandra/blob/1b201e95/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java b/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java index c59db4b..2f14fb1 100644 --- a/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java +++ b/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java @@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.io.sstable.format.SSTableReader; +import org.apache.cassandra.locator.TokenMetadata; import org.apache.cassandra.service.MigrationListener; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.StorageService; @@ -56,7 +57,8 @@ public class SizeEstimatesRecorder extends MigrationListener implements Runnable public void run() { - if (!StorageService.instance.getTokenMetadata().isMember(FBUtilities.getBroadcastAddress())) + TokenMetadata metadata = StorageService.instance.getTokenMetadata().cloneOnlyTokenMap(); + if (!metadata.isMember(FBUtilities.getBroadcastAddress())) { logger.debug("Node is not part of the ring; not recording size estimates"); return; @@ -66,7 +68,7 @@ public class SizeEstimatesRecorder extends MigrationListener implements Runnable // find primary token ranges for the local node. Collection<Token> localTokens = StorageService.instance.getLocalTokens(); - Collection<Range<Token>> localRanges = StorageService.instance.getTokenMetadata().getPrimaryRangesFor(localTokens); + Collection<Range<Token>> localRanges = metadata.getPrimaryRangesFor(localTokens); for (Keyspace keyspace : Keyspace.nonSystem()) {