Return-Path: X-Original-To: apmail-cassandra-commits-archive@www.apache.org Delivered-To: apmail-cassandra-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9F2FA177F6 for ; Thu, 18 Jun 2015 08:25:44 +0000 (UTC) Received: (qmail 85007 invoked by uid 500); 18 Jun 2015 08:25:44 -0000 Delivered-To: apmail-cassandra-commits-archive@cassandra.apache.org Received: (qmail 84967 invoked by uid 500); 18 Jun 2015 08:25:44 -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 84944 invoked by uid 99); 18 Jun 2015 08:25:44 -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; Thu, 18 Jun 2015 08:25:44 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 5493DE002C; Thu, 18 Jun 2015 08:25:44 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: snazy@apache.org To: commits@cassandra.apache.org Date: Thu, 18 Jun 2015 08:25:44 -0000 Message-Id: <049fb8a26ee44573801a62cf005481ae@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] cassandra git commit: Really prevent duplicate compilation on coordinator Repository: cassandra Updated Branches: refs/heads/trunk 43d21c384 -> 4938ab5bf Really prevent duplicate compilation on coordinator patch by Robert Stupp; reviewed by Tyler Hobbs for CASSANDRA-9475 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/94be12c6 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/94be12c6 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/94be12c6 Branch: refs/heads/trunk Commit: 94be12c6fdfe48f042f63c1b5985ec59f772f005 Parents: dee675f Author: Robert Stupp Authored: Thu Jun 18 10:24:37 2015 +0200 Committer: Robert Stupp Committed: Thu Jun 18 10:24:37 2015 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + src/java/org/apache/cassandra/config/Schema.java | 8 ++++---- .../org/apache/cassandra/cql3/functions/Functions.java | 13 ++----------- .../cql3/statements/CreateFunctionStatement.java | 4 +++- .../apache/cassandra/schema/LegacySchemaTables.java | 4 ++-- .../org/apache/cassandra/cql3/AggregationTest.java | 4 ++-- test/unit/org/apache/cassandra/cql3/UFTest.java | 4 ++-- 7 files changed, 16 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/94be12c6/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 3b16b6f..3671af9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.2 + * Duplicate compilation of UDFs on coordinator (CASSANDRA-9475) * Fix connection leak in CqlRecordWriter (CASSANDRA-9576) * Mlockall before opening system sstables & remove boot_without_jna option (CASSANDRA-9573) * Add functions to convert timeuuid to date or time, deprecate dateOf and unixTimestampOf (CASSANDRA-9229) http://git-wip-us.apache.org/repos/asf/cassandra/blob/94be12c6/src/java/org/apache/cassandra/config/Schema.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/Schema.java b/src/java/org/apache/cassandra/config/Schema.java index 5429f07..2678cb3 100644 --- a/src/java/org/apache/cassandra/config/Schema.java +++ b/src/java/org/apache/cassandra/config/Schema.java @@ -554,7 +554,7 @@ public class Schema { logger.info("Loading {}", udf); - Functions.addFunction(udf); + Functions.addOrReplaceFunction(udf); MigrationManager.instance.notifyCreateFunction(udf); } @@ -563,7 +563,7 @@ public class Schema { logger.info("Updating {}", udf); - Functions.replaceFunction(udf); + Functions.addOrReplaceFunction(udf); MigrationManager.instance.notifyUpdateFunction(udf); } @@ -582,7 +582,7 @@ public class Schema { logger.info("Loading {}", udf); - Functions.addFunction(udf); + Functions.addOrReplaceFunction(udf); MigrationManager.instance.notifyCreateAggregate(udf); } @@ -591,7 +591,7 @@ public class Schema { logger.info("Updating {}", udf); - Functions.replaceFunction(udf); + Functions.addOrReplaceFunction(udf); MigrationManager.instance.notifyUpdateAggregate(udf); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/94be12c6/src/java/org/apache/cassandra/cql3/functions/Functions.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/functions/Functions.java b/src/java/org/apache/cassandra/cql3/functions/Functions.java index c940787..d6a8ab0 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Functions.java +++ b/src/java/org/apache/cassandra/cql3/functions/Functions.java @@ -294,11 +294,10 @@ public abstract class Functions return sb.toString(); } - // This is *not* thread safe but is only called in SchemaTables that is synchronized. - public static void addFunction(AbstractFunction fun) + public static void addOrReplaceFunction(AbstractFunction fun) { // We shouldn't get there unless that function don't exist - assert find(fun.name(), fun.argTypes()) == null; + removeFunction(fun.name(), fun.argTypes()); declare(fun); } @@ -320,17 +319,9 @@ public abstract class Functions declared.remove(name); return; } - assert false : "Function " + name + " not declared"; } } - // Same remarks than for addFunction - public static void replaceFunction(AbstractFunction fun) - { - removeFunction(fun.name(), fun.argTypes()); - addFunction(fun); - } - public static List getReferencesTo(Function old) { List references = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/94be12c6/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java index 9e9d544..77e41ed 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateFunctionStatement.java @@ -26,7 +26,6 @@ import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.CQL3Type; import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.Operation.RawUpdate; import org.apache.cassandra.cql3.functions.*; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.exceptions.*; @@ -171,6 +170,9 @@ public final class CreateFunctionStatement extends SchemaAlteringStatement this.udFunction = UDFunction.create(functionName, argNames, argTypes, returnType, calledOnNullInput, language, body); this.replaced = old != null; + // add function to registry to prevent duplicate compilation on coordinator during migration + Functions.addOrReplaceFunction(udFunction); + MigrationManager.announceNewFunction(udFunction, isLocalOnly); return true; http://git-wip-us.apache.org/repos/asf/cassandra/blob/94be12c6/src/java/org/apache/cassandra/schema/LegacySchemaTables.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java index 9553df0..1840829 100644 --- a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java +++ b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java @@ -222,11 +222,11 @@ public class LegacySchemaTables // Will be moved away in #6717 for (UDFunction function : createFunctionsFromFunctionsPartition(readSchemaPartitionForKeyspace(FUNCTIONS, partition.key)).values()) - org.apache.cassandra.cql3.functions.Functions.addFunction(function); + org.apache.cassandra.cql3.functions.Functions.addOrReplaceFunction(function); // Will be moved away in #6717 for (UDAggregate aggregate : createAggregatesFromAggregatesPartition(readSchemaPartitionForKeyspace(AGGREGATES, partition.key)).values()) - org.apache.cassandra.cql3.functions.Functions.addFunction(aggregate); + org.apache.cassandra.cql3.functions.Functions.addOrReplaceFunction(aggregate); } return keyspaces; http://git-wip-us.apache.org/repos/asf/cassandra/blob/94be12c6/test/unit/org/apache/cassandra/cql3/AggregationTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/AggregationTest.java b/test/unit/org/apache/cassandra/cql3/AggregationTest.java index 768fdc3..4281262 100644 --- a/test/unit/org/apache/cassandra/cql3/AggregationTest.java +++ b/test/unit/org/apache/cassandra/cql3/AggregationTest.java @@ -1013,8 +1013,8 @@ public class AggregationTest extends CQLTester UDAggregate f = (UDAggregate) Functions.find(parseFunctionName(a)).get(0); - Functions.replaceFunction(UDAggregate.createBroken(f.name(), f.argTypes(), f.returnType(), - null, new InvalidRequestException("foo bar is broken"))); + Functions.addOrReplaceFunction(UDAggregate.createBroken(f.name(), f.argTypes(), f.returnType(), + null, new InvalidRequestException("foo bar is broken"))); assertInvalidThrowMessage("foo bar is broken", InvalidRequestException.class, "SELECT " + a + "(val) FROM %s"); http://git-wip-us.apache.org/repos/asf/cassandra/blob/94be12c6/test/unit/org/apache/cassandra/cql3/UFTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/UFTest.java b/test/unit/org/apache/cassandra/cql3/UFTest.java index 5a20c18..1b3326b 100644 --- a/test/unit/org/apache/cassandra/cql3/UFTest.java +++ b/test/unit/org/apache/cassandra/cql3/UFTest.java @@ -2163,8 +2163,8 @@ public class UFTest extends CQLTester UDFunction f = (UDFunction) Functions.find(parseFunctionName(fName)).get(0); - Functions.replaceFunction(UDFunction.createBrokenFunction(f.name(), f.argNames(), f.argTypes(), f.returnType(), true, - "java", f.body(), new InvalidRequestException("foo bar is broken"))); + Functions.addOrReplaceFunction(UDFunction.createBrokenFunction(f.name(), f.argNames(), f.argTypes(), f.returnType(), true, + "java", f.body(), new InvalidRequestException("foo bar is broken"))); assertInvalidThrowMessage("foo bar is broken", InvalidRequestException.class, "SELECT key, " + fName + "(dval) FROM %s");