Updated Branches: refs/heads/trunk 47e789187 -> 152213469
Merge branch 'cassandra-1.2' into trunk Conflicts: src/java/org/apache/cassandra/cql/CFPropDefs.java src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/15221346 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/15221346 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/15221346 Branch: refs/heads/trunk Commit: 152213469cb9037d82e3e7f65d65e70b5e9bcd25 Parents: 47e7891 360d1a2 Author: Sylvain Lebresne <sylv...@datastax.com> Authored: Thu Jan 24 18:01:40 2013 +0100 Committer: Sylvain Lebresne <sylv...@datastax.com> Committed: Thu Jan 24 18:01:40 2013 +0100 ---------------------------------------------------------------------- CHANGES.txt | 2 +- NEWS.txt | 2 + .../org/apache/cassandra/config/CFMetaData.java | 35 ++++++++- src/java/org/apache/cassandra/cql/CFPropDefs.java | 6 +- .../cassandra/cql/CreateColumnFamilyStatement.java | 3 +- src/java/org/apache/cassandra/cql3/CFPropDefs.java | 7 ++ .../db/compaction/AbstractCompactionStrategy.java | 67 +++++++++++++-- .../db/compaction/LeveledCompactionStrategy.java | 39 ++++++--- .../compaction/SizeTieredCompactionStrategy.java | 61 ++++++++++++-- .../apache/cassandra/thrift/CassandraServer.java | 3 + 10 files changed, 192 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/CHANGES.txt ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/src/java/org/apache/cassandra/config/CFMetaData.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/config/CFMetaData.java index d4cac2b,c829fa3..2c62139 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@@ -17,9 -17,9 +17,10 @@@ */ package org.apache.cassandra.config; +import java.io.DataInput; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; + import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.util.*; @@@ -877,8 -829,44 +878,36 @@@ public final class CFMetaDat if (!cfm.comparator.isCompatibleWith(comparator)) throw new ConfigurationException("comparators do not match or are not compatible."); - if (cfm.subcolumnComparator == null) - { - if (subcolumnComparator != null) - throw new ConfigurationException("subcolumncomparators do not match."); - // else, it's null and we're good. - } - else if (!cfm.subcolumnComparator.isCompatibleWith(subcolumnComparator)) - throw new ConfigurationException("subcolumncomparators do not match or are note compatible."); } + public static void validateCompactionOptions(Class<? extends AbstractCompactionStrategy> strategyClass, Map<String, String> options) throws ConfigurationException + { + try + { + if (options == null) + return; + + Method validateMethod = strategyClass.getMethod("validateOptions", Map.class); + Map<String, String> unknownOptions = (Map<String, String>) validateMethod.invoke(null, options); + if (!unknownOptions.isEmpty()) + throw new ConfigurationException(String.format("Properties specified %s are not understood by %s", unknownOptions.keySet(), strategyClass.getSimpleName())); + } + catch (NoSuchMethodException e) + { + logger.warn("Compaction Strategy {} does not have a static validateOptions method. Validation ignored", strategyClass.getName()); + } + catch (InvocationTargetException e) + { + if (e.getTargetException() instanceof ConfigurationException) + throw (ConfigurationException) e.getTargetException(); + throw new ConfigurationException("Failed to validate compaction options"); + } + catch (Exception e) + { + throw new ConfigurationException("Failed to validate compaction options"); + } + } + public static Class<? extends AbstractCompactionStrategy> createCompactionStrategy(String className) throws ConfigurationException { className = className.contains(".") ? className : "org.apache.cassandra.db.compaction." + className; http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/src/java/org/apache/cassandra/cql/CFPropDefs.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql/CFPropDefs.java index 1918667,b488ecf..6bbb9ad --- a/src/java/org/apache/cassandra/cql/CFPropDefs.java +++ b/src/java/org/apache/cassandra/cql/CFPropDefs.java @@@ -175,17 -171,8 +175,19 @@@ public class CFPropDefs KW_MINCOMPACTIONTHRESHOLD, CFMetaData.DEFAULT_MIN_COMPACTION_THRESHOLD)); } - + + Integer defaultTimeToLive = getPropertyInt(KW_DEFAULT_TIME_TO_LIVE, null); + + if (defaultTimeToLive != null) + { + if (defaultTimeToLive < 0) + throw new InvalidRequestException(String.format("%s cannot be smaller than %s, (default %s)", + KW_DEFAULT_TIME_TO_LIVE, + 0, + CFMetaData.DEFAULT_DEFAULT_TIME_TO_LIVE)); + } ++ + CFMetaData.validateCompactionOptions(compactionStrategyClass, compactionStrategyOptions); } /** Map a keyword to the corresponding value */ http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/src/java/org/apache/cassandra/cql3/CFPropDefs.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/CFPropDefs.java index cbe1561,c546cfc..5d0b249 --- a/src/java/org/apache/cassandra/cql3/CFPropDefs.java +++ b/src/java/org/apache/cassandra/cql3/CFPropDefs.java @@@ -89,20 -85,16 +89,27 @@@ public class CFPropDefs extends Propert compactionStrategyClass = CFMetaData.createCompactionStrategy(strategy); compactionOptions.remove(COMPACTION_STRATEGY_CLASS_KEY); + + CFMetaData.validateCompactionOptions(compactionStrategyClass, compactionOptions); } + + Integer defaultTimeToLive = getInt(KW_DEFAULT_TIME_TO_LIVE, null); + + if (defaultTimeToLive != null) + { + if (defaultTimeToLive < 0) + throw new ConfigurationException(String.format("%s cannot be smaller than %s, (default %s)", + KW_DEFAULT_TIME_TO_LIVE, + 0, + CFMetaData.DEFAULT_DEFAULT_TIME_TO_LIVE)); + } } + public Class<? extends AbstractCompactionStrategy> getCompactionStrategy() + { + return compactionStrategyClass; + } + public Map<String, String> getCompactionOptions() throws SyntaxException { Map<String, String> compactionOptions = getMap(KW_COMPACTION); http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java index cb585d2,64ed744..74538c0 --- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java @@@ -52,12 -54,7 +54,6 @@@ public class SizeTieredCompactionStrate bucketLow = optionValue == null ? DEFAULT_BUCKET_LOW : Double.parseDouble(optionValue); optionValue = options.get(BUCKET_HIGH_KEY); bucketHigh = optionValue == null ? DEFAULT_BUCKET_HIGH : Double.parseDouble(optionValue); - if (bucketHigh <= bucketLow) - { - logger.warn("Bucket low/high marks for {} incorrect, using defaults.", cfs.name); - bucketLow = DEFAULT_BUCKET_LOW; - bucketHigh = DEFAULT_BUCKET_HIGH; - } - cfs.setCompactionThresholds(cfs.metadata.getMinCompactionThreshold(), cfs.metadata.getMaxCompactionThreshold()); } @@@ -227,6 -224,59 +223,59 @@@ return Long.MAX_VALUE; } + public static Map<String, String> validateOptions(Map<String, String> options) throws ConfigurationException + { + Map<String, String> uncheckedOptions = AbstractCompactionStrategy.validateOptions(options); + + String optionValue = options.get(MIN_SSTABLE_SIZE_KEY); + try + { + long minSSTableSize = optionValue == null ? DEFAULT_MIN_SSTABLE_SIZE : Long.parseLong(optionValue); + if (minSSTableSize < 0) + { + throw new ConfigurationException(String.format("%s must be non negative: %d", MIN_SSTABLE_SIZE_KEY, minSSTableSize)); + } + } + catch (NumberFormatException e) + { + throw new ConfigurationException(String.format("%s is not a parsable int (base10) for %s", optionValue, MIN_SSTABLE_SIZE_KEY), e); + } + + double bucketLow, bucketHigh; + optionValue = options.get(BUCKET_LOW_KEY); + try + { + bucketLow = optionValue == null ? DEFAULT_BUCKET_LOW : Double.parseDouble(optionValue); + } + catch (NumberFormatException e) + { + throw new ConfigurationException(String.format("%s is not a parsable int (base10) for %s", optionValue, DEFAULT_BUCKET_LOW), e); + } + + optionValue = options.get(BUCKET_HIGH_KEY); + try + { + bucketHigh = optionValue == null ? DEFAULT_BUCKET_HIGH : Double.parseDouble(optionValue); + } + catch (NumberFormatException e) + { + throw new ConfigurationException(String.format("%s is not a parsable int (base10) for %s", optionValue, DEFAULT_BUCKET_HIGH), e); + } + + if (bucketHigh <= bucketLow) + { - throw new ConfigurationException(String.format("BucketHigh value (%s) is less than or equal BucketLow value (%s)", bucketHigh, bucketLow)); ++ throw new ConfigurationException(String.format("Bucket high value (%s) is less than or equal bucket low value (%s)", bucketHigh, bucketLow)); + } + + uncheckedOptions.remove(MIN_SSTABLE_SIZE_KEY); + uncheckedOptions.remove(BUCKET_LOW_KEY); + uncheckedOptions.remove(BUCKET_HIGH_KEY); + uncheckedOptions.remove(CFPropDefs.KW_MINCOMPACTIONTHRESHOLD); + uncheckedOptions.remove(CFPropDefs.KW_MAXCOMPACTIONTHRESHOLD); + + return uncheckedOptions; + } + public String toString() { return String.format("SizeTieredCompactionStrategy[%s/%s]", http://git-wip-us.apache.org/repos/asf/cassandra/blob/15221346/src/java/org/apache/cassandra/thrift/CassandraServer.java ----------------------------------------------------------------------