Use the correct digest file and reload sstable metadata in nodetool verify Patch by marcuse; reviewed by Ariel Weisberg for CASSANDRA-14217
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/21978bf9 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/21978bf9 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/21978bf9 Branch: refs/heads/cassandra-3.11 Commit: 21978bf9bba520c3d7e838ee6b15536d5b807ef4 Parents: 40148a1 Author: Marcus Eriksson <marc...@apache.org> Authored: Tue Feb 6 15:25:07 2018 +0100 Committer: Marcus Eriksson <marc...@apache.org> Committed: Fri Feb 9 15:05:55 2018 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/db/compaction/Verifier.java | 2 + .../io/util/DataIntegrityMetadata.java | 2 +- .../org/apache/cassandra/db/VerifyTest.java | 39 ++++++++++++++++++++ .../cassandra/io/sstable/LegacySSTableTest.java | 18 +++++++++ 5 files changed, 61 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/21978bf9/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 4e8f2ac..f42f3f4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.16 + * Use the correct digest file and reload sstable metadata in nodetool verify (CASSANDRA-14217) * Handle failure when mutating repaired status in Verifier (CASSANDRA-13933) * Close socket on error during connect on OutboundTcpConnection (CASSANDRA-9630) * Set encoding for javadoc generation (CASSANDRA-14154) http://git-wip-us.apache.org/repos/asf/cassandra/blob/21978bf9/src/java/org/apache/cassandra/db/compaction/Verifier.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/Verifier.java b/src/java/org/apache/cassandra/db/compaction/Verifier.java index 86bc377..586c754 100644 --- a/src/java/org/apache/cassandra/db/compaction/Verifier.java +++ b/src/java/org/apache/cassandra/db/compaction/Verifier.java @@ -259,6 +259,8 @@ public class Verifier implements Closeable try { sstable.descriptor.getMetadataSerializer().mutateRepairedAt(sstable.descriptor, ActiveRepairService.UNREPAIRED_SSTABLE); + sstable.reloadSSTableMetadata(); + cfs.getTracker().notifySSTableRepairedStatusChanged(Collections.singleton(sstable)); } catch(IOException ioe) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/21978bf9/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java index 0a89d74..cbf5753 100644 --- a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java +++ b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java @@ -110,7 +110,7 @@ public class DataIntegrityMetadata { this.descriptor = descriptor; checksum = descriptor.version.uncompressedChecksumType().newInstance(); - digestReader = RandomAccessReader.open(new File(descriptor.filenameFor(Component.digestFor(descriptor.version.uncompressedChecksumType())))); + digestReader = RandomAccessReader.open(new File(descriptor.filenameFor(descriptor.digestComponent))); dataReader = RandomAccessReader.open(new File(descriptor.filenameFor(Component.DATA))); try { http://git-wip-us.apache.org/repos/asf/cassandra/blob/21978bf9/test/unit/org/apache/cassandra/db/VerifyTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/VerifyTest.java b/test/unit/org/apache/cassandra/db/VerifyTest.java index fc87520..0748270 100644 --- a/test/unit/org/apache/cassandra/db/VerifyTest.java +++ b/test/unit/org/apache/cassandra/db/VerifyTest.java @@ -24,6 +24,7 @@ import org.apache.cassandra.OrderedJUnit4ClassRunner; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.UpdateBuilder; +import org.apache.cassandra.db.compaction.AbstractCompactionStrategy; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.compaction.Verifier; import org.apache.cassandra.db.marshal.UUIDType; @@ -44,9 +45,14 @@ import org.junit.runner.RunWith; import java.io.*; import java.nio.file.Files; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; import java.util.zip.CRC32; import java.util.zip.CheckedInputStream; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @RunWith(OrderedJUnit4ClassRunner.class) @@ -368,6 +374,39 @@ public class VerifyTest } } + @Test + public void testMutateRepair() throws IOException, ExecutionException, InterruptedException + { + CompactionManager.instance.disableAutoCompaction(); + Keyspace keyspace = Keyspace.open(KEYSPACE); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CORRUPT_CF2); + + fillCF(cfs, 2); + + SSTableReader sstable = cfs.getLiveSSTables().iterator().next(); + sstable.descriptor.getMetadataSerializer().mutateRepairedAt(sstable.descriptor, 1); + sstable.reloadSSTableMetadata(); + cfs.getTracker().notifySSTableRepairedStatusChanged(Collections.singleton(sstable)); + assertTrue(sstable.isRepaired()); + cfs.forceMajorCompaction(); + + sstable = cfs.getLiveSSTables().iterator().next(); + Long correctChecksum; + try (RandomAccessFile file = new RandomAccessFile(sstable.descriptor.filenameFor(sstable.descriptor.digestComponent), "rw")) + { + correctChecksum = Long.parseLong(file.readLine()); + } + writeChecksum(++correctChecksum, sstable.descriptor.filenameFor(sstable.descriptor.digestComponent)); + try (Verifier verifier = new Verifier(cfs, sstable, false)) + { + verifier.verify(false); + fail("should be corrupt"); + } + catch (CorruptSSTableException e) + {} + assertFalse(sstable.isRepaired()); + } + protected void fillCF(ColumnFamilyStore cfs, int partitionsPerSSTable) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/21978bf9/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java index f4f6e85..ede4ab6 100644 --- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java @@ -40,6 +40,7 @@ import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.UntypedResultSet; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.compaction.Verifier; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; @@ -186,6 +187,23 @@ public class LegacySSTableTest Assert.assertEquals(5000, rs.size()); } + @Test + public void verifyOldSSTables() throws Exception + { + for (String legacyVersion : legacyVersions) + { + loadLegacyTables(legacyVersion); + ColumnFamilyStore cfs = Keyspace.open("legacy_tables").getColumnFamilyStore(String.format("legacy_%s_simple", legacyVersion)); + for (SSTableReader sstable : cfs.getLiveSSTables()) + { + try (Verifier verifier = new Verifier(cfs, sstable, false)) + { + verifier.verify(true); + } + } + } + } + private void streamLegacyTables(String legacyVersion) throws Exception { for (int compact = 0; compact <= 1; compact++) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org