File tree

4 files changed

+64
-1
lines changed

4 files changed

+64
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,16 @@
147147
<method>com.google.api.gax.paging.Page listDatabases()</method>
148148
</difference>
149149

150+
<!-- Adding operation RPCs to InstanceAdminClient. -->
151+
<difference>
152+
<differenceType>7012</differenceType>
153+
<className>com/google/cloud/spanner/InstanceAdminClient</className>
154+
<method>void cancelOperation(java.lang.String)</method>
155+
</difference>
156+
<difference>
157+
<differenceType>7012</differenceType>
158+
<className>com/google/cloud/spanner/InstanceAdminClient</className>
159+
<method>com.google.longrunning.Operation getOperation(java.lang.String)</method>
160+
</difference>
161+
150162
</differences>
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.api.gax.paging.Page;
2121
import com.google.cloud.Policy;
2222
import com.google.cloud.spanner.Options.ListOption;
23+
import com.google.longrunning.Operation;
2324
import com.google.spanner.admin.instance.v1.CreateInstanceMetadata;
2425
import com.google.spanner.admin.instance.v1.UpdateInstanceMetadata;
2526

@@ -217,4 +218,10 @@ OperationFuture<Instance, UpdateInstanceMetadata> updateInstance(
217218

218219
/** Returns a builder for {@code Instance} object with the given id. */
219220
Instance.Builder newInstanceBuilder(InstanceId id);
221+
222+
/** Cancels the specified long-running operation. */
223+
void cancelOperation(String name);
224+
225+
/** Gets the specified long-running operation. */
226+
Operation getOperation(String name);
220227
}
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.google.cloud.spanner.spi.v1.SpannerRpc;
3131
import com.google.cloud.spanner.spi.v1.SpannerRpc.Paginated;
3232
import com.google.common.base.Preconditions;
33+
import com.google.longrunning.Operation;
3334
import com.google.protobuf.FieldMask;
3435
import com.google.spanner.admin.instance.v1.CreateInstanceMetadata;
3536
import com.google.spanner.admin.instance.v1.UpdateInstanceMetadata;
@@ -220,4 +221,14 @@ public Iterable<String> testInstanceIAMPermissions(
220221
public Instance.Builder newInstanceBuilder(InstanceId id) {
221222
return new Instance.Builder(this, dbClient, id);
222223
}
224+
225+
@Override
226+
public void cancelOperation(String name) {
227+
rpc.cancelOperation(Preconditions.checkNotNull(name));
228+
}
229+
230+
@Override
231+
public Operation getOperation(String name) {
232+
return rpc.getOperation(Preconditions.checkNotNull(name));
233+
}
223234
}
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import com.google.cloud.spanner.testing.RemoteSpannerHelper;
2323
import com.google.common.collect.Iterators;
2424
import com.google.spanner.admin.instance.v1.CreateInstanceMetadata;
25+
import io.grpc.Status;
26+
import java.util.Random;
2527
import java.util.concurrent.TimeUnit;
2628
import java.util.logging.Level;
2729
import java.util.logging.Logger;
@@ -82,7 +84,10 @@ protected void before() throws Throwable {
8284
isOwnedInstance = false;
8385
logger.log(Level.INFO, "Using existing test instance: {0}", instanceId);
8486
} else {
85-
instanceId = InstanceId.of(config.spannerOptions().getProjectId(), "test-instance");
87+
instanceId =
88+
InstanceId.of(
89+
config.spannerOptions().getProjectId(),
90+
String.format("test-instance-%08d", new Random().nextInt(100000000)));
8691
isOwnedInstance = true;
8792
}
8893
testHelper = createTestHelper(options, instanceId);
@@ -123,6 +128,34 @@ private void initializeInstance(InstanceId instanceId) {
123128
try {
124129
createdInstance = op.get(30000L, TimeUnit.MILLISECONDS);
125130
} catch (Exception e) {
131+
boolean cancelled = false;
132+
try {
133+
// Try to cancel the createInstance operation.
134+
instanceAdminClient.cancelOperation(op.getName());
135+
com.google.longrunning.Operation createOperation =
136+
instanceAdminClient.getOperation(op.getName());
137+
cancelled =
138+
createOperation.hasError()
139+
&& createOperation.getError().getCode() == Status.CANCELLED.getCode().value();
140+
if (cancelled) {
141+
logger.info("Cancelled the createInstance operation because the operation failed");
142+
} else {
143+
logger.info(
144+
"Tried to cancel the createInstance operation because the operation failed, but the operation could not be cancelled. Current status: "
145+
+ createOperation.getError().getCode());
146+
}
147+
} catch (Throwable t) {
148+
logger.log(Level.WARNING, "Failed to cancel the createInstance operation", t);
149+
}
150+
if (!cancelled) {
151+
try {
152+
instanceAdminClient.deleteInstance(instanceId.getInstance());
153+
logger.info(
154+
"Deleted the test instance because the createInstance operation failed and cancelling the operation did not succeed");
155+
} catch (Throwable t) {
156+
logger.log(Level.WARNING, "Failed to delete the test instance", t);
157+
}
158+
}
126159
throw SpannerExceptionFactory.newSpannerException(e);
127160
}
128161
logger.log(Level.INFO, "Created test instance: {0}", createdInstance.getId());

0 commit comments

Comments
 (0)