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

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

commit 780274346018cf1c66dd1d1bdba0a227700d8cf4
Author: Marcus Eriksson <[email protected]>
AuthorDate: Thu Aug 28 11:00:17 2025 +0200

    Fix issue when running cms reconfiguration with paxos repair disabled
    
    Patch by marcuse; reviewed by Sam Tunnicliffe for CASSANDRA-20869
---
 CHANGES.txt                                                 |  1 +
 .../org/apache/cassandra/service/ActiveRepairService.java   |  6 ++----
 .../org/apache/cassandra/tcm/sequences/ReconfigureCMS.java  | 11 ++++++-----
 .../cassandra/distributed/test/log/ReconfigureCMSTest.java  | 13 +++++++++++++
 4 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 1e9bbaa2fe..b3dbba2f9b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.1
+ * Fix issue when running cms reconfiguration with paxos repair disabled 
(CASSANDRA-20869)
  * Added additional parameter to JVM shutdown to allow for logs to be properly 
shutdown (CASSANDRA-20978)
  * Improve isGossipOnlyMember and location lookup performance (CASSANDRA-21039)
  * Refactor the way we check if a transformation is allowed to be committed 
during upgrades (CASSANDRA-21043)
diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java 
b/src/java/org/apache/cassandra/service/ActiveRepairService.java
index a6641eccd5..5d2a8c89c4 100644
--- a/src/java/org/apache/cassandra/service/ActiveRepairService.java
+++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java
@@ -20,7 +20,6 @@ package org.apache.cassandra.service;
 import java.io.IOException;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -118,7 +117,6 @@ import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.AsyncPromise;
 import org.apache.cassandra.utils.concurrent.Future;
 import org.apache.cassandra.utils.concurrent.FutureCombiner;
-import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 
 import static com.google.common.collect.Iterables.concat;
 import static com.google.common.collect.Iterables.transform;
@@ -1190,13 +1188,13 @@ public class ActiveRepairService implements 
IEndpointStateChangeSubscriber, IFai
         if (!paxosRepairEnabled())
         {
             logger.warn("Not running paxos repair for topology change because 
paxos repair has been disabled");
-            return Arrays.asList(() -> ImmediateFuture.success(null));
+            return Collections.emptyList();
         }
 
         if (ranges.isEmpty())
         {
             logger.warn("Not running paxos repair for topology change because 
there are no ranges to repair");
-            return Arrays.asList(() -> ImmediateFuture.success(null));
+            return Collections.emptyList();
         }
         ClusterMetadata metadata = ClusterMetadata.current();
         List<TableMetadata> tables = 
Lists.newArrayList(metadata.schema.getKeyspaces().getNullable(ksName).tables);
diff --git a/src/java/org/apache/cassandra/tcm/sequences/ReconfigureCMS.java 
b/src/java/org/apache/cassandra/tcm/sequences/ReconfigureCMS.java
index fe1ec17f3d..c0efee0ae4 100644
--- a/src/java/org/apache/cassandra/tcm/sequences/ReconfigureCMS.java
+++ b/src/java/org/apache/cassandra/tcm/sequences/ReconfigureCMS.java
@@ -30,6 +30,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.function.Supplier;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -198,7 +199,7 @@ public class ReconfigureCMS extends 
MultiStepOperation<AdvanceCMSReconfiguration
         {
             String message = "Some data streaming failed. Use nodetool to 
check CMS reconfiguration state and resume. " +
                              "For more, see `nodetool help cms reconfigure`.";
-            logger.warn(message);
+            logger.warn(message, t);
             return SequenceState.error(new RuntimeException(message));
         }
     }
@@ -344,10 +345,10 @@ public class ReconfigureCMS extends 
MultiStepOperation<AdvanceCMSReconfiguration
         // overlapping quorums invariant holds.
 
         Retry retry = 
Retry.withNoTimeLimit(TCMMetrics.instance.repairPaxosTopologyRetries);
-        List<Supplier<Future<?>>> remaining = ActiveRepairService.instance()
-                                                                 
.repairPaxosForTopologyChangeAsync(SchemaConstants.METADATA_KEYSPACE_NAME,
-                                                                               
                     Collections.singletonList(entireRange),
-                                                                               
                     "CMS reconfiguration");
+        List<Supplier<Future<?>>> remaining = 
Lists.newArrayList(ActiveRepairService.instance()
+                                                                               
     .repairPaxosForTopologyChangeAsync(SchemaConstants.METADATA_KEYSPACE_NAME,
+                                                                               
                                        Collections.singletonList(entireRange),
+                                                                               
                                        "CMS reconfiguration"));
 
         while (true)
         {
diff --git 
a/test/distributed/org/apache/cassandra/distributed/test/log/ReconfigureCMSTest.java
 
b/test/distributed/org/apache/cassandra/distributed/test/log/ReconfigureCMSTest.java
index d0e1f358fb..ff1b7d50ac 100644
--- 
a/test/distributed/org/apache/cassandra/distributed/test/log/ReconfigureCMSTest.java
+++ 
b/test/distributed/org/apache/cassandra/distributed/test/log/ReconfigureCMSTest.java
@@ -308,6 +308,19 @@ public class ReconfigureCMSTest extends FuzzTestBase
         }
     }
 
+    @Test
+    public void testReconfigurePaxosRepairDisabled() throws IOException
+    {
+        try (Cluster cluster = builder().withNodes(3)
+                                        .withConfig(c -> 
c.with(Feature.NETWORK)
+                                                          
.set("paxos_repair_enabled", "false"))
+                                        .withoutVNodes()
+                                        .start())
+        {
+            cluster.get(1).nodetoolResult("cms", "reconfigure", 
"3").asserts().success();
+        }
+    }
+
     private PaxosRepairHistory paxosRepairHistory(IInvokableInstance instance)
     {
         Object[][] rows = instance.executeInternal("select points from 
system.paxos_repair_history " +


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

Reply via email to