Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 0C432200B17 for ; Tue, 21 Jun 2016 18:14:40 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 0AE6E160A4F; Tue, 21 Jun 2016 16:14:40 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 2AF83160A07 for ; Tue, 21 Jun 2016 18:14:39 +0200 (CEST) Received: (qmail 21513 invoked by uid 500); 21 Jun 2016 16:14:38 -0000 Mailing-List: contact commits-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cassandra.apache.org Delivered-To: mailing list commits@cassandra.apache.org Received: (qmail 21493 invoked by uid 99); 21 Jun 2016 16:14:38 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 Jun 2016 16:14:38 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 1483FE020A; Tue, 21 Jun 2016 16:14:38 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: tylerhobbs@apache.org To: commits@cassandra.apache.org Message-Id: <685336fd0f3843bc985a400c457b300e@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: cassandra git commit: Validate bloom_filter_fp_chance during table creation Date: Tue, 21 Jun 2016 16:14:38 +0000 (UTC) archived-at: Tue, 21 Jun 2016 16:14:40 -0000 Repository: cassandra Updated Branches: refs/heads/cassandra-2.2 5a096274d -> 9e85e85bf Validate bloom_filter_fp_chance during table creation Patch by Arinadm Gupta; reviewed by Tyler Hobbs for CASSANDRA-11920 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9e85e85b Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9e85e85b Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9e85e85b Branch: refs/heads/cassandra-2.2 Commit: 9e85e85bf259cc7839226a7c93475505d262946a Parents: 5a09627 Author: Arindam Gupta Authored: Fri Jun 17 16:06:22 2016 -0500 Committer: Tyler Hobbs Committed: Tue Jun 21 11:12:15 2016 -0500 ---------------------------------------------------------------------- CHANGES.txt | 5 +- .../cassandra/cql3/statements/CFPropDefs.java | 13 ++++- .../cassandra/utils/BloomCalculations.java | 15 +++++- .../schema/CreateTableValidationTest.java | 51 ++++++++++++++++++++ 4 files changed, 78 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/9e85e85b/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index fe4728d..36009c5 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,6 @@ -<<<<<<< HEAD 2.2.7 + * Validate bloom_filter_fp_chance against lowest supported + value when the table is created (CASSANDRA-11920) * RandomAccessReader: call isEOF() only when rebuffering, not for every read operation (CASSANDRA-12013) * Don't send erroneous NEW_NODE notifications on restart (CASSANDRA-11038) * StorageService shutdown hook should use a volatile variable (CASSANDRA-11984) @@ -28,10 +29,8 @@ * Always close cluster with connection in CqlRecordWriter (CASSANDRA-11553) * Fix slice queries on ordered COMPACT tables (CASSANDRA-10988) Merged from 2.1: -======= 2.1.15 * Remove distinction between non-existing static columns and existing but null in LWTs (CASSANDRA-9842) ->>>>>>> asf/cassandra-2.1 * Support mlockall on IBM POWER arch (CASSANDRA-11576) * Cache local ranges when calculating repair neighbors (CASSANDRA-11933) * Allow LWT operation on static column with only partition keys (CASSANDRA-10532) http://git-wip-us.apache.org/repos/asf/cassandra/blob/9e85e85b/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java b/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java index d897cb7..c02e78e 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java +++ b/src/java/org/apache/cassandra/cql3/statements/CFPropDefs.java @@ -26,6 +26,7 @@ import org.apache.cassandra.db.compaction.AbstractCompactionStrategy; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.io.compress.CompressionParameters; +import org.apache.cassandra.utils.BloomCalculations; public class CFPropDefs extends PropertyDefinitions { @@ -211,7 +212,17 @@ public class CFPropDefs extends PropertyDefinitions cfm.compactionStrategyOptions(new HashMap<>(getCompactionOptions())); } - cfm.bloomFilterFpChance(getDouble(KW_BF_FP_CHANCE, cfm.getBloomFilterFpChance())); + double bloomFilterFpChance = getDouble(KW_BF_FP_CHANCE, cfm.getBloomFilterFpChance()); + double minBloomFilterFpChanceValue = BloomCalculations.minSupportedBloomFilterFpChance(); + if (bloomFilterFpChance <= minBloomFilterFpChanceValue || bloomFilterFpChance > 1) + { + throw new ConfigurationException(String.format( + "%s must be larger than %s and less than or equal to 1.0 (got %s)", + KW_BF_FP_CHANCE, + minBloomFilterFpChanceValue, + bloomFilterFpChance)); + } + cfm.bloomFilterFpChance(bloomFilterFpChance); if (!getCompressionOptions().isEmpty()) cfm.compressionParameters(CompressionParameters.create(getCompressionOptions())); http://git-wip-us.apache.org/repos/asf/cassandra/blob/9e85e85b/src/java/org/apache/cassandra/utils/BloomCalculations.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/BloomCalculations.java b/src/java/org/apache/cassandra/utils/BloomCalculations.java index b73f531..7ba5452 100644 --- a/src/java/org/apache/cassandra/utils/BloomCalculations.java +++ b/src/java/org/apache/cassandra/utils/BloomCalculations.java @@ -26,8 +26,8 @@ package org.apache.cassandra.utils; * Filter class by helping to choose correct values of 'bits per element' and * 'number of hash functions, k'. */ -class BloomCalculations { - +public class BloomCalculations +{ private static final int minBuckets = 2; private static final int minK = 1; @@ -182,4 +182,15 @@ class BloomCalculations { } return Math.min(BloomCalculations.probs.length - 1, (int)v); } + + /** + * Retrieves the minimum supported BloomFilterFpChance value + * @return Minimum supported value for BloomFilterFpChance + */ + public static double minSupportedBloomFilterFpChance() + { + int maxBuckets = probs.length - 1; + int maxK = probs[maxBuckets].length - 1; + return probs[maxBuckets][maxK]; + } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/9e85e85b/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java b/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java new file mode 100644 index 0000000..9708552 --- /dev/null +++ b/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cassandra.schema; + +import org.apache.cassandra.cql3.CQLTester; +import org.apache.cassandra.exceptions.ConfigurationException; +import org.junit.Test; + +import static org.junit.Assert.fail; + +public class CreateTableValidationTest extends CQLTester +{ + private static final String KEYSPACE1 = "CreateTableValidationTest"; + + @Test + public void testInvalidBloomFilterFPRatio() throws Throwable + { + try + { + createTableMayThrow("CREATE TABLE %s (a int PRIMARY KEY, b int) WITH bloom_filter_fp_chance = 0.0000001"); + fail("Expected an fp chance of 0.0000001 to be rejected"); + } + catch (ConfigurationException exc) { } + + try + { + createTableMayThrow("CREATE TABLE %s (a int PRIMARY KEY, b int) WITH bloom_filter_fp_chance = 1.1"); + fail("Expected an fp chance of 1.1 to be rejected"); + } + catch (ConfigurationException exc) { } + + // sanity check + createTable("CREATE TABLE %s (a int PRIMARY KEY, b int) WITH bloom_filter_fp_chance = 0.1"); + } +}