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

commit 01c6daf6e7e85df7e2c65e2db032df28c86aede0
Merge: b773bc7 9af57a5
Author: Marcus Eriksson <marc...@apache.org>
AuthorDate: Wed Aug 7 10:51:23 2019 +0200

    Merge branch 'cassandra-3.0' into cassandra-3.11

 CHANGES.txt                                        |  1 +
 .../cassandra/db/compaction/CompactionManager.java | 30 +++++++++---
 test/unit/org/apache/cassandra/db/CleanupTest.java | 53 ++++++++++++++++++----
 3 files changed, 68 insertions(+), 16 deletions(-)

diff --cc CHANGES.txt
index dc8baf2,a46a327..a7cae1d
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,9 -1,5 +1,10 @@@
 -3.0.19
 +3.11.5
 + * Make sure user defined compaction transactions are always closed 
(CASSANDRA-15123)
 + * Fix cassandra-env.sh to use $CASSANDRA_CONF to find cassandra-jaas.config 
(CASSANDRA-14305)
 + * Fixed nodetool cfstats printing index name twice (CASSANDRA-14903)
 + * Add flag to disable SASI indexes, and warnings on creation 
(CASSANDRA-14866)
 +Merged from 3.0:
+  * Filter sstables earlier when running cleanup (CASSANDRA-15100)
   * Use mean row count instead of mean column count for index selectivity 
calculation (CASSANDRA-15259)
   * Avoid updating unchanged gossip states (CASSANDRA-15097)
   * Prevent recreation of previously dropped columns with a different kind 
(CASSANDRA-14948)
diff --cc src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 7086d77,694ad62..1a9da37
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@@ -466,7 -465,25 +468,25 @@@ public class CompactionManager implemen
              public Iterable<SSTableReader> 
filterSSTables(LifecycleTransaction transaction)
              {
                  List<SSTableReader> sortedSSTables = 
Lists.newArrayList(transaction.originals());
-                 Collections.sort(sortedSSTables, 
SSTableReader.sizeComparator);
+                 Iterator<SSTableReader> sstableIter = 
sortedSSTables.iterator();
+                 int totalSSTables = 0;
+                 int skippedSStables = 0;
+                 while (sstableIter.hasNext())
+                 {
+                     SSTableReader sstable = sstableIter.next();
+                     totalSSTables++;
+                     if (!needsCleanup(sstable, ranges))
+                     {
+                         logger.debug("Not cleaning up {} ([{}, {}]) - no 
tokens outside owned ranges {}",
+                                      sstable, sstable.first.getToken(), 
sstable.last.getToken(), ranges);
+                         sstableIter.remove();
+                         transaction.cancel(sstable);
+                         skippedSStables++;
+                     }
+                 }
+                 logger.info("Skipping cleanup for {}/{} sstables for {}.{} 
since they are fully contained in owned ranges ({})",
+                             skippedSStables, totalSSTables, 
cfStore.keyspace.getName(), cfStore.getTableName(), ranges);
 -                sortedSSTables.sort(new SSTableReader.SizeComparator());
++                sortedSSTables.sort(SSTableReader.sizeComparator);
                  return sortedSSTables;
              }
  
diff --cc test/unit/org/apache/cassandra/db/CleanupTest.java
index 80e9b37,d4c613d..552e6d1
--- a/test/unit/org/apache/cassandra/db/CleanupTest.java
+++ b/test/unit/org/apache/cassandra/db/CleanupTest.java
@@@ -251,34 -235,42 +252,68 @@@ public class CleanupTes
          assertTrue(cfs.getLiveSSTables().isEmpty());
      }
  
+     @Test
+     public void testCleanupSkippingSSTables() throws UnknownHostException, 
ExecutionException, InterruptedException
+     {
+         Keyspace keyspace = Keyspace.open(KEYSPACE3);
+         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD3);
+         cfs.disableAutoCompaction();
+         for (byte i = 0; i < 100; i++)
+         {
+             new RowUpdateBuilder(cfs.metadata, System.currentTimeMillis(), 
ByteBuffer.wrap(new byte[] {i}))
+                 .clustering(COLUMN)
+                 .add("val", VALUE)
+                 .build()
+                 .applyUnsafe();
+             cfs.forceBlockingFlush();
+         }
+         TokenMetadata tmd = StorageService.instance.getTokenMetadata();
+         tmd.clearUnsafe();
+         tmd.updateHostId(UUID.randomUUID(), 
InetAddress.getByName("127.0.0.1"));
+         tmd.updateNormalToken(token(new byte[] {50}), 
InetAddress.getByName("127.0.0.1"));
+         Set<SSTableReader> beforeFirstCleanup = 
Sets.newHashSet(cfs.getLiveSSTables());
+         // single token - 127.0.0.1 owns everything, cleanup should be noop
+         cfs.forceCleanup(2);
+         assertEquals(beforeFirstCleanup, cfs.getLiveSSTables());
+         tmd.updateNormalToken(token(new byte[] {120}), 
InetAddress.getByName("127.0.0.2"));
+         cfs.forceCleanup(2);
+         for (SSTableReader sstable : cfs.getLiveSSTables())
+         {
+             assertEquals(sstable.first, sstable.last); // single-token 
sstables
+             assertTrue(sstable.first.getToken().compareTo(token(new 
byte[]{50})) <= 0);
+             // with single-token sstables they should all either be skipped 
or dropped:
+             assertTrue(beforeFirstCleanup.contains(sstable));
+         }
+     }
+ 
  
      @Test
 +    public void testuserDefinedCleanupWithNewToken() throws 
ExecutionException, InterruptedException, UnknownHostException
 +    {
 +        StorageService.instance.getTokenMetadata().clearUnsafe();
 +
 +        Keyspace keyspace = Keyspace.open(KEYSPACE1);
 +        ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD1);
 +
 +        // insert data and verify we get it back w/ range query
 +        fillCF(cfs, "val", LOOPS);
 +
 +        assertEquals(LOOPS, Util.getAll(Util.cmd(cfs).build()).size());
 +        TokenMetadata tmd = StorageService.instance.getTokenMetadata();
 +
 +        byte[] tk1 = new byte[1], tk2 = new byte[1];
 +        tk1[0] = 2;
 +        tk2[0] = 1;
 +        tmd.updateNormalToken(new BytesToken(tk1), 
InetAddress.getByName("127.0.0.1"));
 +        tmd.updateNormalToken(new BytesToken(tk2), 
InetAddress.getByName("127.0.0.2"));
 +
 +        for(SSTableReader r: cfs.getLiveSSTables())
 +            
CompactionManager.instance.forceUserDefinedCleanup(r.getFilename());
 +
 +        assertEquals(0, Util.getAll(Util.cmd(cfs).build()).size());
 +    }
 +
 +    @Test
      public void testNeedsCleanup() throws Exception
      {
          // setup


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to