Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.1 dcca99684 -> e4437bc18


Fix resetAndTruncate:ing CompressionMetadata

Patch by kvaster, reviewed by marcuse for CASSANDRA-6791


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/41d8a5f4
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/41d8a5f4
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/41d8a5f4

Branch: refs/heads/cassandra-2.1
Commit: 41d8a5f4861c37ff8e22344418e9277236672c1f
Parents: b3a9a44
Author: Marcus Eriksson <[email protected]>
Authored: Mon Mar 3 11:35:03 2014 +0100
Committer: Marcus Eriksson <[email protected]>
Committed: Mon Mar 3 14:21:00 2014 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../io/compress/CompressedSequentialWriter.java |  2 +-
 .../CompressedRandomAccessReaderTest.java       | 42 ++++++++++++++++++++
 3 files changed, 44 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/41d8a5f4/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 3e73f91..6de11c5 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -28,6 +28,7 @@
  * Disallow post-query re-ordering when paging (CASSANDRA-6722)
  * Fix potential paging bug with deleted columns (CASSANDRA-6748)
  * Fix NPE on BulkLoader caused by losing StreamEvent (CASSANDRA-6636)
+ * Fix truncating compression metadata (CASSANDRA-6791)
 Merged from 1.2:
  * Add CMSClassUnloadingEnabled JVM option (CASSANDRA-6541)
  * Catch memtable flush exceptions during shutdown (CASSANDRA-6735)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/41d8a5f4/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java 
b/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
index 54b990f..eef5b17 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
@@ -231,7 +231,7 @@ public class CompressedSequentialWriter extends 
SequentialWriter
 
         // truncate data and index file
         truncate(chunkOffset);
-        metadataWriter.resetAndTruncate(realMark.nextChunkIndex);
+        metadataWriter.resetAndTruncate(realMark.nextChunkIndex - 1);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/41d8a5f4/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
 
b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
index ee32a0e..3c9dfe5 100644
--- 
a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
+++ 
b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
@@ -19,11 +19,13 @@
 package org.apache.cassandra.io.compress;
 
 import java.io.*;
+import java.util.Collections;
 import java.util.Random;
 
 import org.junit.Test;
 
 import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.sstable.SSTableMetadata;
 import org.apache.cassandra.io.util.*;
@@ -48,6 +50,46 @@ public class CompressedRandomAccessReaderTest
         testResetAndTruncate(File.createTempFile("compressed", "1"), true, 10);
         testResetAndTruncate(File.createTempFile("compressed", "2"), true, 
CompressionParameters.DEFAULT_CHUNK_LENGTH);
     }
+    @Test
+    public void test6791() throws IOException, ConfigurationException
+    {
+        File f = File.createTempFile("compressed6791_", "3");
+        String filename = f.getAbsolutePath();
+        try
+        {
+
+            SSTableMetadata.Collector sstableMetadataCollector = 
SSTableMetadata.createCollector(BytesType.instance).replayPosition(null);
+            CompressedSequentialWriter writer = new 
CompressedSequentialWriter(f, filename + ".metadata", false, new 
CompressionParameters(SnappyCompressor.instance, 32, Collections.<String, 
String>emptyMap()), sstableMetadataCollector);
+
+            for (int i = 0; i < 20; i++)
+                writer.write("x".getBytes());
+
+            FileMark mark = writer.mark();
+            // write enough garbage to create new chunks:
+            for (int i = 0; i < 40; ++i)
+                writer.write("y".getBytes());
+
+            writer.resetAndTruncate(mark);
+
+            for (int i = 0; i < 20; i++)
+                writer.write("x".getBytes());
+            writer.close();
+
+            CompressedRandomAccessReader reader = 
CompressedRandomAccessReader.open(filename, new CompressionMetadata(filename + 
".metadata", f.length(), true));
+            String res = reader.readLine();
+            assertEquals(res, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+            assertEquals(40, res.length());
+        }
+        finally
+        {
+            // cleanup
+            if (f.exists())
+                f.delete();
+            File metadata = new File(filename+ ".metadata");
+                if (metadata.exists())
+                    metadata.delete();
+        }
+    }
 
     private void testResetAndTruncate(File f, boolean compressed, int 
junkSize) throws IOException
     {

Reply via email to