From 1bed2e7ff4588a5774fd0a46794209fd14997590 Mon Sep 17 00:00:00 2001 From: Jaroslaw Grabowski Date: Wed, 17 Aug 2022 16:27:02 +0200 Subject: [PATCH] STAR-1598 port CNDB-3932 (#509) If a user creates a prepared statement for a table and then enables the CDC param, the prepared statement must be invalidated. If we don't invalidate the prepared statement it'll be executed using the old TableMetadata object and take the non-CDC write path and go directly to CNDB writers instead of via Pulsar topics. --- .../cassandra/schema/TableMetadata.java | 1 + .../cassandra/schema/TableMetadataTest.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/java/org/apache/cassandra/schema/TableMetadata.java b/src/java/org/apache/cassandra/schema/TableMetadata.java index b9a59db8873a..b6862cf08742 100644 --- a/src/java/org/apache/cassandra/schema/TableMetadata.java +++ b/src/java/org/apache/cassandra/schema/TableMetadata.java @@ -557,6 +557,7 @@ boolean changeAffectsPreparedStatements(TableMetadata updated) || !regularAndStaticColumns.equals(updated.regularAndStaticColumns) || !indexes.equals(updated.indexes) || params.defaultTimeToLive != updated.params.defaultTimeToLive + || params.cdc != updated.params.cdc || params.gcGraceSeconds != updated.params.gcGraceSeconds || ( !Flag.isCQLTable(flags) && Flag.isCQLTable(updated.flags) ); } diff --git a/test/unit/org/apache/cassandra/schema/TableMetadataTest.java b/test/unit/org/apache/cassandra/schema/TableMetadataTest.java index c7d4168ce6bf..c561e2aa0945 100644 --- a/test/unit/org/apache/cassandra/schema/TableMetadataTest.java +++ b/test/unit/org/apache/cassandra/schema/TableMetadataTest.java @@ -148,4 +148,23 @@ public void testMemtableParams() assertThat(memtableParams.factory).isInstanceOf(CustomMemtableFactory.class); assertThat(memtableParams.options).isEmpty(); } + + @Test + public void testCdcParamsChangeAffectsPreparedStatements() + { + String keyspaceName = "ks1"; + String tableName = "tbl1"; + TableParams noCdcParams = TableParams.builder().cdc(false).build(); + TableParams cdcParams = TableParams.builder().cdc(true).build(); + + TableMetadata metadata = TableMetadata.builder(keyspaceName, tableName) + .addPartitionKeyColumn("key", UTF8Type.instance) + .params(noCdcParams) + .build(); + TableMetadata updated = TableMetadata.builder(keyspaceName, tableName) + .addPartitionKeyColumn("key", UTF8Type.instance) + .params(cdcParams) + .build(); + assertThat(metadata.changeAffectsPreparedStatements(updated)).isTrue(); + } }