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()),

Reply via email to