From 91d668163e7d7a4b457c493a2f8a7cb85453bf54 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Wed, 9 Jul 2025 10:54:10 -0500 Subject: [PATCH] CNDB-14650: allow mixed mode repair --- .../config/CassandraRelevantProperties.java | 7 +++++++ .../cassandra/repair/messages/PrepareMessage.java | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java index d8d54fb9a138..ba303a398fdb 100644 --- a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java +++ b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java @@ -249,6 +249,13 @@ public enum CassandraRelevantProperties */ REPAIR_PARENT_SESSION_LISTENER("cassandra.custom_parent_repair_session_listener_class"), + /** + * Allow repair in mixed major version clusters. When false (default), repair operations + * will fail in clusters with mixed major versions unless explicitly allowed. + * Set to true to allow repair during rolling upgrades. + */ + ALLOW_MIXED_REPAIR("cassandra.allow_mixed_repair", "false"), + //cassandra properties (without the "cassandra." prefix) /** diff --git a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java index 7c8db93222c1..bfef1e0f8866 100644 --- a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java +++ b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java @@ -26,6 +26,8 @@ import com.google.common.base.Preconditions; +import org.apache.cassandra.config.CassandraRelevantProperties; + import org.apache.cassandra.db.TypeSizes; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.Range; @@ -41,6 +43,8 @@ public class PrepareMessage extends RepairMessage { + private static final boolean ALLOW_MIXED_REPAIR = CassandraRelevantProperties.ALLOW_MIXED_REPAIR.getBoolean(); + public final List tableIds; public final Collection> ranges; @@ -84,13 +88,15 @@ public int hashCode() } private static final String MIXED_MODE_ERROR = "Some nodes involved in repair are on an incompatible major version. " + - "Repair is not supported in mixed major version clusters."; + "Repair is not supported in mixed major version clusters. " + + "To allow repair during rolling upgrades, set -Dcassandra.allow_mixed_repair=true"; public static final IVersionedSerializer serializer = new IVersionedSerializer() { public void serialize(PrepareMessage message, DataOutputPlus out, int version) throws IOException { - Preconditions.checkArgument(version == MessagingService.current_version, MIXED_MODE_ERROR); + if (!ALLOW_MIXED_REPAIR) + Preconditions.checkArgument(version == MessagingService.current_version, MIXED_MODE_ERROR); out.writeInt(message.tableIds.size()); for (TableId tableId : message.tableIds) @@ -110,7 +116,8 @@ public void serialize(PrepareMessage message, DataOutputPlus out, int version) t public PrepareMessage deserialize(DataInputPlus in, int version) throws IOException { - Preconditions.checkArgument(version == MessagingService.current_version, MIXED_MODE_ERROR); + if (!ALLOW_MIXED_REPAIR) + Preconditions.checkArgument(version == MessagingService.current_version, MIXED_MODE_ERROR); int tableIdCount = in.readInt(); List tableIds = new ArrayList<>(tableIdCount);