From 4bb33da2d6acad0a47e9d1de0ee349628eb1111a Mon Sep 17 00:00:00 2001 From: Matt Byrd Date: Wed, 4 Mar 2026 19:47:19 +0000 Subject: [PATCH 1/2] compute ProtocolVersion::supportedVersions once immutably to avoid object generation patch by Matt Byrd; reviewed by for CASSANDRA-21199 --- CHANGES.txt | 1 + .../apache/cassandra/transport/ProtocolVersion.java | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 6716235022d..b5fdd39f0b2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 7.0 + * compute ProtocolVersion::supportedVersions once immutably to avoid object generation (CASSANDRA-21199) * Avoid using ObjectUtils.getFirstNonNull in Schema (CASSANDRA-21394) * Allow nodetool garbagecollect to take a user defined list of SSTables (CASSANDRA-16767) * Add a guardrail for misprepared statements (CASSANDRA-21139) diff --git a/src/java/org/apache/cassandra/transport/ProtocolVersion.java b/src/java/org/apache/cassandra/transport/ProtocolVersion.java index 1555e5f558c..7a7e23808c2 100644 --- a/src/java/org/apache/cassandra/transport/ProtocolVersion.java +++ b/src/java/org/apache/cassandra/transport/ProtocolVersion.java @@ -24,6 +24,8 @@ import java.util.List; import java.util.Optional; +import com.google.common.collect.ImmutableList; + import org.apache.commons.lang3.ArrayUtils; import org.apache.cassandra.cql3.FunctionContext; @@ -73,6 +75,7 @@ public enum ProtocolVersion implements Comparable, FunctionCont /** All supported versions, published as an enumset */ public final static EnumSet SUPPORTED = EnumSet.copyOf(Arrays.asList(ArrayUtils.addAll(SUPPORTED_VERSIONS))); + private final static ImmutableList SUPPORTED_VERSION_STRINGS = SUPPORTED.stream().map(ProtocolVersion::toString).collect(ImmutableList.toImmutableList()); /** Old unsupported versions, this is OK as long as we never add newer unsupported versions */ public final static EnumSet UNSUPPORTED = EnumSet.complementOf(SUPPORTED); @@ -84,12 +87,9 @@ public enum ProtocolVersion implements Comparable, FunctionCont public final static ProtocolVersion CURRENT = V5; public final static Optional BETA = Optional.of(V6); - public static List supportedVersions() + public static ImmutableList supportedVersions() { - List ret = new ArrayList<>(SUPPORTED.size()); - for (ProtocolVersion version : SUPPORTED) - ret.add(version.toString()); - return ret; + return SUPPORTED_VERSION_STRINGS; } public static List supportedVersionsStartingWith(ProtocolVersion smallestVersion) From dd5e61d191f28290c8109cda7eda859f495b79db Mon Sep 17 00:00:00 2001 From: Matt Byrd Date: Fri, 22 May 2026 23:27:26 +0100 Subject: [PATCH 2/2] remove use of java stream api and consequent allocations in mutateAtomically avoid array copy when xoring MerkleTree hashes --- src/java/org/apache/cassandra/service/StorageProxy.java | 7 +++++-- src/java/org/apache/cassandra/utils/MerkleTree.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 70de57d6be1..4368f6d4fca 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -1441,8 +1441,11 @@ public static void mutateAtomically(List mutations, boolean attributeNonAccordLatency = true; long nonAccordEndTime = -1; - if (mutations.stream().anyMatch(mutation -> Keyspace.open(mutation.getKeyspaceName()).getReplicationStrategy().hasTransientReplicas())) - throw new AssertionError("Logged batches are unsupported with transient replication"); + for (IMutation mutation : mutations) + { + if (Keyspace.open(mutation.getKeyspaceName()).getReplicationStrategy().hasTransientReplicas()) + throw new AssertionError("Logged batches are unsupported with transient replication"); + } try { diff --git a/src/java/org/apache/cassandra/utils/MerkleTree.java b/src/java/org/apache/cassandra/utils/MerkleTree.java index b6b0141db16..d5270673ad1 100644 --- a/src/java/org/apache/cassandra/utils/MerkleTree.java +++ b/src/java/org/apache/cassandra/utils/MerkleTree.java @@ -1482,7 +1482,7 @@ static byte[] xor(byte[] left, byte[] right) { assert left.length == right.length; - byte[] out = Arrays.copyOf(right, right.length); + byte[] out = new byte[right.length]; for (int i = 0; i < left.length; i++) out[i] = (byte)((left[i] & 0xFF) ^ (right[i] & 0xFF)); return out;