diff --git a/CHANGES.txt b/CHANGES.txt index 99eb2871a95e..201b3d9664e6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.0.7 + * Optionally force IndexStatusManager to use the optimized index status format (CASSANDRA-21132) * No need to evict already prepared statements, as it creates a race condition between multiple threads (CASSANDRA-17401) * Upgrade logback version to 1.5.18 and slf4j dependencies to 2.0.17 (CASSANDRA-21137) * Automatically disable zero-copy streaming for legacy sstables with old bloom filter format (CASSANDRA-21092) diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 2c3d79183d49..9b16609154a6 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -883,6 +883,13 @@ public static void setClientMode(boolean clientMode) public volatile boolean drop_keyspace_enabled = true; public volatile boolean secondary_indexes_enabled = true; + /** + * If we encounter a Gossip bug where {@link org.apache.cassandra.gms.Gossiper#getMinVersion} is + * unable to accurately report a minimum version for the cluster, optionally force the optimized + * index status format added in CASSANDRA-20058. + */ + public volatile boolean force_optimized_index_status_format = false; + public volatile String default_secondary_index = CassandraIndex.NAME; public volatile boolean default_secondary_index_enabled = true; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 68be14cd8f70..3361385083f1 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -5264,6 +5264,16 @@ public static void setPrioritizeSAIOverLegacyIndex(boolean value) conf.sai_options.prioritize_over_legacy_index = value; } + public static boolean getForceOptimizedIndexStatusFormat() + { + return conf.force_optimized_index_status_format; + } + + public static void setForceOptimizedIndexStatusFormat(boolean value) + { + conf.force_optimized_index_status_format = value; + } + public static RepairRetrySpec getRepairRetrySpec() { return conf == null ? new RepairRetrySpec() : conf.repair.retries; diff --git a/src/java/org/apache/cassandra/index/IndexStatusManager.java b/src/java/org/apache/cassandra/index/IndexStatusManager.java index 6ba91beb7bcf..31036f2ec631 100644 --- a/src/java/org/apache/cassandra/index/IndexStatusManager.java +++ b/src/java/org/apache/cassandra/index/IndexStatusManager.java @@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory; import org.apache.cassandra.concurrent.ExecutorPlus; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.exceptions.ReadFailureException; @@ -249,6 +250,9 @@ public synchronized void propagateLocalIndexStatus(String keyspace, String index private static boolean shouldWriteLegacyStatusFormat(CassandraVersion minVersion) { + if (DatabaseDescriptor.getForceOptimizedIndexStatusFormat()) + return false; + return minVersion == null || (minVersion.major == 5 && minVersion.minor == 0 && minVersion.patch < 3); } diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index a284fa27386e..0f178b00f08f 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -7675,6 +7675,18 @@ public void setPrioritizeSAIOverLegacyIndex(boolean value) DatabaseDescriptor.setPrioritizeSAIOverLegacyIndex(value); } + @Override + public boolean getForceOptimizedIndexStatusFormat() + { + return DatabaseDescriptor.getForceOptimizedIndexStatusFormat(); + } + + @Override + public void setForceOptimizedIndexStatusFormat(boolean value) + { + DatabaseDescriptor.setForceOptimizedIndexStatusFormat(value); + } + @Override public void setPaxosRepairRaceWait(boolean paxosRepairRaceWait) { diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index b30929d180e2..875df369421b 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -1322,6 +1322,9 @@ public void enableAuditLog(String loggerName, String includedKeyspaces, String e boolean getPrioritizeSAIOverLegacyIndex(); void setPrioritizeSAIOverLegacyIndex(boolean value); + boolean getForceOptimizedIndexStatusFormat(); + void setForceOptimizedIndexStatusFormat(boolean value); + void setPaxosRepairRaceWait(boolean paxosRepairCoordinatorWait); boolean getPaxosRepairRaceWait();