You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2012/12/19 14:09:37 UTC
[3/3] git commit: fix specifying and altering crc_check_chance;
patch by Marcus Eriksson and Aleksey Yeschenko, reviewed by Aleksey
Yeschenko for CASSANDRA-5053
fix specifying and altering crc_check_chance;
patch by Marcus Eriksson and Aleksey Yeschenko, reviewed by Aleksey
Yeschenko for CASSANDRA-5053
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1a66ee9a
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1a66ee9a
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1a66ee9a
Branch: refs/heads/cassandra-1.2
Commit: 1a66ee9a94d67ae475ae287b280517aa9e3cc318
Parents: e792187
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Wed Dec 19 14:54:46 2012 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Wed Dec 19 14:54:46 2012 +0300
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/db/ColumnFamilyStore.java | 7 ++
.../cassandra/db/ColumnFamilyStoreMBean.java | 5 +
.../io/compress/CompressedRandomAccessReader.java | 2 +-
.../io/compress/CompressionParameters.java | 62 ++++++++++++--
5 files changed, 67 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a66ee9a/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index cc75791..38d9d47 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
1.1.9
* fix multithreaded compaction deadlock (CASSANDRA-4492)
+ * fix specifying and altering crc_check_chance (CASSANDRA-5053)
1.1.8
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a66ee9a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 67a883d..8284d38 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -201,6 +201,13 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
metadata.compressionParameters = CompressionParameters.create(opts);
}
+ public void setCrcCheckChance(double crcCheckChance) throws ConfigurationException
+ {
+ for (SSTableReader sstable : table.getAllSSTables())
+ if (sstable.compression)
+ sstable.getCompressionMetadata().parameters.setCrcCheckChance(crcCheckChance);
+ }
+
private ColumnFamilyStore(Table table,
String columnFamilyName,
IPartitioner partitioner,
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a66ee9a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
index 1d9959e..26da8be 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
@@ -215,6 +215,11 @@ public interface ColumnFamilyStoreMBean
public void setCompressionParameters(Map<String,String> opts) throws ConfigurationException;
/**
+ * Set new crc check chance
+ */
+ public void setCrcCheckChance(double crcCheckChance) throws ConfigurationException;
+
+ /**
* Disable automatic compaction.
*/
public void disableAutoCompaction();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a66ee9a/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java b/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java
index 5403120..3d3b95b 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressedRandomAccessReader.java
@@ -90,7 +90,7 @@ public class CompressedRandomAccessReader extends RandomAccessReader
validBufferBytes = metadata.compressor().uncompress(compressed, 0, chunk.length, buffer, 0);
- if (metadata.parameters.crcChance > FBUtilities.threadLocalRandom().nextDouble())
+ if (metadata.parameters.getCrcCheckChance() > FBUtilities.threadLocalRandom().nextDouble())
{
checksum.update(buffer, 0, validBufferBytes);
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a66ee9a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java b/src/java/org/apache/cassandra/io/compress/CompressionParameters.java
index 9be71f6..05cc707 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressionParameters.java
@@ -23,16 +23,22 @@ import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.AbstractSet;
import java.util.Set;
-import org.apache.avro.util.Utf8;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.apache.cassandra.config.ConfigurationException;
public class CompressionParameters
{
+ private static final Logger logger = LoggerFactory.getLogger(CompressionParameters.class);
+
public final static int DEFAULT_CHUNK_LENGTH = 65536;
public final static double DEFAULT_CRC_CHECK_CHANCE = 1.0;
@@ -40,9 +46,11 @@ public class CompressionParameters
public static final String CHUNK_LENGTH_KB = "chunk_length_kb";
public static final String CRC_CHECK_CHANCE = "crc_check_chance";
+ public static final Set<String> GLOBAL_OPTIONS = ImmutableSet.of(CRC_CHECK_CHANCE);
+
public final ICompressor sstableCompressor;
private final Integer chunkLength;
- public final double crcChance;
+ private volatile double crcCheckChance;
public final Map<String, String> otherOptions; // Unrecognized options, can be use by the compressor
public static CompressionParameters create(Map<? extends CharSequence, ? extends CharSequence> opts) throws ConfigurationException
@@ -64,16 +72,53 @@ public class CompressionParameters
public CompressionParameters(ICompressor sstableCompressor)
{
- this(sstableCompressor, null, Collections.<String, String>emptyMap());
+ // can't try/catch as first statement in the constructor, thus repeating constructor code here.
+ this.sstableCompressor = sstableCompressor;
+ chunkLength = null;
+ otherOptions = Collections.emptyMap();
+ crcCheckChance = DEFAULT_CRC_CHECK_CHANCE;
}
- public CompressionParameters(ICompressor sstableCompressor, Integer chunkLength, Map<String, String> otherOptions)
+ public CompressionParameters(ICompressor sstableCompressor, Integer chunkLength, Map<String, String> otherOptions) throws ConfigurationException
{
this.sstableCompressor = sstableCompressor;
this.chunkLength = chunkLength;
this.otherOptions = otherOptions;
- String chance = otherOptions.get(CRC_CHECK_CHANCE);
- this.crcChance = (chance == null) ? DEFAULT_CRC_CHECK_CHANCE : Double.parseDouble(chance);
+ this.crcCheckChance = otherOptions.get(CRC_CHECK_CHANCE) == null
+ ? DEFAULT_CRC_CHECK_CHANCE
+ : parseCrcCheckChance(otherOptions.get(CRC_CHECK_CHANCE));
+ }
+
+ public void setCrcCheckChance(double crcCheckChance) throws ConfigurationException
+ {
+ validateCrcCheckChance(crcCheckChance);
+ logger.debug("Setting crcCheckChance to {}", crcCheckChance);
+ this.crcCheckChance = crcCheckChance;
+ }
+
+ public double getCrcCheckChance()
+ {
+ return this.crcCheckChance;
+ }
+
+ private static double parseCrcCheckChance(String crcCheckChance) throws ConfigurationException
+ {
+ try
+ {
+ double chance = Double.parseDouble(crcCheckChance);
+ validateCrcCheckChance(chance);
+ return chance;
+ }
+ catch (NumberFormatException e)
+ {
+ throw new ConfigurationException("crc_check_chance should be a double");
+ }
+ }
+
+ private static void validateCrcCheckChance(double crcCheckChance) throws ConfigurationException
+ {
+ if (crcCheckChance < 0.0d || crcCheckChance > 1.0d)
+ throw new ConfigurationException("crc_check_chance should be between 0.0 and 1.0");
}
public int chunkLength()
@@ -111,7 +156,7 @@ public class CompressionParameters
Method method = compressorClass.getMethod("create", Map.class);
ICompressor compressor = (ICompressor)method.invoke(null, compressionOptions);
// Check for unknown options
- Set<String> supportedOpts = compressor.supportedOptions();
+ AbstractSet<String> supportedOpts = Sets.union(compressor.supportedOptions(), GLOBAL_OPTIONS);
for (String provided : compressionOptions.keySet())
if (!supportedOpts.contains(provided))
throw new ConfigurationException("Unknown compression options " + provided);
@@ -203,8 +248,7 @@ public class CompressionParameters
}
}
- if (crcChance > 1.0d || crcChance < 0.0d)
- throw new ConfigurationException("crc_check_chance should be between 0.0 to 1.0");
+ validateCrcCheckChance(crcCheckChance);
}
public Map<String, String> asThriftOptions()