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