From 999d6d7c56b8ac320ac771d21555fa49e6ff12df Mon Sep 17 00:00:00 2001 From: Francisco Guerrero Date: Tue, 16 Jun 2026 05:50:45 -0500 Subject: [PATCH 1/3] Reduce allocations in DefaultQueryOptions when read thresholds are enabled patch by Francisco Guerrero; reviewed by TBD for CASSANDRA-21467 --- .../org/apache/cassandra/cql3/QueryOptions.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/cassandra/cql3/QueryOptions.java b/src/java/org/apache/cassandra/cql3/QueryOptions.java index afc5bacc38c1..e9313e50f29c 100644 --- a/src/java/org/apache/cassandra/cql3/QueryOptions.java +++ b/src/java/org/apache/cassandra/cql3/QueryOptions.java @@ -322,7 +322,7 @@ static ReadThresholds create() // if daemon initialization hasn't happened yet (very common in tests) then ignore if (!DatabaseDescriptor.isDaemonInitialized() || !DatabaseDescriptor.getReadThresholdsEnabled()) return DisabledReadThresholds.INSTANCE; - return new DefaultReadThresholds(DatabaseDescriptor.getCoordinatorReadSizeWarnThreshold(), DatabaseDescriptor.getCoordinatorReadSizeFailThreshold()); + return DefaultReadThresholds.INSTANCE; } } @@ -351,14 +351,7 @@ public long getCoordinatorReadSizeFailThresholdBytes() private static class DefaultReadThresholds implements ReadThresholds { - private final long warnThresholdBytes; - private final long abortThresholdBytes; - - public DefaultReadThresholds(DataStorageSpec.LongBytesBound warnThreshold, DataStorageSpec.LongBytesBound abortThreshold) - { - this.warnThresholdBytes = warnThreshold == null ? -1 : warnThreshold.toBytes(); - this.abortThresholdBytes = abortThreshold == null ? -1 : abortThreshold.toBytes(); - } + private static final DefaultReadThresholds INSTANCE = new DefaultReadThresholds(); @Override public boolean isEnabled() @@ -369,13 +362,15 @@ public boolean isEnabled() @Override public long getCoordinatorReadSizeWarnThresholdBytes() { - return warnThresholdBytes; + DataStorageSpec.LongBytesBound warnThreshold = DatabaseDescriptor.getCoordinatorReadSizeWarnThreshold(); + return warnThreshold == null ? -1 : warnThreshold.toBytes(); } @Override public long getCoordinatorReadSizeFailThresholdBytes() { - return abortThresholdBytes; + DataStorageSpec.LongBytesBound abortThreshold = DatabaseDescriptor.getCoordinatorReadSizeFailThreshold(); + return abortThreshold == null ? -1 : abortThreshold.toBytes(); } } From aa61260b97887bc78c651623de9aee5c7f8d8659 Mon Sep 17 00:00:00 2001 From: Francisco Guerrero Date: Mon, 29 Jun 2026 13:54:30 -0700 Subject: [PATCH 2/3] Address PR comments from Dmitry --- .../cassandra/config/DatabaseDescriptor.java | 13 ++++++++++++ .../apache/cassandra/cql3/QueryOptions.java | 21 ++++++++++++------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 9ee09db70709..16b949d7db9f 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -64,6 +64,7 @@ import com.google.common.util.concurrent.RateLimiter; import com.googlecode.concurrenttrees.common.Iterables; +import org.apache.cassandra.cql3.QueryOptions; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -267,6 +268,8 @@ public class DatabaseDescriptor public static volatile boolean allowUnlimitedConcurrentValidations = ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS.getBoolean(); + private static volatile QueryOptions.ReadThresholds defaultReadThresholds; + /** * The configuration for guardrails. */ @@ -5452,6 +5455,14 @@ public static boolean getInvalidLegacyProtocolMagicNoSpamEnabled() return conf.invalid_legacy_protocol_magic_no_spam_enabled; } + public static QueryOptions.ReadThresholds getDefaultReadThresholds() + { + if (defaultReadThresholds == null) + defaultReadThresholds = new QueryOptions.DefaultReadThresholds(getCoordinatorReadSizeWarnThreshold(), + getCoordinatorReadSizeFailThreshold()); + return defaultReadThresholds; + } + public static boolean getReadThresholdsEnabled() { return conf.read_thresholds_enabled; @@ -5476,6 +5487,7 @@ public static void setCoordinatorReadSizeWarnThreshold(@Nullable DataStorageSpec { logger.info("updating coordinator_read_size_warn_threshold to {}", value); conf.coordinator_read_size_warn_threshold = value; + defaultReadThresholds = new QueryOptions.DefaultReadThresholds(value, getCoordinatorReadSizeFailThreshold()); } @Nullable @@ -5488,6 +5500,7 @@ public static void setCoordinatorReadSizeFailThreshold(@Nullable DataStorageSpec { logger.info("updating coordinator_read_size_fail_threshold to {}", value); conf.coordinator_read_size_fail_threshold = value; + defaultReadThresholds = new QueryOptions.DefaultReadThresholds(getCoordinatorReadSizeWarnThreshold(), value); } @Nullable diff --git a/src/java/org/apache/cassandra/cql3/QueryOptions.java b/src/java/org/apache/cassandra/cql3/QueryOptions.java index e9313e50f29c..4da5bec58810 100644 --- a/src/java/org/apache/cassandra/cql3/QueryOptions.java +++ b/src/java/org/apache/cassandra/cql3/QueryOptions.java @@ -309,7 +309,7 @@ public QueryOptions prepare(List specs) return this; } - interface ReadThresholds + public interface ReadThresholds { boolean isEnabled(); @@ -322,7 +322,7 @@ static ReadThresholds create() // if daemon initialization hasn't happened yet (very common in tests) then ignore if (!DatabaseDescriptor.isDaemonInitialized() || !DatabaseDescriptor.getReadThresholdsEnabled()) return DisabledReadThresholds.INSTANCE; - return DefaultReadThresholds.INSTANCE; + return DatabaseDescriptor.getDefaultReadThresholds(); } } @@ -349,9 +349,16 @@ public long getCoordinatorReadSizeFailThresholdBytes() } } - private static class DefaultReadThresholds implements ReadThresholds + public static class DefaultReadThresholds implements ReadThresholds { - private static final DefaultReadThresholds INSTANCE = new DefaultReadThresholds(); + private final long warnThresholdBytes; + private final long abortThresholdBytes; + + public DefaultReadThresholds(DataStorageSpec.LongBytesBound warnThreshold, DataStorageSpec.LongBytesBound abortThreshold) + { + this.warnThresholdBytes = warnThreshold == null ? -1 : warnThreshold.toBytes(); + this.abortThresholdBytes = abortThreshold == null ? -1 : abortThreshold.toBytes(); + } @Override public boolean isEnabled() @@ -362,15 +369,13 @@ public boolean isEnabled() @Override public long getCoordinatorReadSizeWarnThresholdBytes() { - DataStorageSpec.LongBytesBound warnThreshold = DatabaseDescriptor.getCoordinatorReadSizeWarnThreshold(); - return warnThreshold == null ? -1 : warnThreshold.toBytes(); + return warnThresholdBytes; } @Override public long getCoordinatorReadSizeFailThresholdBytes() { - DataStorageSpec.LongBytesBound abortThreshold = DatabaseDescriptor.getCoordinatorReadSizeFailThreshold(); - return abortThreshold == null ? -1 : abortThreshold.toBytes(); + return abortThresholdBytes; } } From 80d4da6b4c055f7fe7643c6bf46f08b6d6315f14 Mon Sep 17 00:00:00 2001 From: Francisco Guerrero Date: Mon, 29 Jun 2026 13:56:02 -0700 Subject: [PATCH 3/3] cleanup --- src/java/org/apache/cassandra/config/DatabaseDescriptor.java | 4 ++-- src/java/org/apache/cassandra/cql3/QueryOptions.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 16b949d7db9f..b8af33cb4ff1 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -268,7 +268,7 @@ public class DatabaseDescriptor public static volatile boolean allowUnlimitedConcurrentValidations = ALLOW_UNLIMITED_CONCURRENT_VALIDATIONS.getBoolean(); - private static volatile QueryOptions.ReadThresholds defaultReadThresholds; + private static volatile QueryOptions.DefaultReadThresholds defaultReadThresholds; /** * The configuration for guardrails. @@ -5455,7 +5455,7 @@ public static boolean getInvalidLegacyProtocolMagicNoSpamEnabled() return conf.invalid_legacy_protocol_magic_no_spam_enabled; } - public static QueryOptions.ReadThresholds getDefaultReadThresholds() + public static QueryOptions.DefaultReadThresholds getDefaultReadThresholds() { if (defaultReadThresholds == null) defaultReadThresholds = new QueryOptions.DefaultReadThresholds(getCoordinatorReadSizeWarnThreshold(), diff --git a/src/java/org/apache/cassandra/cql3/QueryOptions.java b/src/java/org/apache/cassandra/cql3/QueryOptions.java index 4da5bec58810..78910e5788f5 100644 --- a/src/java/org/apache/cassandra/cql3/QueryOptions.java +++ b/src/java/org/apache/cassandra/cql3/QueryOptions.java @@ -309,7 +309,7 @@ public QueryOptions prepare(List specs) return this; } - public interface ReadThresholds + interface ReadThresholds { boolean isEnabled();