This is an automated email from the ASF dual-hosted git repository.

marcuse pushed a commit to branch cassandra-3.11
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-3.11 by this push:
     new a68a7c5  Nodetool garbagecollect should retain SSTableLevel for LCS
a68a7c5 is described below

commit a68a7c5181930053f9b513672391b45088e590c4
Author: Scott Carey <[email protected]>
AuthorDate: Mon Apr 26 15:29:38 2021 -0700

    Nodetool garbagecollect should retain SSTableLevel for LCS
    
    Patch by Scott Carey; reviewed by marcuse for CASSANDRA-16634
---
 CHANGES.txt                                        |  1 +
 .../cassandra/db/compaction/CompactionManager.java |  6 +++
 .../apache/cassandra/cql3/GcCompactionBench.java   |  4 ++
 .../apache/cassandra/cql3/GcCompactionTest.java    | 61 ++++++++++++++++++++++
 4 files changed, 72 insertions(+)

diff --git a/CHANGES.txt b/CHANGES.txt
index 899cb79..bb0309f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.11.11
+ * Nodetool garbagecollect should retain SSTableLevel for LCS (CASSANDRA-16634)
  * Ignore stale acks received in the shadow round (CASSANDRA-16588)
  * Add autocomplete and error messages for provide_overlapping_tombstones 
(CASSANDRA-16350)
  * Add StorageServiceMBean.getKeyspaceReplicationInfo(keyspaceName) 
(CASSANDRA-16447)
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java 
b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 4ad5ceb..76f6a98 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -531,6 +531,12 @@ public class CompactionManager implements 
CompactionManagerMBean
                     {
                         return new CompactionController(cfStore, toCompact, 
gcBefore, null, tombstoneOption);
                     }
+
+                    @Override
+                    protected int getLevel()
+                    {
+                        return txn.onlyOne().getSSTableLevel();
+                    }
                 };
                 task.setUserDefined(true);
                 task.setCompactionType(OperationType.GARBAGE_COLLECT);
diff --git a/test/long/org/apache/cassandra/cql3/GcCompactionBench.java 
b/test/long/org/apache/cassandra/cql3/GcCompactionBench.java
index 84c0384..203367d 100644
--- a/test/long/org/apache/cassandra/cql3/GcCompactionBench.java
+++ b/test/long/org/apache/cassandra/cql3/GcCompactionBench.java
@@ -229,6 +229,7 @@ public class GcCompactionBench extends CQLTester
         int startTombCount = countTombstoneMarkers(cfs);
         int startRowDeletions = countRowDeletions(cfs);
         int startTableCount = cfs.getLiveSSTables().size();
+        int startTableMaxLevel = 
cfs.getLiveSSTables().stream().mapToInt(SSTableReader::getSSTableLevel).max().orElseGet(()
 -> 0);
         long startSize = SSTableReader.getTotalBytes(cfs.getLiveSSTables());
         System.out.println();
 
@@ -242,6 +243,7 @@ public class GcCompactionBench extends CQLTester
         int endTombCount = countTombstoneMarkers(cfs);
         int endRowDeletions = countRowDeletions(cfs);
         int endTableCount = cfs.getLiveSSTables().size();
+        int endTableMaxLevel = 
cfs.getLiveSSTables().stream().mapToInt(SSTableReader::getSSTableLevel).max().orElseGet(()
 -> 0);
         long endSize = SSTableReader.getTotalBytes(cfs.getLiveSSTables());
 
         System.out.println(cfs.getCompactionParametersJson());
@@ -253,9 +255,11 @@ public class GcCompactionBench extends CQLTester
                 startTableCount, startSize, startRowCount, startRowDeletions, 
startTombCount));
         System.out.println(String.format("At end:   %12d tables %12d bytes 
%12d rows %12d deleted rows %12d tombstone markers",
                 endTableCount, endSize, endRowCount, endRowDeletions, 
endTombCount));
+        System.out.println(String.format("Max SSTable level before: %d and 
after %d", startTableMaxLevel, endTableMaxLevel));
 
         String hashesAfter = getHashes();
         Assert.assertEquals(hashesBefore, hashesAfter);
+        Assert.assertEquals(startTableMaxLevel, endTableMaxLevel);
     }
 
     private String getHashes() throws Throwable
diff --git a/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java 
b/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java
index 3af5dee..ee16a4d 100644
--- a/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java
+++ b/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java
@@ -36,6 +36,7 @@ import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.CompactionParams;
+import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
 import org.apache.cassandra.utils.FBUtilities;
 
 public class GcCompactionTest extends CQLTester
@@ -151,6 +152,66 @@ public class GcCompactionTest extends CQLTester
     }
 
     @Test
+    public void testGarbageCollectRetainsLCSLevel() throws Throwable
+    {
+
+      createTable("CREATE TABLE %s(" +
+                  "  key int," +
+                  "  column int," +
+                  "  data int," +
+                  "  PRIMARY KEY ((key), column)" +
+                  ") WITH compaction = { 'class' : 'LeveledCompactionStrategy' 
};");
+
+      assertEquals("LeveledCompactionStrategy", 
getCurrentColumnFamilyStore().getCompactionStrategyManager().getName());
+
+      for (int i = 0; i < KEY_COUNT; ++i)
+          for (int j = 0; j < CLUSTERING_COUNT; ++j)
+              execute("INSERT INTO %s (key, column, data) VALUES (?, ?, ?)", 
i, j, i * j + j);
+
+      ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+      cfs.disableAutoCompaction();
+      flush();
+      assertEquals(1, cfs.getLiveSSTables().size());
+      SSTableReader table = cfs.getLiveSSTables().iterator().next();
+      int gen = table.descriptor.generation;
+      assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(table));
+
+      assertEquals(0, table.getSSTableLevel()); // flush writes to L0
+
+      CompactionManager.AllSSTableOpStatus status;
+      status = CompactionManager.instance.performGarbageCollection(cfs, 
TombstoneOption.ROW, 1);
+      assertEquals(CompactionManager.AllSSTableOpStatus.SUCCESSFUL, status);
+
+      assertEquals(1, cfs.getLiveSSTables().size());
+      SSTableReader collected = cfs.getLiveSSTables().iterator().next();
+      int collectedGen = collected.descriptor.generation;
+      assertTrue(collectedGen > gen);
+      assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(collected));
+
+      assertEquals(0, collected.getSSTableLevel()); // garbagecollect should 
leave the LCS level where it was
+
+      CompactionManager.instance.performMaximal(cfs, false);
+
+      assertEquals(1, cfs.getLiveSSTables().size());
+      SSTableReader compacted = cfs.getLiveSSTables().iterator().next();
+      int compactedGen = compacted.descriptor.generation;
+      assertTrue(compactedGen > collectedGen);
+      assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(compacted));
+
+      assertEquals(1, compacted.getSSTableLevel()); // full compaction with 
LCS should move to L1
+
+      status = CompactionManager.instance.performGarbageCollection(cfs, 
TombstoneOption.ROW, 1);
+      assertEquals(CompactionManager.AllSSTableOpStatus.SUCCESSFUL, status);
+
+      assertEquals(1, cfs.getLiveSSTables().size());
+      SSTableReader collected2 = cfs.getLiveSSTables().iterator().next();
+      assertTrue(collected2.descriptor.generation > compactedGen);
+      assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(collected2));
+
+      assertEquals(1, collected2.getSSTableLevel()); // garbagecollect should 
leave the LCS level where it was
+    }
+
+    @Test
     public void testGarbageCollectOrder() throws Throwable
     {
         // partition-level deletions, 0 gc_grace

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to