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]