diff --git a/google-cloud-bom/pom.xml b/google-cloud-bom/pom.xml
index b6672db43f90..ede55bdc89e7 100644
--- a/google-cloud-bom/pom.xml
+++ b/google-cloud-bom/pom.xml
@@ -170,9 +170,9 @@
0.43.1-alpha-SNAPSHOT
1.5.0
- 1.23.0
- 1.23.0
- 0.40.0
+ 1.24.0
+ 1.24.0
+ 0.41.0
0.8.0
1.7.0
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java
index b645b75e056a..7558b9cb36c3 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerImpl.java
@@ -266,7 +266,7 @@ Session createSession(final DatabaseId db) throws SpannerException {
new Callable() {
@Override
public com.google.spanner.v1.Session call() throws Exception {
- return rawGrpcRpc.createSession(
+ return gapicRpc.createSession(
db.getName(), getOptions().getSessionLabels(), options);
}
});
@@ -806,7 +806,7 @@ public Timestamp writeAtLeastOnce(Iterable mutations) throws SpannerEx
new Callable() {
@Override
public CommitResponse call() throws Exception {
- return rawGrpcRpc.commit(request, options);
+ return gapicRpc.commit(request, options);
}
});
Timestamp t = Timestamp.fromProto(response.getCommitTimestamp());
@@ -872,7 +872,7 @@ public void close() {
new Callable() {
@Override
public Void call() throws Exception {
- rawGrpcRpc.deleteSession(name, options);
+ gapicRpc.deleteSession(name, options);
return null;
}
});
@@ -898,7 +898,7 @@ ByteString beginTransaction() {
new Callable() {
@Override
public Transaction call() throws Exception {
- return rawGrpcRpc.beginTransaction(request, options);
+ return gapicRpc.beginTransaction(request, options);
}
});
if (txn.getId().isEmpty()) {
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java
index 0872a84f08d9..04c05b64e52a 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java
@@ -18,14 +18,18 @@
import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException;
+import com.google.api.core.ApiFunction;
import com.google.api.gax.core.CredentialsProvider;
import com.google.api.gax.core.GaxProperties;
import com.google.api.gax.grpc.GaxGrpcProperties;
+import com.google.api.gax.grpc.GrpcCallContext;
import com.google.api.gax.grpc.GrpcTransportChannel;
import com.google.api.gax.rpc.ApiClientHeaderProvider;
import com.google.api.gax.rpc.FixedTransportChannelProvider;
import com.google.api.gax.rpc.HeaderProvider;
+import com.google.api.gax.rpc.StatusCode;
import com.google.api.gax.rpc.TransportChannelProvider;
+import com.google.api.gax.rpc.UnaryCallSettings;
import com.google.api.pathtemplate.PathTemplate;
import com.google.cloud.ServiceOptions;
import com.google.cloud.grpc.GrpcTransportOptions;
@@ -43,6 +47,7 @@
import com.google.cloud.spanner.v1.stub.SpannerStub;
import com.google.cloud.spanner.v1.stub.SpannerStubSettings;
import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
import com.google.longrunning.GetOperationRequest;
import com.google.longrunning.Operation;
import com.google.protobuf.FieldMask;
@@ -68,6 +73,8 @@
import com.google.spanner.v1.BeginTransactionRequest;
import com.google.spanner.v1.CommitRequest;
import com.google.spanner.v1.CommitResponse;
+import com.google.spanner.v1.CreateSessionRequest;
+import com.google.spanner.v1.DeleteSessionRequest;
import com.google.spanner.v1.ExecuteSqlRequest;
import com.google.spanner.v1.PartitionQueryRequest;
import com.google.spanner.v1.PartitionReadRequest;
@@ -140,25 +147,59 @@ public GapicSpannerRpc(SpannerOptions options) throws IOException {
.build());
CredentialsProvider credentialsProvider =
GrpcTransportOptions.setUpCredentialsProvider(options);
-
- this.stub =
+
+ // Disabling retry for now because spanner handles retry in SpannerImpl.
+ // We will finally want to improve gax but for smooth transitioning we
+ // preserve the retry in SpannerImpl
+ try {
+ // TODO: bump the version of gax and remove this try-catch block
+ // applyToAllUnaryMethods does not throw exception in the latest version
+ this.stub =
GrpcSpannerStub.create(
SpannerStubSettings.newBuilder()
.setTransportChannelProvider(channelProvider)
.setCredentialsProvider(credentialsProvider)
+ .applyToAllUnaryMethods(
+ new ApiFunction, Void>() {
+ @Override
+ public Void apply(UnaryCallSettings.Builder,?> builder) {
+ builder.setRetryableCodes(ImmutableSet.of());
+ return null;
+ }
+ })
.build());
+
this.instanceStub =
GrpcInstanceAdminStub.create(
InstanceAdminStubSettings.newBuilder()
.setTransportChannelProvider(channelProvider)
.setCredentialsProvider(credentialsProvider)
+ .applyToAllUnaryMethods(
+ new ApiFunction, Void>() {
+ @Override
+ public Void apply(UnaryCallSettings.Builder,?> builder) {
+ builder.setRetryableCodes(ImmutableSet.of());
+ return null;
+ }
+ })
.build());
this.databaseStub =
GrpcDatabaseAdminStub.create(
DatabaseAdminStubSettings.newBuilder()
.setTransportChannelProvider(channelProvider)
.setCredentialsProvider(credentialsProvider)
+ .applyToAllUnaryMethods(
+ new ApiFunction, Void>() {
+ @Override
+ public Void apply(UnaryCallSettings.Builder,?> builder) {
+ builder.setRetryableCodes(ImmutableSet.of());
+ return null;
+ }
+ })
.build());
+ } catch (Exception e) {
+ throw SpannerExceptionFactory.newSpannerException(e);
+ }
}
@Override
@@ -171,9 +212,9 @@ public Paginated listInstanceConfigs(int pageSize, @Nullable Str
}
ListInstanceConfigsRequest request = requestBuilder.build();
- // TODO: put projectName in metadata
+ GrpcCallContext context = newCallContext(null, projectName);
ListInstanceConfigsResponse response =
- get(instanceStub.listInstanceConfigsCallable().futureCall(request));
+ get(instanceStub.listInstanceConfigsCallable().futureCall(request, context));
return new Paginated<>(response.getInstanceConfigsList(), response.getNextPageToken());
}
@@ -182,8 +223,8 @@ public InstanceConfig getInstanceConfig(String instanceConfigName) throws Spanne
GetInstanceConfigRequest request =
GetInstanceConfigRequest.newBuilder().setName(instanceConfigName).build();
- // TODO: put projectName in metadata
- return get(instanceStub.getInstanceConfigCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, projectName);
+ return get(instanceStub.getInstanceConfigCallable().futureCall(request, context));
}
@Override
@@ -199,9 +240,9 @@ public Paginated listInstances(
}
ListInstancesRequest request = requestBuilder.build();
- // TODO: put projectName in metadata
+ GrpcCallContext context = newCallContext(null, projectName);
ListInstancesResponse response =
- get(instanceStub.listInstancesCallable().futureCall(request));
+ get(instanceStub.listInstancesCallable().futureCall(request, context));
return new Paginated<>(response.getInstancesList(), response.getNextPageToken());
}
@@ -214,16 +255,18 @@ public Operation createInstance(String parent, String instanceId, Instance insta
.setInstanceId(instanceId)
.setInstance(instance)
.build();
- // TODO: put parent in metadata
- return get(instanceStub.createInstanceCallable().futureCall(request));
+
+ GrpcCallContext context = newCallContext(null, parent);
+ return get(instanceStub.createInstanceCallable().futureCall(request, context));
}
@Override
public Operation updateInstance(Instance instance, FieldMask fieldMask) throws SpannerException {
UpdateInstanceRequest request =
UpdateInstanceRequest.newBuilder().setInstance(instance).setFieldMask(fieldMask).build();
- // TODO: put instance.getName() in metadata
- return get(instanceStub.updateInstanceCallable().futureCall(request));
+
+ GrpcCallContext context = newCallContext(null, instance.getName());
+ return get(instanceStub.updateInstanceCallable().futureCall(request, context));
}
@Override
@@ -231,8 +274,8 @@ public Instance getInstance(String instanceName) throws SpannerException {
GetInstanceRequest request =
GetInstanceRequest.newBuilder().setName(instanceName).build();
- // TODO: put instanceName in metadata
- return get(instanceStub.getInstanceCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, instanceName);
+ return get(instanceStub.getInstanceCallable().futureCall(request, context));
}
@Override
@@ -240,8 +283,8 @@ public void deleteInstance(String instanceName) throws SpannerException {
DeleteInstanceRequest request =
DeleteInstanceRequest.newBuilder().setName(instanceName).build();
- // TODO: put instanceName in metadata
- get(instanceStub.deleteInstanceCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, instanceName);
+ get(instanceStub.deleteInstanceCallable().futureCall(request, context));
}
@Override
@@ -254,8 +297,9 @@ public Paginated listDatabases(
}
ListDatabasesRequest request = requestBuilder.build();
- // TODO: put instanceName in metadata
- ListDatabasesResponse response = get(databaseStub.listDatabasesCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, instanceName);
+ ListDatabasesResponse response = get(databaseStub.listDatabasesCallable()
+ .futureCall(request, context));
return new Paginated<>(response.getDatabasesList(), response.getNextPageToken());
}
@@ -268,8 +312,8 @@ public Operation createDatabase(String instanceName, String createDatabaseStatem
.setCreateStatement(createDatabaseStatement)
.addAllExtraStatements(additionalStatements)
.build();
- // TODO: put instanceName in metadata
- return get(databaseStub.createDatabaseCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, instanceName);
+ return get(databaseStub.createDatabaseCallable().futureCall(request, context));
}
@Override
@@ -281,8 +325,8 @@ public Operation updateDatabaseDdl(String databaseName, Iterable updateD
.addAllStatements(updateDatabaseStatements)
.setOperationId(MoreObjects.firstNonNull(updateId, ""))
.build();
- // TODO: put databaseName in metadata
- return get(databaseStub.updateDatabaseDdlCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, databaseName);
+ return get(databaseStub.updateDatabaseDdlCallable().futureCall(request, context));
}
@Override
@@ -290,8 +334,8 @@ public void dropDatabase(String databaseName) throws SpannerException {
DropDatabaseRequest request =
DropDatabaseRequest.newBuilder().setDatabase(databaseName).build();
- // TODO: put databaseName in metadata
- get(databaseStub.dropDatabaseCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, databaseName);
+ get(databaseStub.dropDatabaseCallable().futureCall(request, context));
}
@Override
@@ -301,8 +345,8 @@ public Database getDatabase(String databaseName) throws SpannerException {
.setName(databaseName)
.build();
- // TODO: put databaseName in metadata
- return get(databaseStub.getDatabaseCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, databaseName);
+ return get(databaseStub.getDatabaseCallable().futureCall(request, context));
}
@Override
@@ -310,34 +354,47 @@ public List getDatabaseDdl(String databaseName) throws SpannerException
GetDatabaseDdlRequest request =
GetDatabaseDdlRequest.newBuilder().setDatabase(databaseName).build();
- // TODO: put databaseName in metadata
- return get(databaseStub.getDatabaseDdlCallable().futureCall(request))
+ GrpcCallContext context = newCallContext(null, databaseName);
+ return get(databaseStub.getDatabaseDdlCallable().futureCall(request, context))
.getStatementsList();
}
@Override
public Operation getOperation(String name) throws SpannerException {
GetOperationRequest request = GetOperationRequest.newBuilder().setName(name).build();
- // TODO: put name in metadata
- return get(databaseStub.getOperationsStub().getOperationCallable().futureCall(request));
+ GrpcCallContext context = newCallContext(null, name);
+ return get(databaseStub.getOperationsStub().getOperationCallable()
+ .futureCall(request, context));
}
@Override
public Session createSession(String databaseName, @Nullable Map labels,
@Nullable Map