Repository: cassandra
Updated Branches:
  refs/heads/trunk 587c67e3b -> 17a358c2c


Add more testing of uncompressed chunks (CASSANDRA-10520), fix problem with 
min_compress_ratio: 1 and disallow ratio < 1

patch by Branimir Lambov; reviewed by Dimitar Dimitrov for CASSANDRA-13703


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

Branch: refs/heads/trunk
Commit: 17a358c2cc2c583c3e0fa046ca8dee6d743ad1c5
Parents: 587c67e
Author: Branimir Lambov <branimir.lam...@datastax.com>
Authored: Thu Jul 20 18:07:49 2017 +0300
Committer: Branimir Lambov <branimir.lam...@datastax.com>
Committed: Fri Sep 15 11:14:18 2017 +0300

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../io/compress/CompressedSequentialWriter.java |  4 ++--
 .../io/util/CompressedChunkReader.java          | 13 ++++++------
 .../cassandra/schema/CompressionParams.java     | 21 +++++++++++++++++---
 .../cql3/validation/operations/AlterTest.java   | 12 +++++++++++
 .../cql3/validation/operations/CreateTest.java  | 12 ++++++++++-
 6 files changed, 50 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/17a358c2/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index fbd08e5..afd1c7f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0
+ * Fix problem with min_compress_ratio: 1 and disallow ratio < 1 
(CASSANDRA-13703)
  * Add extra information to SASI timeout exception (CASSANDRA-13677)
  * Add incremental repair support for --hosts, --force, and subrange repair 
(CASSANDRA-13818)
  * Rework CompactionStrategyManager.getScanners synchronization 
(CASSANDRA-13786)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/17a358c2/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 b4ea61f..8955d4f 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
@@ -151,7 +151,7 @@ public class CompressedSequentialWriter extends 
SequentialWriter
         int compressedLength = compressed.position();
         uncompressedSize += buffer.position();
         ByteBuffer toWrite = compressed;
-        if (compressedLength > maxCompressedLength)
+        if (compressedLength >= maxCompressedLength)
         {
             toWrite = buffer;
             compressedLength = buffer.position();
@@ -240,7 +240,7 @@ public class CompressedSequentialWriter extends 
SequentialWriter
                 // Repopulate buffer from compressed data
                 buffer.clear();
                 compressed.flip();
-                if (chunkSize <= maxCompressedLength)
+                if (chunkSize < maxCompressedLength)
                     compressor.uncompress(compressed, buffer);
                 else
                     buffer.put(compressed);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/17a358c2/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java 
b/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java
index 15f9fa0..5ae083b 100644
--- a/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java
+++ b/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java
@@ -20,7 +20,6 @@ package org.apache.cassandra.io.util;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.concurrent.ThreadLocalRandom;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
@@ -50,9 +49,9 @@ public abstract class CompressedChunkReader extends 
AbstractReaderFileProxy impl
         return metadata.parameters.getCrcCheckChance();
     }
 
-    public boolean maybeCheckCrc()
+    boolean shouldCheckCrc()
     {
-        return metadata.parameters.maybeCheckCrc();
+        return metadata.parameters.shouldCheckCrc();
     }
 
     @Override
@@ -116,7 +115,7 @@ public abstract class CompressedChunkReader extends 
AbstractReaderFileProxy impl
                 assert position <= fileLength;
 
                 CompressionMetadata.Chunk chunk = metadata.chunkFor(position);
-                if (chunk.length <= maxCompressedLength)
+                if (chunk.length < maxCompressedLength)
                 {
                     ByteBuffer compressed = compressedHolder.get();
                     assert compressed.capacity() >= chunk.length;
@@ -156,7 +155,7 @@ public abstract class CompressedChunkReader extends 
AbstractReaderFileProxy impl
 
         void maybeCheckCrc(CompressionMetadata.Chunk chunk, ByteBuffer 
content) throws CorruptBlockException
         {
-            if (metadata.parameters.maybeCheckCrc())
+            if (shouldCheckCrc())
             {
                 content.flip();
                 int checksum = (int) ChecksumType.CRC32.of(content);
@@ -202,7 +201,7 @@ public abstract class CompressedChunkReader extends 
AbstractReaderFileProxy impl
 
                 try
                 {
-                    if (chunk.length <= maxCompressedLength)
+                    if (chunk.length < maxCompressedLength)
                         metadata.compressor().uncompress(compressedChunk, 
uncompressed);
                     else
                         uncompressed.put(compressedChunk);
@@ -213,7 +212,7 @@ public abstract class CompressedChunkReader extends 
AbstractReaderFileProxy impl
                 }
                 uncompressed.flip();
 
-                if (maybeCheckCrc())
+                if (shouldCheckCrc())
                 {
                     compressedChunk.position(chunkOffset).limit(chunkOffset + 
chunk.length);
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/17a358c2/src/java/org/apache/cassandra/schema/CompressionParams.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/schema/CompressionParams.java 
b/src/java/org/apache/cassandra/schema/CompressionParams.java
index c4b52df..2d60d13 100644
--- a/src/java/org/apache/cassandra/schema/CompressionParams.java
+++ b/src/java/org/apache/cassandra/schema/CompressionParams.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ThreadLocalRandom;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.commons.lang3.builder.EqualsBuilder;
@@ -125,41 +126,52 @@ public final class CompressionParams
         return new CompressionParams((ICompressor) null, DEFAULT_CHUNK_LENGTH, 
Integer.MAX_VALUE, 0.0, Collections.emptyMap());
     }
 
+    // The shorthand methods below are only used for tests. They are a little 
inconsistent in their choice of
+    // parameters -- this is done on purpose to test out various compression 
parameter combinations.
+
+    @VisibleForTesting
     public static CompressionParams snappy()
     {
         return snappy(DEFAULT_CHUNK_LENGTH);
     }
 
+    @VisibleForTesting
     public static CompressionParams snappy(int chunkLength)
     {
-        return snappy(chunkLength, DEFAULT_MIN_COMPRESS_RATIO);
+        return snappy(chunkLength, 1.1);
     }
 
+    @VisibleForTesting
     public static CompressionParams snappy(int chunkLength, double 
minCompressRatio)
     {
         return new CompressionParams(SnappyCompressor.instance, chunkLength, 
calcMaxCompressedLength(chunkLength, minCompressRatio), minCompressRatio, 
Collections.emptyMap());
     }
 
+    @VisibleForTesting
     public static CompressionParams deflate()
     {
         return deflate(DEFAULT_CHUNK_LENGTH);
     }
 
+    @VisibleForTesting
     public static CompressionParams deflate(int chunkLength)
     {
         return new CompressionParams(DeflateCompressor.instance, chunkLength, 
Integer.MAX_VALUE, 0.0, Collections.emptyMap());
     }
 
+    @VisibleForTesting
     public static CompressionParams lz4()
     {
         return lz4(DEFAULT_CHUNK_LENGTH);
     }
 
+    @VisibleForTesting
     public static CompressionParams lz4(int chunkLength)
     {
-        return lz4(chunkLength, Integer.MAX_VALUE);
+        return lz4(chunkLength, chunkLength);
     }
 
+    @VisibleForTesting
     public static CompressionParams lz4(int chunkLength, int 
maxCompressedLength)
     {
         return new 
CompressionParams(LZ4Compressor.create(Collections.emptyMap()), chunkLength, 
maxCompressedLength, calcMinCompressRatio(chunkLength, maxCompressedLength), 
Collections.emptyMap());
@@ -491,6 +503,9 @@ public final class CompressionParams
 
         if (maxCompressedLength < 0)
             throw new ConfigurationException("Invalid negative " + 
MIN_COMPRESS_RATIO);
+
+        if (maxCompressedLength > chunkLength && maxCompressedLength < 
Integer.MAX_VALUE)
+            throw new ConfigurationException(MIN_COMPRESS_RATIO + " can either 
be 0 or greater than or equal to 1");
     }
 
     public Map<String, String> asMap()
@@ -522,7 +537,7 @@ public final class CompressionParams
         return crcCheckChance;
     }
 
-    public boolean maybeCheckCrc()
+    public boolean shouldCheckCrc()
     {
         double checkChance = getCrcCheckChance();
         return checkChance > 0d && checkChance > 
ThreadLocalRandom.current().nextDouble();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/17a358c2/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java
index 9cfb3c9..c6f255a 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java
@@ -376,6 +376,15 @@ public class AlterTest extends CQLTester
                            currentTable()),
                    row(map("chunk_length_in_kb", "64", "class", 
"org.apache.cassandra.io.compress.LZ4Compressor", "min_compress_ratio", 
"2.0")));
 
+        execute("ALTER TABLE %s WITH compression = { 'sstable_compression' : 
'LZ4Compressor', 'min_compress_ratio' : 1 };");
+
+        assertRows(execute(format("SELECT compression FROM %s.%s WHERE 
keyspace_name = ? and table_name = ?;",
+                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
+                                  SchemaKeyspace.TABLES),
+                           KEYSPACE,
+                           currentTable()),
+                   row(map("chunk_length_in_kb", "64", "class", 
"org.apache.cassandra.io.compress.LZ4Compressor", "min_compress_ratio", 
"1.0")));
+
         execute("ALTER TABLE %s WITH compression = { 'sstable_compression' : 
'LZ4Compressor', 'min_compress_ratio' : 0 };");
 
         assertRows(execute(format("SELECT compression FROM %s.%s WHERE 
keyspace_name = ? and table_name = ?;",
@@ -421,6 +430,9 @@ public class AlterTest extends CQLTester
 
         assertThrowsConfigurationException("Invalid negative 
min_compress_ratio",
                                            "ALTER TABLE %s WITH compression = 
{ 'class' : 'SnappyCompressor', 'min_compress_ratio' : -1 };");
+
+        assertThrowsConfigurationException("min_compress_ratio can either be 0 
or greater than or equal to 1",
+                                           "ALTER TABLE %s WITH compression = 
{ 'class' : 'SnappyCompressor', 'min_compress_ratio' : 0.5 };");
     }
 
     private void assertThrowsConfigurationException(String errorMsg, String 
alterStmt) throws Throwable

http://git-wip-us.apache.org/repos/asf/cassandra/blob/17a358c2/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
index 7eccf13..e3c66c5 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
@@ -785,7 +785,17 @@ public class CreateTest extends CQLTester
                    row(map("chunk_length_in_kb", "64", "class", 
"org.apache.cassandra.io.compress.SnappyCompressor", "min_compress_ratio", 
"2.0")));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, 
b))"
-                + " WITH compression = { 'sstable_compression' : 
'SnappyCompressor', 'min_compress_ratio' : 0 };");
+                    + " WITH compression = { 'sstable_compression' : 
'SnappyCompressor', 'min_compress_ratio' : 1 };");
+
+        assertRows(execute(format("SELECT compression FROM %s.%s WHERE 
keyspace_name = ? and table_name = ?;",
+                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
+                                  SchemaKeyspace.TABLES),
+                           KEYSPACE,
+                           currentTable()),
+                   row(map("chunk_length_in_kb", "64", "class", 
"org.apache.cassandra.io.compress.SnappyCompressor", "min_compress_ratio", 
"1.0")));
+
+        createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, 
b))"
+                    + " WITH compression = { 'sstable_compression' : 
'SnappyCompressor', 'min_compress_ratio' : 0 };");
 
         assertRows(execute(format("SELECT compression FROM %s.%s WHERE 
keyspace_name = ? and table_name = ?;",
                                   SchemaConstants.SCHEMA_KEYSPACE_NAME,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to