Add flag to disable materialized views, and warnings on creation

Patch by Blake Eggleston; Reviewed by Aleksey Yeschenko for CASSANDRA-13959


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b8697441
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b8697441
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b8697441

Branch: refs/heads/trunk
Commit: b8697441d7a051e7ff68def6aa9cf14bd92ace9e
Parents: 8fad4cd
Author: Blake Eggleston <bdeggles...@gmail.com>
Authored: Mon Oct 9 16:40:04 2017 -0700
Committer: Blake Eggleston <bdeggles...@gmail.com>
Committed: Thu Oct 26 13:54:37 2017 -0700

----------------------------------------------------------------------
 CHANGES.txt                                         |  2 +-
 NEWS.txt                                            |  8 ++++++++
 conf/cassandra.yaml                                 |  4 ++++
 src/java/org/apache/cassandra/config/Config.java    |  3 +++
 .../apache/cassandra/config/DatabaseDescriptor.java |  5 +++++
 .../cql3/statements/CreateViewStatement.java        | 16 ++++++++++++++++
 6 files changed, 37 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b8697441/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 75f2c29..935931c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,10 +1,10 @@
 3.0.16
+ * Add flag to disable materialized views, and warnings on creation 
(CASSANDRA-13959)
  * Don't let user drop or generally break tables in system_distributed 
(CASSANDRA-13813)
  * Provide a JMX call to sync schema with local storage (CASSANDRA-13954)
  * Mishandling of cells for removed/dropped columns when reading legacy files 
(CASSANDRA-13939)
  * Deserialise sstable metadata in nodetool verify (CASSANDRA-13922)
 
-
 3.0.15
  * Improve TRUNCATE performance (CASSANDRA-13909)
  * Implement short read protection on partition boundaries (CASSANDRA-13595)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b8697441/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index 944857b..60cf77c 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -21,6 +21,14 @@ Upgrading
    - Nothing specific to this release, but please see previous upgrading 
sections,
      especially if you are upgrading from 2.2.
 
+Materialized Views
+-------------------
+   - Following a discussion regarding concerns about the design and safety of 
Materialized Views, the C* development
+     community no longer recommends them for production use, and considers 
them experimental. Warnings messages will
+     now be logged when they are created. (See 
https://www.mail-archive.com/dev@cassandra.apache.org/msg11511.html)
+   - An 'enable_materialized_views' flag has been added to cassandra.yaml to 
allow operators to prevent creation of
+     views
+
 3.0.15
 =====
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b8697441/conf/cassandra.yaml
----------------------------------------------------------------------
diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml
index d77d27a..b783090 100644
--- a/conf/cassandra.yaml
+++ b/conf/cassandra.yaml
@@ -952,6 +952,10 @@ enable_user_defined_functions: false
 # This option has no effect, if enable_user_defined_functions is false.
 enable_scripted_user_defined_functions: false
 
+# Enables materialized view creation on this node.
+# Materialized views are considered experimental and are not recommended for 
production use.
+enable_materialized_views: true
+
 # The default Windows kernel timer and scheduling resolution is 15.6ms for 
power conservation.
 # Lowering this value on Windows can provide much tighter latency and better 
throughput, however
 # some virtualized environments may see a negative performance impact from 
changing this setting

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b8697441/src/java/org/apache/cassandra/config/Config.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/Config.java 
b/src/java/org/apache/cassandra/config/Config.java
index 6a99cd3..64d41bb 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -308,6 +308,9 @@ public class Config
 
     public boolean enable_user_defined_functions = false;
     public boolean enable_scripted_user_defined_functions = false;
+
+    public boolean enable_materialized_views = true;
+
     /**
      * Optionally disable asynchronous UDF execution.
      * Disabling asynchronous UDF execution also implicitly disables the 
security-manager!

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b8697441/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java 
b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 029db89..efc71ef 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -2043,6 +2043,11 @@ public class DatabaseDescriptor
         conf.user_defined_function_warn_timeout = 
userDefinedFunctionWarnTimeout;
     }
 
+    public static boolean enableMaterializedViews()
+    {
+        return conf.enable_materialized_views;
+    }
+
     public static long getUserDefinedFunctionFailTimeout()
     {
         return conf.user_defined_function_fail_timeout;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b8697441/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
index 47304b6..778a3f4 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
@@ -23,9 +23,13 @@ import java.util.stream.Collectors;
 
 import com.google.common.collect.Iterables;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.config.ViewDefinition;
 import org.apache.cassandra.cql3.*;
@@ -49,6 +53,8 @@ import org.apache.cassandra.transport.Event;
 
 public class CreateViewStatement extends SchemaAlteringStatement
 {
+    private static final Logger logger = 
LoggerFactory.getLogger(CreateViewStatement.class);
+
     private final CFName baseName;
     private final List<RawSelector> selectClause;
     private final WhereClause whereClause;
@@ -114,6 +120,11 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
 
     public Event.SchemaChange announceMigration(QueryState queryState, boolean 
isLocalOnly) throws RequestValidationException
     {
+        if (!DatabaseDescriptor.enableMaterializedViews())
+        {
+            throw new InvalidRequestException("Materialized views are 
disabled. Enable in cassandra.yaml to use.");
+        }
+
         // We need to make sure that:
         //  - primary key includes all columns in base table's primary key
         //  - make sure that the select statement does not have anything other 
than columns
@@ -303,8 +314,13 @@ public class CreateViewStatement extends 
SchemaAlteringStatement
                                                        whereClauseText,
                                                        viewCfm);
 
+        logger.warn("Creating materialized view {} for {}.{}. " +
+                    "Materialized views are experimental and are not 
recommended for production use.",
+                    definition.viewName, cfm.ksName, cfm.cfName);
+
         try
         {
+            ClientWarn.instance.warn("Materialized views are experimental and 
are not recommended for production use.");
             MigrationManager.announceNewView(definition, isLocalOnly);
             return new Event.SchemaChange(Event.SchemaChange.Change.CREATED, 
Event.SchemaChange.Target.TABLE, keyspace(), columnFamily());
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to