diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java index d52d1d892e..fdd2a216c8 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClient.java @@ -24,6 +24,9 @@ */ public interface DatabaseClient { + /** Only for testing */ + String getClientId(); + /** * Writes the given mutations atomically to the database. * diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java index 4dd10001c7..4660309b97 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java @@ -51,6 +51,10 @@ private enum SessionMode { this.pool = pool; } + public String getClientId() { + return clientId; + } + @VisibleForTesting PooledSessionFuture getReadSession() { return pool.getReadSession(); diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java index ce4d27e94e..9d991b2981 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionImpl.java @@ -98,6 +98,10 @@ static interface SessionTransaction { this.databaseId = SessionId.of(name).getDatabaseId(); } + public String getClientId() { + return null; + } + @Override public String getName() { return name; diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java index 90e399fad6..8b63b72dd9 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java @@ -1094,6 +1094,10 @@ private void markCheckedOut() { this.leakedException = new LeakedSessionException(); } + public String getClientId() { + return null; + } + @Override public Timestamp write(Iterable mutations) throws SpannerException { try { @@ -1312,6 +1316,10 @@ private PooledSession(SessionImpl delegate) { this.lastUseTime = clock.instant(); } + public String getClientId() { + return null; + } + @Override public String toString() { return getName(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITClientIdTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITClientIdTest.java new file mode 100644 index 0000000000..b514c4744d --- /dev/null +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITClientIdTest.java @@ -0,0 +1,62 @@ +/* + * Copyright 2020 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 + * + * http://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.it; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.cloud.spanner.DatabaseClient; +import com.google.cloud.spanner.DatabaseId; +import com.google.cloud.spanner.InstanceId; +import com.google.cloud.spanner.IntegrationTestEnv; +import com.google.cloud.spanner.Key; +import com.google.cloud.spanner.ParallelIntegrationTest; +import com.google.cloud.spanner.Spanner; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@Category(ParallelIntegrationTest.class) +@RunWith(JUnit4.class) +public class ITClientIdTest { + @ClassRule public static IntegrationTestEnv env = new IntegrationTestEnv(); + + @Test + public void testClientId() throws Exception { + Spanner spanner = env.getTestHelper().getClient(); + InstanceId instanceId = env.getTestHelper().getInstanceId(); + DatabaseId databaseId = DatabaseId.of(instanceId, "my-database"); + + Set ids = new HashSet<>(); + for (int i = 0; i < 100; i++) { + try { + DatabaseClient client = spanner.getDatabaseClient(databaseId); + ids.add(client.getClientId()); + client.singleUse().readRow("MyTable", Key.of(0), Arrays.asList("MyColumn")); + } catch (Exception e) { + // ignore + } + } + // All the database clients have used the same client id. + assertThat(ids).hasSize(1); + assertThat(ids.iterator().next()).isEqualTo("client-1"); + } +}