This is an automated email from the ASF dual-hosted git repository.

mck pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new d9859d2  DROP COMPACT STORAGE should invalidate prepared statements 
still using CompactTableMetadata
d9859d2 is described below

commit d9859d231f24781b7ebf4dd93bb4584fb4bc7538
Author: Caleb Rackliffe <[email protected]>
AuthorDate: Thu Dec 17 16:27:36 2020 -0600

    DROP COMPACT STORAGE should invalidate prepared statements still using 
CompactTableMetadata
    
     patch by Caleb Rackliffe; reviewed by Alex Petrov, Mick Semb Wever for 
CASSANDRA-16361
---
 CHANGES.txt                                        |  1 +
 .../org/apache/cassandra/cql3/QueryProcessor.java  |  6 +++
 .../org/apache/cassandra/schema/TableMetadata.java |  3 +-
 .../validation/operations/CompactTableTest.java    | 54 ++++++++++++++++++++++
 4 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 59205c5..4903e43 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0-beta4
+ * DROP COMPACT STORAGE should invalidate prepared statements still using 
CompactTableMetadata (CASSANDRA-16361)
  * Update default num_tokens to 16 and 
allocate_tokens_for_local_replication_factor to 3 (CASSANDRA-13701)
  * Remove use of String.intern() (CASSANDRA-15810)
  * Fix the missing bb position in ByteBufferAccessor.getUnsignedShort 
(CASSANDRA-16249)
diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java 
b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
index 0b94ec0..c92718d 100644
--- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java
+++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
@@ -163,6 +163,12 @@ public class QueryProcessor implements QueryHandler
     }
 
     @VisibleForTesting
+    public static ConcurrentMap<String, Prepared> getInternalStatements()
+    {
+        return internalStatements;
+    }
+
+    @VisibleForTesting
     public static QueryState internalQueryState()
     {
         return new QueryState(InternalStateInstance.INSTANCE.clientState);
diff --git a/src/java/org/apache/cassandra/schema/TableMetadata.java 
b/src/java/org/apache/cassandra/schema/TableMetadata.java
index f0a5bb7..e642833 100644
--- a/src/java/org/apache/cassandra/schema/TableMetadata.java
+++ b/src/java/org/apache/cassandra/schema/TableMetadata.java
@@ -558,7 +558,8 @@ public class TableMetadata implements SchemaElement
             || !regularAndStaticColumns.equals(updated.regularAndStaticColumns)
             || !indexes.equals(updated.indexes)
             || params.defaultTimeToLive != updated.params.defaultTimeToLive
-            || params.gcGraceSeconds != updated.params.gcGraceSeconds;
+            || params.gcGraceSeconds != updated.params.gcGraceSeconds
+            || ( !Flag.isCQLTable(flags) && Flag.isCQLTable(updated.flags) );
     }
 
     /**
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java
 
b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java
index 0791842..46a7b1d 100644
--- 
a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java
@@ -18,9 +18,19 @@
 
 package org.apache.cassandra.cql3.validation.operations;
 
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import org.junit.Test;
 
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryHandler;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaChangeListener;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class CompactTableTest extends CQLTester
 {
@@ -47,6 +57,50 @@ public class CompactTableTest extends CQLTester
     }
 
     @Test
+    public void dropCompactStorageShouldInvalidatePreparedStatements() throws 
Throwable
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, v int, PRIMARY KEY (pk, 
ck)) WITH COMPACT STORAGE;");
+        execute("INSERT INTO %s (pk, ck, v) VALUES (1, 1, 1)");
+        String templateSelect = "SELECT * FROM %s WHERE pk = 1";
+        assertRows(execute(templateSelect), row(1, 1, 1));
+
+        // Verify that the prepared statement has been added to the cache 
after our first query.
+        String formattedQuery = formatQuery(templateSelect);
+        ConcurrentMap<String, QueryHandler.Prepared> original = 
QueryProcessor.getInternalStatements();
+        assertTrue(original.containsKey(formattedQuery));
+
+        // Verify that schema change listeners are told statements are 
affected with DROP COMPACT STORAGE.
+        SchemaChangeListener listener = new SchemaChangeListener()
+        {
+            public void onAlterTable(String keyspace, String table, boolean 
affectsStatements)
+            {
+                assertTrue(affectsStatements);
+            }
+        };
+
+        Schema.instance.registerListener(listener);
+
+        try
+        {
+            alterTable("ALTER TABLE %s DROP COMPACT STORAGE");
+            ConcurrentMap<String, QueryHandler.Prepared> postDrop = 
QueryProcessor.getInternalStatements();
+
+            // Verify that the prepared statement has been removed the cache 
after DROP COMPACT STORAGE.
+            assertFalse(postDrop.containsKey(formattedQuery));
+
+            // Verify that the prepared statement has been added back to the 
cache after our second query.
+            assertRows(execute(templateSelect), row(1, 1, 1));
+            ConcurrentMap<String, QueryHandler.Prepared> postQuery = 
QueryProcessor.getInternalStatements();
+            assertTrue(postQuery.containsKey(formattedQuery));
+        }
+        finally
+        {
+            // Clean up the listener so this doesn't fail other tests.
+            Schema.instance.unregisterListener(listener);
+        }
+    }
+
+    @Test
     public void compactStorageSemanticsTest() throws Throwable
     {
         createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck)) 
WITH COMPACT STORAGE");


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to