You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2012/05/23 23:16:11 UTC
[4/4] git commit: Check for unknown/invalid compression options
Check for unknown/invalid compression options
patch by slebresne; reviewed by jbellis for CASSANDRA-4266
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/820411fe
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/820411fe
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/820411fe
Branch: refs/heads/trunk
Commit: 820411fe4653697528bcbb210ca9e4171579b36f
Parents: b5f99a3
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed May 23 15:45:17 2012 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed May 23 15:45:17 2012 +0200
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/config/CFMetaData.java | 6 ++-
src/java/org/apache/cassandra/cql/CFPropDefs.java | 5 ++-
src/java/org/apache/cassandra/cql3/CFPropDefs.java | 3 +-
.../io/compress/CompressionParameters.java | 9 ++++-
.../cassandra/io/compress/DeflateCompressor.java | 7 +++
.../apache/cassandra/io/compress/ICompressor.java | 3 +
.../cassandra/io/compress/SnappyCompressor.java | 33 +++++++++++++++
8 files changed, 63 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 21570c7..bc2bf66 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -57,6 +57,7 @@
* (cql3) Correctly validate order by queries (CASSANDRA-4246)
* rename stress to cassandra-stress for saner packaging (CASSANDRA-4256)
* Fix exception on colum metadata with non-string comparator (CASSANDRA-4269)
+ * Check for unknown/invalid compression options (CASSANDRA-4266)
Merged from 1.0:
* Fix super columns bug where cache is not updated (CASSANDRA-4190)
* fix maxTimestamp to include row tombstones (CASSANDRA-4116)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java
index ce4ed76..54ef1f1 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -72,6 +72,9 @@ public final class CFMetaData
public final static Caching DEFAULT_CACHING_STRATEGY = Caching.KEYS_ONLY;
public final static Double DEFAULT_BF_FP_CHANCE = null;
+ // Note that this is the default only for user created tables
+ public final static String DEFAULT_COMPRESSOR = SnappyCompressor.isAvailable() ? SnappyCompressor.class.getCanonicalName() : null;
+
public static final CFMetaData StatusCf = newSystemMetadata(SystemTable.STATUS_CF, 0, "persistent metadata for the local node", BytesType.instance, null);
public static final CFMetaData HintsCf = newSystemMetadata(HintedHandOffManager.HINTS_CF, 1, "hinted handoff data", BytesType.instance, BytesType.instance);
@Deprecated
@@ -595,7 +598,8 @@ public final class CFMetaData
{
cf_def.setCompression_options(new HashMap<String, String>()
{{
- put(CompressionParameters.SSTABLE_COMPRESSION, SnappyCompressor.class.getCanonicalName());
+ if (DEFAULT_COMPRESSOR != null)
+ put(CompressionParameters.SSTABLE_COMPRESSION, DEFAULT_COMPRESSOR);
}});
}
if (!cf_def.isSetDclocal_read_repair_chance())
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/src/java/org/apache/cassandra/cql/CFPropDefs.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql/CFPropDefs.java b/src/java/org/apache/cassandra/cql/CFPropDefs.java
index f9033a8..7350b3f 100644
--- a/src/java/org/apache/cassandra/cql/CFPropDefs.java
+++ b/src/java/org/apache/cassandra/cql/CFPropDefs.java
@@ -63,6 +63,8 @@ public class CFPropDefs {
public static final String COMPACTION_OPTIONS_PREFIX = "compaction_strategy_options";
public static final String COMPRESSION_PARAMETERS_PREFIX = "compression_parameters";
+ private static final String DEFAULT_COMPRESSOR = SnappyCompressor.isAvailable() ? SnappyCompressor.class.getCanonicalName() : null;
+
static
{
comparators.put("ascii", "AsciiType");
@@ -111,7 +113,8 @@ public class CFPropDefs {
public final Map<String, String> compactionStrategyOptions = new HashMap<String, String>();
public final Map<String, String> compressionParameters = new HashMap<String, String>()
{{
- put(CompressionParameters.SSTABLE_COMPRESSION, SnappyCompressor.class.getCanonicalName());
+ if (CFMetaData.DEFAULT_COMPRESSOR != null)
+ put(CompressionParameters.SSTABLE_COMPRESSION, CFMetaData.DEFAULT_COMPRESSOR);
}};
public void validate() throws InvalidRequestException
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/src/java/org/apache/cassandra/cql3/CFPropDefs.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/CFPropDefs.java b/src/java/org/apache/cassandra/cql3/CFPropDefs.java
index 7072176..4fc9f5f 100644
--- a/src/java/org/apache/cassandra/cql3/CFPropDefs.java
+++ b/src/java/org/apache/cassandra/cql3/CFPropDefs.java
@@ -93,7 +93,8 @@ public class CFPropDefs
public final Map<String, String> compactionStrategyOptions = new HashMap<String, String>();
public final Map<String, String> compressionParameters = new HashMap<String, String>()
{{
- put(CompressionParameters.SSTABLE_COMPRESSION, SnappyCompressor.class.getCanonicalName());
+ if (CFMetaData.DEFAULT_COMPRESSOR != null)
+ put(CompressionParameters.SSTABLE_COMPRESSION, CFMetaData.DEFAULT_COMPRESSOR);
}};
public static AbstractType<?> parseType(String type) throws InvalidRequestException
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/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 d152eda..c8a15d7 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressionParameters.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressionParameters.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
import org.apache.avro.util.Utf8;
import org.apache.commons.lang.builder.EqualsBuilder;
@@ -104,7 +105,13 @@ public class CompressionParameters
try
{
Method method = compressorClass.getMethod("create", Map.class);
- return (ICompressor)method.invoke(null, compressionOptions);
+ ICompressor compressor = (ICompressor)method.invoke(null, compressionOptions);
+ // Check for unknown options
+ Set<String> supportedOpts = compressor.supportedOptions();
+ for (String provided : compressionOptions.keySet())
+ if (!supportedOpts.contains(provided))
+ throw new ConfigurationException("Unknown compression options " + provided);
+ return compressor;
}
catch (NoSuchMethodException e)
{
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java b/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java
index 1b4bbaf..aecdf82 100644
--- a/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java
+++ b/src/java/org/apache/cassandra/io/compress/DeflateCompressor.java
@@ -19,7 +19,9 @@
package org.apache.cassandra.io.compress;
import java.io.IOException;
+import java.util.Collections;
import java.util.Map;
+import java.util.Set;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
@@ -57,6 +59,11 @@ public class DeflateCompressor implements ICompressor
};
}
+ public Set<String> supportedOptions()
+ {
+ return Collections.emptySet();
+ }
+
public int initialCompressedBufferLength(int chunkLength)
{
return chunkLength;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/src/java/org/apache/cassandra/io/compress/ICompressor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/compress/ICompressor.java b/src/java/org/apache/cassandra/io/compress/ICompressor.java
index 2e85d4f..4b2a520 100644
--- a/src/java/org/apache/cassandra/io/compress/ICompressor.java
+++ b/src/java/org/apache/cassandra/io/compress/ICompressor.java
@@ -19,6 +19,7 @@
package org.apache.cassandra.io.compress;
import java.io.IOException;
+import java.util.Set;
public interface ICompressor
{
@@ -28,6 +29,8 @@ public interface ICompressor
public int uncompress(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset) throws IOException;
+ public Set<String> supportedOptions();
+
/**
* A simple wrapper of a byte array.
* Not all implementation allows to know what is the maximum size after
http://git-wip-us.apache.org/repos/asf/cassandra/blob/820411fe/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
index 1d36fe6..9d17492 100644
--- a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
+++ b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
@@ -19,14 +19,25 @@
package org.apache.cassandra.io.compress;
import java.io.IOException;
+import java.util.Collections;
import java.util.Map;
+import java.util.Set;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.xerial.snappy.Snappy;
public class SnappyCompressor implements ICompressor
{
public static final SnappyCompressor instance = new SnappyCompressor();
+ private static Logger logger = LoggerFactory.getLogger(SnappyCompressor.class);
+ static
+ {
+ if (!isAvailable())
+ logger.warn("Cannot initialize native Snappy library. Compression on new tables will be disabled.");
+ }
+
public static SnappyCompressor create(Map<String, String> compressionOptions)
{
// this would throw java.lang.NoClassDefFoundError if Snappy class
@@ -37,6 +48,28 @@ public class SnappyCompressor implements ICompressor
return instance;
}
+ public static boolean isAvailable()
+ {
+ try
+ {
+ create(Collections.<String, String>emptyMap());
+ return true;
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+ catch (NoClassDefFoundError e)
+ {
+ return false;
+ }
+ }
+
+ public Set<String> supportedOptions()
+ {
+ return Collections.emptySet();
+ }
+
public int initialCompressedBufferLength(int chunkLength)
{
return Snappy.maxCompressedLength(chunkLength);