From 78290bed4518d403407398331673bf35a37c5011 Mon Sep 17 00:00:00 2001 From: Caleb Rackliffe Date: Tue, 15 Apr 2025 10:11:45 -0500 Subject: [PATCH] Avoid computing prepared statement size for unprepared batches patch by Caleb Rackliffe; reviewed by Berenguer Blasi and Marcus Eriksson for CASSANDRA-20556 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/cql3/QueryProcessor.java | 10 +++++++++- .../cassandra/transport/messages/BatchMessage.java | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 25aea7b20a..67672cd0c5 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.0.18 + * Avoid computing prepared statement size for unprepared batches (CASSANDRA-20556) * Fix Dropwizard Meter causes timeouts when infrequently used (CASSANDRA-19332) * Update OWASP dependency checker to version 12.1.0 (CASSANDRA-20501) * Suppress CVE-2025-25193 (CASSANDRA-20504) diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index 910f8c79f8..c1045548b8 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -392,6 +392,11 @@ public class QueryProcessor implements QueryHandler } public static Prepared parseAndPrepare(String query, ClientState clientState, boolean isInternal) throws RequestValidationException + { + return parseAndPrepare(query, clientState, isInternal, true); + } + + public static Prepared parseAndPrepare(String query, ClientState clientState, boolean isInternal, boolean measure) throws RequestValidationException { CQLStatement.Raw raw = parseStatement(query); @@ -416,7 +421,10 @@ public class QueryProcessor implements QueryHandler res = new Prepared(statement, "", fullyQualified, keyspace); else res = new Prepared(statement, query, fullyQualified, keyspace); - res.pstmntSize = measurePstmnt(res); + + // Some prepared statements will not be cached and therefore do not require a pre-computed size. + if (measure) + res.pstmntSize = measurePstmnt(res); return res; } diff --git a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java index afc308aee4..071741509e 100644 --- a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java @@ -184,7 +184,7 @@ public class BatchMessage extends Message.Request { p = QueryProcessor.parseAndPrepare((String) query, state.getClientState().cloneWithKeyspaceIfSet(options.getKeyspace()), - false); + false, false); } else {