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

bdeggleston pushed a commit to branch cep-45-mutation-tracking
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 9ad6d9b5e0988e20f18a58bef38103cefee86187
Author: Blake Eggleston <[email protected]>
AuthorDate: Thu Oct 22 09:21:51 2026 -0700

    ninja: fix startup with MT disabled
---
 .../org/apache/cassandra/db/SystemKeyspace.java    | 60 +++++++++++-----------
 .../db/compaction/TrackedCompactionManager.java    |  2 +-
 .../tracking/MutationTrackingFeatureFlagTest.java  | 24 +++++----
 3 files changed, 45 insertions(+), 41 deletions(-)

diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java 
b/src/java/org/apache/cassandra/db/SystemKeyspace.java
index 44573d0696..c9ef1d812b 100644
--- a/src/java/org/apache/cassandra/db/SystemKeyspace.java
+++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java
@@ -652,37 +652,35 @@ public final class SystemKeyspace
 
     private static Tables tables()
     {
-        Tables.Builder builder = Tables.builder().add(BuiltIndexes,
-                                                      Batches,
-                                                      Paxos,
-                                                      PaxosRepairHistoryTable,
-                                                      Local,
-                                                      PeersV2,
-                                                      LegacyPeers,
-                                                      PeerEventsV2,
-                                                      LegacyPeerEvents,
-                                                      CompactionHistory,
-                                                      LegacySSTableActivity,
-                                                      SSTableActivity,
-                                                      LegacySizeEstimates,
-                                                      TableEstimates,
-                                                      AvailableRangesV2,
-                                                      LegacyAvailableRanges,
-                                                      TransferredRangesV2,
-                                                      LegacyTransferredRanges,
-                                                      ViewBuildsInProgress,
-                                                      BuiltViews,
-                                                      PreparedStatements,
-                                                      Repairs,
-                                                      TopPartitions,
-                                                      LocalMetadataLog,
-                                                      Snapshots,
-                                                      ConsensusMigrationState);
-
-        if (DatabaseDescriptor.getMutationTrackingEnabled())
-            builder.add(HostLogId, Shards, CoordinatorLogs);
-
-        return builder.build();
+        return Tables.builder().add(BuiltIndexes,
+                                    Batches,
+                                    Paxos,
+                                    PaxosRepairHistoryTable,
+                                    Local,
+                                    PeersV2,
+                                    LegacyPeers,
+                                    PeerEventsV2,
+                                    LegacyPeerEvents,
+                                    CompactionHistory,
+                                    LegacySSTableActivity,
+                                    SSTableActivity,
+                                    LegacySizeEstimates,
+                                    TableEstimates,
+                                    AvailableRangesV2,
+                                    LegacyAvailableRanges,
+                                    TransferredRangesV2,
+                                    LegacyTransferredRanges,
+                                    ViewBuildsInProgress,
+                                    BuiltViews,
+                                    PreparedStatements,
+                                    Repairs,
+                                    TopPartitions,
+                                    LocalMetadataLog,
+                                    Snapshots,
+                                    ConsensusMigrationState,
+                                    HostLogId,
+                                    Shards,
+                                    CoordinatorLogs).build();
     }
 
     private static volatile Map<TableId, Pair<CommitLogPosition, Long>> 
truncationRecords;
diff --git 
a/src/java/org/apache/cassandra/db/compaction/TrackedCompactionManager.java 
b/src/java/org/apache/cassandra/db/compaction/TrackedCompactionManager.java
index 2f7746fb52..5db43619b7 100644
--- a/src/java/org/apache/cassandra/db/compaction/TrackedCompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/TrackedCompactionManager.java
@@ -424,7 +424,7 @@ public class TrackedCompactionManager extends 
AbstractStrategyHolder
     @VisibleForTesting
     boolean isPromotable(SSTableReader sstable)
     {
-        if (!MutationTrackingService.instance().isStarted())
+        if (!MutationTrackingService.isEnabled() || 
!MutationTrackingService.instance().isStarted())
             return false;
 
         if (sstable.isRepaired() || sstable.isPendingRepair())
diff --git 
a/test/distributed/org/apache/cassandra/distributed/test/tracking/MutationTrackingFeatureFlagTest.java
 
b/test/distributed/org/apache/cassandra/distributed/test/tracking/MutationTrackingFeatureFlagTest.java
index bfc6bd9ab6..b219ac8bde 100644
--- 
a/test/distributed/org/apache/cassandra/distributed/test/tracking/MutationTrackingFeatureFlagTest.java
+++ 
b/test/distributed/org/apache/cassandra/distributed/test/tracking/MutationTrackingFeatureFlagTest.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.db.virtual.MutationTrackingTables;
 import org.apache.cassandra.db.virtual.SystemViewsKeyspace;
 import org.apache.cassandra.db.virtual.VirtualTable;
 import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.distributed.api.IIsolatedExecutor;
@@ -49,7 +50,7 @@ import static 
org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static 
org.apache.cassandra.replication.MutationTrackingService.DISABLED_MESSAGE;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertNotNull;
 
 public class MutationTrackingFeatureFlagTest extends TestBaseImpl
 {
@@ -72,10 +73,10 @@ public class MutationTrackingFeatureFlagTest extends 
TestBaseImpl
                       
.has(AssertionUtils.isThrowableInstanceof(InvalidRequestException.class))
                       .hasMessage(DISABLED_MESSAGE);
 
-            // Mutation tracking system keyspace tables should not be present:
-            assertNull(cluster.get(1).callOnInstance(() -> 
Schema.instance.getTableMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME, 
SystemKeyspace.HOST_LOG_ID)));
-            assertNull(cluster.get(1).callOnInstance(() -> 
Schema.instance.getTableMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME, 
SystemKeyspace.SHARDS)));
-            assertNull(cluster.get(1).callOnInstance(() -> 
Schema.instance.getTableMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME, 
SystemKeyspace.COORDINATOR_LOGS)));
+            // Mutation tracking system keyspace tables always exist, so 
commit log replay works if the flag is toggled:
+            assertNotNull(cluster.get(1).callOnInstance(() -> 
Schema.instance.getTableMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME, 
SystemKeyspace.HOST_LOG_ID)));
+            assertNotNull(cluster.get(1).callOnInstance(() -> 
Schema.instance.getTableMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME, 
SystemKeyspace.SHARDS)));
+            assertNotNull(cluster.get(1).callOnInstance(() -> 
Schema.instance.getTableMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME, 
SystemKeyspace.COORDINATOR_LOGS)));
 
             // Make sure virtual tables don't exist:
             IIsolatedExecutor.SerializableCallable<Stream<VirtualTable>> 
hasMutationTrackingTables =
@@ -91,7 +92,7 @@ public class MutationTrackingFeatureFlagTest extends 
TestBaseImpl
     }
 
     @Test
-    public void shouldFailOnBounceWhenDisabledAfterEnabled() throws Exception
+    public void shouldStartOnBounceWhenDisabledAfterEnabled() throws Exception
     {
         try (Cluster cluster = builder().withNodes(1)
                                         .withConfig(c -> 
c.with(Feature.NETWORK).set("mutation_tracking.enabled", true))
@@ -101,15 +102,20 @@ public class MutationTrackingFeatureFlagTest extends 
TestBaseImpl
             cluster.schemaChange(withKeyspace("CREATE KEYSPACE %s WITH 
replication = {'class': 'SimpleStrategy', 'replication_factor': 1} AND 
replication_type='tracked'"));
             cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (k int 
primary key, v int)"));
 
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.tbl 
(k, v) VALUES (1, 1)"), ConsistencyLevel.ALL);
+            cluster.get(1).flush(KEYSPACE);
+
             IInvokableInstance bouncingNode = cluster.get(1);
             bouncingNode.shutdown().get();
             bouncingNode.config().set("mutation_tracking.enabled", false);
             Config badConfig = 
YamlConfigurationLoader.fromMap(bouncingNode.config().getParams(), true, 
Config.class);
             Config.setOverrideLoadConfig(() -> badConfig);
 
-            Assertions.assertThatThrownBy(() -> bouncingNode.startup(cluster))
-                      
.has(AssertionUtils.isThrowableInstanceof(IllegalStateException.class))
-                      .hasMessage(DISABLED_MESSAGE);
+            bouncingNode.startup(cluster);
+
+            // Flushed data written while tracking was enabled stays on disk. 
Unflushed data lives in the journal, which is not replayed while disabled.
+            Object[][] rows = 
bouncingNode.executeInternal(withKeyspace("SELECT k, v FROM %s.tbl WHERE k = 
1"));
+            assertEquals(1, rows.length);
         }
     }
 }


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

Reply via email to