Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 40148a178 -> 21978bf9b
  refs/heads/cassandra-3.11 43aa79d3c -> 6eb65e5a2
  refs/heads/trunk a4cf29fe9 -> 161c37da8


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.0
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

Reply via email to