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

samt pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 27c1e56e43cafc8966878ff9c48b0e566c07e32b
Author: Marcus Eriksson <marc...@apache.org>
AuthorDate: Thu Apr 25 19:44:39 2024 +0200

    Avoid ClassCastException when verifying tables with reversed partitioner
    
    Patch by Marcus Eriksson; reviewed by Sam Tunnicliffe for
    CASSANDRA-19710
---
 CHANGES.txt                                            |  1 +
 .../cassandra/db/compaction/CompactionManager.java     |  6 ++++--
 .../io/sstable/format/SortedTableVerifier.java         |  4 +++-
 .../org/apache/cassandra/io/sstable/VerifyTest.java    | 18 ++++++++++++++++++
 4 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 221fde20cf..f37ff864fa 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.1
+ * Avoid ClassCastException when verifying tables with reversed partitioner 
(CASSANDRA-19710)
  * Always repair the full range when repairing system_cluster_metadata 
(CASSANDRA-19709)
  * Use table-specific partitioners during Paxos repair (CASSANDRA-19714)
  * Expose current compaction throughput in nodetool (CASSANDRA-13890)
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java 
b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index ee20b28c50..67b847e0ef 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -97,6 +97,7 @@ import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.MetaStrategy;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.metrics.CompactionMetrics;
 import org.apache.cassandra.metrics.TableMetrics;
@@ -636,8 +637,9 @@ public class CompactionManager implements 
CompactionManagerMBean, ICompactionMan
             logger.info("Cleanup cannot run before a node has joined the 
ring");
             return AllSSTableOpStatus.ABORTED;
         }
-        if (cfStore.keyspace.getMetadata().params.replication.isMeta())
-            return AllSSTableOpStatus.SUCCESSFUL; // todo - we probably want 
to be able to cleanup MetaStrategy keyspaces
+        if (cfStore.getPartitioner() == MetaStrategy.partitioner)
+            return AllSSTableOpStatus.SUCCESSFUL; // todo - we probably want 
to be able to cleanup MetaStrategy keyspaces. When we fix this, also fix
+                                                  //        
SortedTableVerifier to make sure system_cluster_metadata is empty for non-CMS 
instances
         final boolean hasIndexes = cfStore.indexManager.hasIndexes();
 
         // if local ranges is empty, it means no data should remain
diff --git 
a/src/java/org/apache/cassandra/io/sstable/format/SortedTableVerifier.java 
b/src/java/org/apache/cassandra/io/sstable/format/SortedTableVerifier.java
index f68e1c9684..eb6231f9e7 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/SortedTableVerifier.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/SortedTableVerifier.java
@@ -56,6 +56,7 @@ import org.apache.cassandra.io.sstable.metadata.MetadataType;
 import org.apache.cassandra.io.util.DataIntegrityMetadata;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.RandomAccessReader;
+import org.apache.cassandra.locator.MetaStrategy;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -152,7 +153,8 @@ public abstract class SortedTableVerifier<R extends 
SSTableReaderWithFilter> imp
 
         verifyBloomFilter();
 
-        if (options.checkOwnsTokens && !isOffline && !(cfs.getPartitioner() 
instanceof LocalPartitioner))
+        // TODO: when making it possible to clean up system_cluster_metadata, 
we should make sure that non-cms members don't have any sstables there
+        if (options.checkOwnsTokens && !isOffline && !(cfs.getPartitioner() 
instanceof LocalPartitioner) && !(cfs.getPartitioner() == 
MetaStrategy.partitioner))
         {
             if (verifyOwnedRanges() == 0)
                 return;
diff --git a/test/unit/org/apache/cassandra/io/sstable/VerifyTest.java 
b/test/unit/org/apache/cassandra/io/sstable/VerifyTest.java
index c4a8a07aac..5493356a2e 100644
--- a/test/unit/org/apache/cassandra/io/sstable/VerifyTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/VerifyTest.java
@@ -43,6 +43,7 @@ import org.apache.cassandra.batchlog.Batch;
 import org.apache.cassandra.batchlog.BatchlogManager;
 import org.apache.cassandra.cache.ChunkCache;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.BufferDecoratedKey;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -763,6 +764,23 @@ public class VerifyTest
         }
     }
 
+    @Test
+    public void testVerifyReversedPartitioner()
+    {
+        for (long i = 0; i < 10; i++)
+            QueryProcessor.executeInternal("insert into 
system.local_metadata_log (epoch) values (?)", i);
+        ColumnFamilyStore cfs = 
Keyspace.open("system").getColumnFamilyStore("local_metadata_log");
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
+        assertFalse(cfs.getLiveSSTables().isEmpty());
+        for (SSTableReader sstable : cfs.getLiveSSTables())
+        {
+            try (IVerifier verifier = sstable.getVerifier(cfs, new 
OutputHandler.LogOutput(), false, IVerifier.options()
+                                                                               
                               .checkOwnsTokens(true).build()))
+            {
+                verifier.verify();
+            }
+        }
+    }
 
     private DecoratedKey dk(long l)
     {


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

Reply via email to