From 2fbeb74ae8b62c4ce88b210888640cf95624a6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Wed, 15 Apr 2026 15:22:25 +0200 Subject: [PATCH 1/3] chore(spanner): use StringBuilder for generating RequestId Use a StringBuilder instead of String.format(..) to generate the header value of a RequestId. This significantly reduces the CPU time needed. Generating the header value for 10mio RequestIds using the new/old implementation take: - Old: 2750ms - New: 203ms --- .../cloud/spanner/XGoogSpannerRequestId.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java index e02f813ca643..84f83f3ef6f5 100644 --- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java @@ -42,16 +42,20 @@ public class XGoogSpannerRequestId { @VisibleForTesting static final long VERSION = 1; // The version of the specification being implemented. + private static final String STATIC_PREFIX = VERSION + "." + RAND_PROCESS_ID + "."; + private final long nthClientId; private final long nthRequest; private long nthChannelId; private long attempt; + private final String instancePrefix; XGoogSpannerRequestId(long nthClientId, long nthChannelId, long nthRequest, long attempt) { this.nthClientId = nthClientId; this.nthChannelId = nthChannelId; this.nthRequest = nthRequest; this.attempt = attempt; + this.instancePrefix = STATIC_PREFIX + nthClientId + "."; } public static XGoogSpannerRequestId of( @@ -122,26 +126,27 @@ private static String generateRandProcessId() { /** Returns the string representation of this RequestId as it should be sent to Spanner. */ public String getHeaderValue() { - return String.format( - "%d.%s.%d.%d.%d.%d", - XGoogSpannerRequestId.VERSION, - XGoogSpannerRequestId.RAND_PROCESS_ID, - this.nthClientId, - this.nthChannelId, - this.nthRequest, - this.attempt); + return new StringBuilder(64) + .append(this.instancePrefix) + .append(this.nthChannelId) + .append('.') + .append(this.nthRequest) + .append('.') + .append(this.attempt) + .toString(); } @Override public String toString() { - return String.format( - "%d.%s.%d.%s.%d.%d", - XGoogSpannerRequestId.VERSION, - XGoogSpannerRequestId.RAND_PROCESS_ID, - this.nthClientId, - this.nthChannelId < 0 ? "x" : String.valueOf(this.nthChannelId), - this.nthRequest, - this.attempt); + StringBuilder sb = new StringBuilder(64); + sb.append(this.instancePrefix); + if (this.nthChannelId < 0) { + sb.append('x'); + } else { + sb.append(this.nthChannelId); + } + sb.append('.').append(this.nthRequest).append('.').append(this.attempt); + return sb.toString(); } public String debugToString() { From 662821d92253df10eeba9fa23b62a37295a2129a Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Wed, 15 Apr 2026 13:30:26 +0000 Subject: [PATCH 2/3] chore: generate libraries at Wed Apr 15 13:28:49 UTC 2026 --- gapic-libraries-bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gapic-libraries-bom/pom.xml b/gapic-libraries-bom/pom.xml index 9f1174f95b72..9cbef9e2cdee 100644 --- a/gapic-libraries-bom/pom.xml +++ b/gapic-libraries-bom/pom.xml @@ -4,7 +4,7 @@ com.google.cloud gapic-libraries-bom pom - 1.85.1 + 1.85.0 Google Cloud Java BOM BOM for the libraries in google-cloud-java repository. Users should not From 325b4b8aa34c9c107523cf0718bbcaae0677b721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Wed, 15 Apr 2026 16:55:48 +0200 Subject: [PATCH 3/3] chore(spanner): address review comments --- .../java/com/google/cloud/spanner/XGoogSpannerRequestId.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java index 84f83f3ef6f5..9e1412c604dd 100644 --- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/XGoogSpannerRequestId.java @@ -126,7 +126,7 @@ private static String generateRandProcessId() { /** Returns the string representation of this RequestId as it should be sent to Spanner. */ public String getHeaderValue() { - return new StringBuilder(64) + return new StringBuilder(this.instancePrefix.length() + 48) .append(this.instancePrefix) .append(this.nthChannelId) .append('.') @@ -138,7 +138,7 @@ public String getHeaderValue() { @Override public String toString() { - StringBuilder sb = new StringBuilder(64); + StringBuilder sb = new StringBuilder(this.instancePrefix.length() + 48); sb.append(this.instancePrefix); if (this.nthChannelId < 0) { sb.append('x');