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

bbotella pushed a commit to branch cassandra-6.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-6.0 by this push:
     new 05d93210ad Revert "Fix mixed state"
05d93210ad is described below

commit 05d93210adfacc1de44ce1dddfda3058328090ea
Author: Bernardo Botella <[email protected]>
AuthorDate: Tue Sep 29 15:42:28 2026 +0200

    Revert "Fix mixed state"
    
    This reverts commit 8b6f6cfebb72e62207ddcc672fcb06d0e42066a0.
---
 CHANGES.txt                                        |   1 -
 .../apache/cassandra/schema/SchemaKeyspace.java    |  33 ++++++-
 .../cdc/MixedCdcEnabledSchemaDisagreementTest.java | 102 ---------------------
 3 files changed, 28 insertions(+), 108 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 4fb8825eec..875fccd0c7 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,4 @@
 6.0-alpha3
- * Add node to mixed cdc_enabled cluster can cause schema disagreement 
(CASSANDRA-21618)
  * Preserve the original exception when an in-memory local response fails to 
close (CASSANDRA-21710)
  * Generate autocompletion scripts for the nodetool command during the build 
(CASSANDRA-20794)
  * Implement Zstd compression level guardrail (CASSANDRA-21021)
diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java 
b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
index e06981da26..d466f09ed5 100644
--- a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
+++ b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
@@ -35,6 +35,7 @@ import javax.annotation.concurrent.NotThreadSafe;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.MapDifference;
 import com.google.common.collect.Maps;
 
@@ -132,6 +133,12 @@ public final class SchemaKeyspace
     private static final boolean FLUSH_SCHEMA_TABLES = 
TEST_FLUSH_LOCAL_SCHEMA_CHANGES.getBoolean();
     private static final boolean IGNORE_CORRUPTED_SCHEMA_TABLES_PROPERTY_VALUE 
= IGNORE_CORRUPTED_SCHEMA_TABLES.getBoolean();
 
+    /**
+     * The tables to which we added the cdc column. This is used in {@link 
#makeUpdateForSchema} below to make sure we skip that
+     * column is cdc is disabled as the columns breaks pre-cdc to post-cdc 
upgrades (typically, 3.0 -> 3.X).
+     */
+    private static final Set<String> TABLES_WITH_CDC_ADDED = 
ImmutableSet.of(SchemaKeyspaceTables.TABLES, SchemaKeyspaceTables.VIEWS);
+
     private static final TableMetadata Keyspaces =
         parse(KEYSPACES,
               "keyspace definitions",
@@ -490,10 +497,27 @@ public final class SchemaKeyspace
 
     /**
      * Creates a PartitionUpdate from a partition containing some schema table 
content.
+     * This is mainly calling {@code PartitionUpdate.fromIterator} except for 
the fact that it deals with
+     * the problem described in #12236.
      */
     private static PartitionUpdate makeUpdateForSchema(UnfilteredRowIterator 
partition, ColumnFilter filter)
     {
-        return PartitionUpdate.fromIterator(partition, filter);
+        // This method is used during schema migration tasks, and if cdc is 
disabled, we want to force excluding the
+        // 'cdc' column from the TABLES/VIEWS schema table because it is 
problematic if received by older nodes (see #12236
+        // and #12697). Otherwise though, we just simply "buffer" the content 
of the partition into a PartitionUpdate.
+        if (DatabaseDescriptor.isCDCEnabled() || 
!TABLES_WITH_CDC_ADDED.contains(partition.metadata().name))
+            return PartitionUpdate.fromIterator(partition, filter);
+
+        // We want to skip the 'cdc' column. A simple solution for that is 
based on the fact that
+        // 'PartitionUpdate.fromIterator()' will ignore any columns that are 
marked as 'fetched' but not 'queried'.
+        ColumnFilter.Builder builder = 
ColumnFilter.allRegularColumnsBuilder(partition.metadata(), false);
+        for (ColumnMetadata column : filter.fetchedColumns())
+        {
+            if (!column.name.toString().equals("cdc"))
+                builder.add(column);
+        }
+
+        return PartitionUpdate.fromIterator(partition, builder.build());
     }
 
     private static boolean isSystemKeyspaceSchemaPartition(DecoratedKey 
partitionKey)
@@ -619,10 +643,9 @@ public final class SchemaKeyspace
                .add("read_repair", params.readRepair.toString())
                .add("extensions", params.extensions);
 
-        // Only add the cdc column if it's set, to avoid RTE in mixed 
operation.
-        // cdc_enabled is a per-node setting and must not gate
-        // whether this table's actual cdc value gets persisted - only the 
value itself matters here.
-        if (params.cdc)
+        // Only add CDC-enabled flag to schema if it's enabled on the node. 
This is to work around RTE's post-8099 if a 3.8+
+        // node sends table schema to a < 3.8 versioned node with an unknown 
column.
+        if (DatabaseDescriptor.isCDCEnabled())
             builder.add("cdc", params.cdc);
 
         // As above, only add the memtable column if the table uses a 
non-default memtable configuration to avoid RTE
diff --git 
a/test/distributed/org/apache/cassandra/distributed/test/cdc/MixedCdcEnabledSchemaDisagreementTest.java
 
b/test/distributed/org/apache/cassandra/distributed/test/cdc/MixedCdcEnabledSchemaDisagreementTest.java
deleted file mode 100644
index e71a2b9f79..0000000000
--- 
a/test/distributed/org/apache/cassandra/distributed/test/cdc/MixedCdcEnabledSchemaDisagreementTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.test.cdc;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.Cluster;
-import org.apache.cassandra.distributed.api.IInstanceConfig;
-import org.apache.cassandra.distributed.api.IInvokableInstance;
-import org.apache.cassandra.distributed.api.TokenSupplier;
-import org.apache.cassandra.distributed.shared.NetworkTopology;
-import org.apache.cassandra.distributed.test.TestBaseImpl;
-
-import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
-import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
-import static org.apache.cassandra.distributed.api.Feature.NETWORK;
-import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
-import static org.apache.cassandra.distributed.shared.AssertUtils.row;
-
-/**
- * Tests covering clusters with mixed CDC configurations
- */
-public class MixedCdcEnabledSchemaDisagreementTest extends TestBaseImpl
-{
-    /**
-     * ALTER TABLE ... WITH cdc=true, issued from a node that does have
-     * cdc_enabled=true, must be visible as cdc=true in system_schema.tables 
on every node -
-     * including ones with cdc_enabled=false.
-     */
-    @Test
-    public void testAlterTableCdcMixedClusterCausesSchemaDisagreement() throws 
Exception
-    {
-        try (Cluster cluster = init(Cluster.build(3)
-                                           .withConfig(config -> {
-                                               if (config.num() == 3)
-                                                   config.set("cdc_enabled", 
true);
-                                               config.with(NETWORK, GOSSIP);
-                                           })
-                                           .start()))
-        {
-            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (k INT 
PRIMARY KEY, v INT)"));
-
-            // node 3 is the only node with cdc_enabled=true; it's the one 
flipping cdc on.
-            cluster.get(3).schemaChangeInternal(withKeyspace("ALTER TABLE 
%s.tbl WITH cdc = true"));
-
-            for (int i = 1; i <= 3; i++)
-            {
-                Object[][] rows = cluster.get(i).executeInternal(
-                    "SELECT cdc FROM system_schema.tables WHERE keyspace_name 
= ? AND table_name = ?",
-                    KEYSPACE, "tbl");
-                assertRows(rows, row(true));
-            }
-        }
-    }
-
-    /**
-     * bootstrapping a brand-new node with cdc_enabled=false into a cluster 
that
-     * already has cdc=true tables must not leave the new node's local 
system_schema.tables
-     * disagreeing with the rest of the cluster.
-     */
-    @Test
-    public void testBootstrapNodeWithCdcDisabledCausesSchemaDisagreement() 
throws Exception
-    {
-        try (Cluster cluster = init(builder().withNodes(1)
-                                             
.withTokenSupplier(TokenSupplier.evenlyDistributedTokens(2))
-                                             
.withNodeIdTopology(NetworkTopology.singleDcNetworkTopology(2, "dc0", "rack0"))
-                                             .withConfig(config -> 
config.set("cdc_enabled", true)
-                                                                         
.with(NETWORK, GOSSIP, NATIVE_PROTOCOL))
-                                             .start()))
-        {
-            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (k INT 
PRIMARY KEY, v INT) WITH cdc=true"));
-
-            IInstanceConfig newNodeConfig = cluster.newInstanceConfig();
-            newNodeConfig.set("auto_bootstrap", true);
-            newNodeConfig.set("cdc_enabled", false);
-
-            IInvokableInstance newNode = cluster.bootstrap(newNodeConfig);
-            newNode.startup();
-
-            Object[][] rows = newNode.executeInternal(
-                "SELECT cdc FROM system_schema.tables WHERE keyspace_name = ? 
AND table_name = ?",
-                KEYSPACE, "tbl");
-            assertRows(rows, row(true));
-        }
-    }
-}


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

Reply via email to