This is an automated email from the ASF dual-hosted git repository. ifesdjeen pushed a commit to branch cep-15-accord in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 139f324969a564d32bd88e36a7abbc7d2bbbc8f0 Author: Marcus Eriksson <[email protected]> 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 --- .../cassandra/db/compaction/CompactionManager.java | 6 ++++-- .../io/sstable/format/SortedTableVerifier.java | 4 +++- .../org/apache/cassandra/io/sstable/VerifyTest.java | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 6899d58c60..edf6df5c99 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -99,6 +99,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.locator.Replica; import org.apache.cassandra.metrics.CompactionMetrics; @@ -628,8 +629,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: [email protected] For additional commands, e-mail: [email protected]
