Repository: cassandra Updated Branches: refs/heads/cassandra-2.1 879691dd3 -> 8fc61eb5e refs/heads/trunk 2f1be5d5b -> b1a0e4e8d
Limit major sstable operations to their canonical representation patch by benedict; reviewed by yukim for CASSANDRA-8669 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/8fc61eb5 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/8fc61eb5 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/8fc61eb5 Branch: refs/heads/cassandra-2.1 Commit: 8fc61eb5e9c2079fa00faaec9b846d92dbfec43f Parents: 879691d Author: Benedict Elliott Smith <[email protected]> Authored: Wed Apr 8 12:38:22 2015 +0100 Committer: Benedict Elliott Smith <[email protected]> Committed: Wed Apr 8 12:38:22 2015 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/db/ColumnFamilyStore.java | 24 ++++++++++++-------- .../db/compaction/CompactionManager.java | 2 +- .../cassandra/db/index/SecondaryIndex.java | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/8fc61eb5/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 5cf621d..270c130 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.5 + * Limit major sstable operations to their canonical representation (CASSANDRA-8669) * cqlsh: Add tests for INSERT and UPDATE tab completion (CASSANDRA-9125) * cqlsh: quote column names when needed in COPY FROM inserts (CASSANDRA-9080) * Add generate-idea-files target to build.xml (CASSANDRA-9123) http://git-wip-us.apache.org/repos/asf/cassandra/blob/8fc61eb5/src/java/org/apache/cassandra/db/ColumnFamilyStore.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 430259e..f329a2b 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -2226,14 +2226,12 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean for (ColumnFamilyStore cfs : concatWithIndexes()) { final JSONArray filesJSONArr = new JSONArray(); - try (RefViewFragment currentView = cfs.selectAndReference(ALL_SSTABLES)) + try (RefViewFragment currentView = cfs.selectAndReference(CANONICAL_SSTABLES)) { for (SSTableReader ssTable : currentView.sstables) { - if (ssTable.openReason == SSTableReader.OpenReason.EARLY || (predicate != null && !predicate.apply(ssTable))) - { + if (predicate != null && !predicate.apply(ssTable)) continue; - } File snapshotDirectory = Directories.getSnapshotDirectory(ssTable.descriptor, snapshotName); ssTable.createLinks(snapshotDirectory.getPath()); // hard links @@ -2445,7 +2443,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public Iterable<DecoratedKey> keySamples(Range<Token> range) { - try (RefViewFragment view = selectAndReference(ALL_SSTABLES)) + try (RefViewFragment view = selectAndReference(CANONICAL_SSTABLES)) { Iterable<DecoratedKey>[] samples = new Iterable[view.sstables.size()]; int i = 0; @@ -2459,7 +2457,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long estimatedKeysForRange(Range<Token> range) { - try (RefViewFragment view = selectAndReference(ALL_SSTABLES)) + try (RefViewFragment view = selectAndReference(CANONICAL_SSTABLES)) { long count = 0; for (SSTableReader sstable : view.sstables) @@ -2929,11 +2927,19 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean fileIndexGenerator.set(0); } - public static final Function<DataTracker.View, List<SSTableReader>> ALL_SSTABLES = new Function<DataTracker.View, List<SSTableReader>>() + // returns the "canonical" version of any current sstable, i.e. if an sstable is being replaced and is only partially + // visible to reads, this sstable will be returned as its original entirety, and its replacement will not be returned + // (even if it completely replaces it) + public static final Function<DataTracker.View, List<SSTableReader>> CANONICAL_SSTABLES = new Function<DataTracker.View, List<SSTableReader>>() { public List<SSTableReader> apply(DataTracker.View view) { - return new ArrayList<>(view.sstables); + List<SSTableReader> sstables = new ArrayList<>(); + sstables.addAll(view.compacting); + for (SSTableReader sstable : view.sstables) + if (!view.compacting.contains(sstable) && sstable.openReason != SSTableReader.OpenReason.EARLY) + sstables.add(sstable); + return sstables; } }; @@ -2942,7 +2948,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public List<SSTableReader> apply(DataTracker.View view) { List<SSTableReader> sstables = new ArrayList<>(); - for (SSTableReader sstable : view.sstables) + for (SSTableReader sstable : CANONICAL_SSTABLES.apply(view)) { if (!sstable.isRepaired()) sstables.add(sstable); http://git-wip-us.apache.org/repos/asf/cassandra/blob/8fc61eb5/src/java/org/apache/cassandra/db/compaction/CompactionManager.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index b9c4553..a33e533 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -954,7 +954,7 @@ public class CompactionManager implements CompactionManagerMBean // we don't mark validating sstables as compacting in DataTracker, so we have to mark them referenced // instead so they won't be cleaned up if they do get compacted during the validation if (validator.desc.parentSessionId == null || ActiveRepairService.instance.getParentRepairSession(validator.desc.parentSessionId) == null) - sstables = cfs.selectAndReference(ColumnFamilyStore.ALL_SSTABLES).refs; + sstables = cfs.selectAndReference(ColumnFamilyStore.CANONICAL_SSTABLES).refs; else { ColumnFamilyStore.RefViewFragment refView = cfs.selectAndReference(ColumnFamilyStore.UNREPAIRED_SSTABLES); http://git-wip-us.apache.org/repos/asf/cassandra/blob/8fc61eb5/src/java/org/apache/cassandra/db/index/SecondaryIndex.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java index be100f4..3081016 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java @@ -203,7 +203,7 @@ public abstract class SecondaryIndex logger.info(String.format("Submitting index build of %s for data in %s", getIndexName(), StringUtils.join(baseCfs.getSSTables(), ", "))); - try (Refs<SSTableReader> sstables = baseCfs.selectAndReference(ColumnFamilyStore.ALL_SSTABLES).refs) + try (Refs<SSTableReader> sstables = baseCfs.selectAndReference(ColumnFamilyStore.CANONICAL_SSTABLES).refs) { SecondaryIndexBuilder builder = new SecondaryIndexBuilder(baseCfs, Collections.singleton(getIndexName()),
