From 6298992cb61a26ca66e375d02fc37cc6aeb66904 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Tue, 17 Jun 2025 16:15:42 +0530 Subject: [PATCH 01/10] feat: Enable Multiplex session by default --- .../main/java/com/google/cloud/spanner/SessionPoolOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java index a4490c24d16..51a5ddccafd 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPoolOptions.java @@ -613,7 +613,7 @@ public static class Builder { // This field controls the default behavior of session management in Java client. // Set useMultiplexedSession to true to make multiplexed session the default. - private boolean useMultiplexedSession = false; + private boolean useMultiplexedSession = true; // This field controls the default behavior of session management for RW operations in Java // client. From 7232b278a041dffa3f5f553b36953c53d5f4538e Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Wed, 18 Jun 2025 12:23:15 +0530 Subject: [PATCH 02/10] enable new github actions --- .github/workflows/ci.yaml | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b2b187f4ac5..5bd03892f75 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,9 +52,25 @@ jobs: - run: .kokoro/build.sh env: JOB_TYPE: test - GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS: true GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS: true GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW: true + units-without-multiplexed-session: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: [ 11, 17, 21 ] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: ${{matrix.java}} + - run: java -version + - run: .kokoro/build.sh + env: + JOB_TYPE: test + GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS: false units-java8: # Building using Java 17 and run the tests with Java 8 runtime name: "units (8)" @@ -96,6 +112,26 @@ jobs: GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS: true GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS: true GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW: true + units-without-multiplexed-session8: + # Building using Java 17 and run the tests with Java 8 runtime + name: "units-with-multiplexed-session (8)" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + java-version: 8 + distribution: temurin + - run: echo "SUREFIRE_JVM_OPT=-Djvm=${JAVA_HOME}/bin/java" >> $GITHUB_ENV + shell: bash + - uses: actions/setup-java@v3 + with: + java-version: 17 + distribution: temurin + - run: .kokoro/build.sh + env: + JOB_TYPE: test + GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS: false windows: runs-on: windows-latest steps: From 08d93f839d4d1da6a78ed948b3108140756807cd Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Wed, 18 Jun 2025 12:24:04 +0530 Subject: [PATCH 03/10] enable regular session pipeline with emulator --- ...gration-tests-against-emulator-with-multiplexed-session.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration-tests-against-emulator-with-multiplexed-session.yaml b/.github/workflows/integration-tests-against-emulator-with-multiplexed-session.yaml index 6dda467b64e..06e7e416d92 100644 --- a/.github/workflows/integration-tests-against-emulator-with-multiplexed-session.yaml +++ b/.github/workflows/integration-tests-against-emulator-with-multiplexed-session.yaml @@ -39,4 +39,4 @@ jobs: env: JOB_TYPE: test SPANNER_EMULATOR_HOST: localhost:9010 - GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS: true \ No newline at end of file + GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS: false \ No newline at end of file From b5a9260acc78538e6d0bb32cb03b854764673f88 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Wed, 18 Jun 2025 12:25:31 +0530 Subject: [PATCH 04/10] rename job names --- .github/workflows/ci.yaml | 4 ++-- ...egration-tests-against-emulator-with-regular-session.yaml} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{integration-tests-against-emulator-with-multiplexed-session.yaml => integration-tests-against-emulator-with-regular-session.yaml} (100%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5bd03892f75..780cb4f53cd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -54,7 +54,7 @@ jobs: JOB_TYPE: test GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS: true GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW: true - units-without-multiplexed-session: + units-with-regular-session: runs-on: ubuntu-latest strategy: fail-fast: false @@ -112,7 +112,7 @@ jobs: GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS: true GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS: true GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW: true - units-without-multiplexed-session8: + units-with-regular-session8: # Building using Java 17 and run the tests with Java 8 runtime name: "units-with-multiplexed-session (8)" runs-on: ubuntu-latest diff --git a/.github/workflows/integration-tests-against-emulator-with-multiplexed-session.yaml b/.github/workflows/integration-tests-against-emulator-with-regular-session.yaml similarity index 100% rename from .github/workflows/integration-tests-against-emulator-with-multiplexed-session.yaml rename to .github/workflows/integration-tests-against-emulator-with-regular-session.yaml From 7f06e1dd0002ceab86639ea5e147ef3b0e8e08d1 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Wed, 18 Jun 2025 12:43:40 +0530 Subject: [PATCH 05/10] skip running multiplex session tests in regular session --- .../MultiplexedSessionDatabaseClientMockServerTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java index d0841e3ac40..8c3186e046f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java @@ -27,6 +27,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; @@ -69,6 +71,8 @@ public class MultiplexedSessionDatabaseClientMockServerTest extends AbstractMock @BeforeClass public static void setupResults() { + assumeFalse(System.getenv().getOrDefault("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS", "") + .equalsIgnoreCase("false")); mockSpanner.putStatementResults( StatementResult.query(STATEMENT, new RandomResultSetGenerator(1).generate())); mockSpanner.putStatementResult(StatementResult.update(UPDATE_STATEMENT, UPDATE_COUNT)); From b9106f246d260ce519a3096d2c9907e16241f381 Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Wed, 18 Jun 2025 07:16:59 +0000 Subject: [PATCH 06/10] chore: generate libraries at Wed Jun 18 07:14:15 UTC 2025 --- .../MultiplexedSessionDatabaseClientMockServerTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java index 8c3186e046f..1ef49637611 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java @@ -28,7 +28,6 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; -import static org.junit.Assume.assumeTrue; import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; @@ -71,8 +70,10 @@ public class MultiplexedSessionDatabaseClientMockServerTest extends AbstractMock @BeforeClass public static void setupResults() { - assumeFalse(System.getenv().getOrDefault("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS", "") - .equalsIgnoreCase("false")); + assumeFalse( + System.getenv() + .getOrDefault("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS", "") + .equalsIgnoreCase("false")); mockSpanner.putStatementResults( StatementResult.query(STATEMENT, new RandomResultSetGenerator(1).generate())); mockSpanner.putStatementResult(StatementResult.update(UPDATE_STATEMENT, UPDATE_COUNT)); From bf6ea91497edf75cd52af3cda3c2c94ad51c409f Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Wed, 18 Jun 2025 14:55:14 +0530 Subject: [PATCH 07/10] Skip multiplex session tests in regular session --- ...MultiplexedSessionDatabaseClientMockServerTest.java | 5 +---- .../spanner/OpenTelemetryBuiltInMetricsTracerTest.java | 2 ++ .../google/cloud/spanner/SessionPoolOptionsTest.java | 2 ++ .../test/java/com/google/cloud/spanner/TestHelper.java | 10 ++++++++++ 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java index 1ef49637611..0448656475a 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionDatabaseClientMockServerTest.java @@ -70,10 +70,7 @@ public class MultiplexedSessionDatabaseClientMockServerTest extends AbstractMock @BeforeClass public static void setupResults() { - assumeFalse( - System.getenv() - .getOrDefault("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS", "") - .equalsIgnoreCase("false")); + assumeFalse(TestHelper.isMultiplexSessionDisabled()); mockSpanner.putStatementResults( StatementResult.query(STATEMENT, new RandomResultSetGenerator(1).generate())); mockSpanner.putStatementResult(StatementResult.update(UPDATE_STATEMENT, UPDATE_COUNT)); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java index c3b91ad6c51..4145713c7f7 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryBuiltInMetricsTracerTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.junit.Assume.assumeFalse; import com.google.api.gax.longrunning.OperationTimedPollAlgorithm; import com.google.api.gax.retrying.RetrySettings; @@ -255,6 +256,7 @@ public void testMetricsWithGaxRetryUnaryRpc() { @Test public void testNoNetworkConnection() { + assumeFalse(TestHelper.isMultiplexSessionDisabled()); // Create a Spanner instance that tries to connect to a server that does not exist. // This simulates a bad network connection. SpannerOptions.Builder builder = SpannerOptions.newBuilder(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolOptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolOptionsTest.java index d4b36e97488..705783d78c0 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolOptionsTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionPoolOptionsTest.java @@ -283,6 +283,7 @@ public void testRandomizePositionQPSThreshold() { @Test public void testUseMultiplexedSession() { + assumeFalse(TestHelper.isMultiplexSessionDisabled()); // skip these tests since this configuration can have dual behaviour in different test-runners assumeFalse(SessionPoolOptions.newBuilder().build().getUseMultiplexedSession()); assertEquals(false, SessionPoolOptions.newBuilder().build().getUseMultiplexedSession()); @@ -304,6 +305,7 @@ public void testUseMultiplexedSession() { @Test public void testUseMultiplexedSessionForRW() { // skip these tests since this configuration can have dual behaviour in different test-runners + assumeFalse(TestHelper.isMultiplexSessionDisabled()); assumeFalse( Boolean.parseBoolean(System.getenv("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW"))); assumeFalse(SessionPoolOptions.newBuilder().build().getUseMultiplexedSession()); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java new file mode 100644 index 00000000000..e81ab9554bb --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java @@ -0,0 +1,10 @@ +package com.google.cloud.spanner; + +class TestHelper { + + static boolean isMultiplexSessionDisabled() { + return System.getenv() + .getOrDefault("GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS", "") + .equalsIgnoreCase("false"); + } +} From fbdc8cf5f8a663ab4eeb39bb763668c5dd25b249 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Wed, 18 Jun 2025 14:57:29 +0530 Subject: [PATCH 08/10] Fix tests --- ...RetryOnDifferentGrpcChannelMockServerTest.java | 1 + .../java/com/google/cloud/spanner/TestHelper.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java index f3e15df8189..9b46c7044b8 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java @@ -284,6 +284,7 @@ public void testDenyListedChannelIsCleared() { @Test public void testSingleUseQuery_retriesOnNewChannel() { + assumeFalse(TestHelper.isMultiplexSessionDisabled()); SpannerOptions.Builder builder = createSpannerOptionsBuilder(); builder.setSessionPoolOption( SessionPoolOptions.newBuilder().setUseMultiplexedSession(true).build()); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java index e81ab9554bb..eb72238e8a5 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TestHelper.java @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.google.cloud.spanner; class TestHelper { From 9e6bc5a7a396702b03ae3305537e74f142331ee1 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Wed, 18 Jun 2025 15:01:53 +0530 Subject: [PATCH 09/10] Fix tests --- .github/workflows/ci.yaml | 2 +- .../spanner/RetryOnDifferentGrpcChannelMockServerTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 780cb4f53cd..8717db17ae5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -114,7 +114,7 @@ jobs: GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW: true units-with-regular-session8: # Building using Java 17 and run the tests with Java 8 runtime - name: "units-with-multiplexed-session (8)" + name: "units-with-regular-session (8)" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java index 9b46c7044b8..e7ef9955d4f 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/RetryOnDifferentGrpcChannelMockServerTest.java @@ -313,6 +313,7 @@ public void testSingleUseQuery_retriesOnNewChannel() { @Test public void testSingleUseQuery_stopsRetrying() { + assumeFalse(TestHelper.isMultiplexSessionDisabled()); SpannerOptions.Builder builder = createSpannerOptionsBuilder(); builder.setSessionPoolOption( SessionPoolOptions.newBuilder().setUseMultiplexedSession(true).build()); From 59bb0bcd4cfceeb20603b9a78bab2a6041cfaa93 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Fri, 20 Jun 2025 10:09:51 +0530 Subject: [PATCH 10/10] Introduce a new Kokoro job for regular sessions --- .../integration-regular-sessions-enabled.cfg | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .kokoro/presubmit/integration-regular-sessions-enabled.cfg diff --git a/.kokoro/presubmit/integration-regular-sessions-enabled.cfg b/.kokoro/presubmit/integration-regular-sessions-enabled.cfg new file mode 100644 index 00000000000..c845c470ebc --- /dev/null +++ b/.kokoro/presubmit/integration-regular-sessions-enabled.cfg @@ -0,0 +1,38 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/java8" +} + +env_vars: { + key: "JOB_TYPE" + value: "integration" +} + +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-it-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-it-service-account" +} + +env_vars: { + key: "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS" + value: "false" +} \ No newline at end of file