Skip to content
This repository was archived by the owner on Apr 7, 2026. It is now read-only.

Commit c0689bd

Browse files
committed
attempt to fix tests
1 parent 3a0e71f commit c0689bd

4 files changed

Lines changed: 112 additions & 12 deletions

File tree

google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractResultSet.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -998,11 +998,11 @@ protected PartialResultSet computeNext() {
998998
continue;
999999
}
10001000
span.addAnnotation("Stream broken. Not safe to retry");
1001-
TraceUtil.endSpanWithFailure(span, e);
1001+
TraceUtil.setWithFailure(span, e);
10021002
throw e;
10031003
} catch (RuntimeException e) {
10041004
span.addAnnotation("Stream broken. Not safe to retry");
1005-
TraceUtil.endSpanWithFailure(span, e);
1005+
TraceUtil.setWithFailure(span, e);
10061006
throw e;
10071007
}
10081008
}

google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,10 @@ public TransactionRunner readWriteTransaction() {
165165
try (Scope s = tracer.withSpan(span)) {
166166
return getReadWriteSession().readWriteTransaction();
167167
} catch (RuntimeException e) {
168-
TraceUtil.endSpanWithFailure(span, e);
168+
TraceUtil.setWithFailure(span, e);
169169
throw e;
170+
} finally {
171+
span.end(TraceUtil.END_SPAN_OPTIONS);
170172
}
171173
}
172174

google-cloud-spanner/src/main/java/com/google/cloud/spanner/TransactionRunnerImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,6 @@ public <T> T run(TransactionCallable<T> callable) {
301301
// We also do this unconditionally in case a user has modified the flag when the transaction
302302
// was running.
303303
SessionImpl.hasPendingTransaction.remove();
304-
span.end(TraceUtil.END_SPAN_OPTIONS);
305304
}
306305
}
307306

google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpanTest.java

Lines changed: 107 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@
1919
import static com.google.common.truth.Truth.assertThat;
2020
import static org.junit.Assert.fail;
2121

22+
import com.google.api.core.ApiFunction;
2223
import com.google.api.gax.grpc.testing.LocalChannelProvider;
24+
import com.google.api.gax.retrying.RetrySettings;
25+
import com.google.api.gax.rpc.UnaryCallSettings.Builder;
2326
import com.google.cloud.NoCredentials;
27+
import com.google.cloud.spanner.MockSpannerServiceImpl.SimulatedExecutionTime;
2428
import com.google.cloud.spanner.MockSpannerServiceImpl.StatementResult;
2529
import com.google.cloud.spanner.TransactionRunner.TransactionCallable;
2630
import com.google.protobuf.ListValue;
@@ -30,20 +34,23 @@
3034
import com.google.spanner.v1.TypeCode;
3135
import io.grpc.Server;
3236
import io.grpc.Status;
37+
import io.grpc.StatusRuntimeException;
3338
import io.grpc.inprocess.InProcessServerBuilder;
3439
import io.opencensus.trace.Tracing;
35-
import java.io.IOException;
3640
import java.lang.reflect.Modifier;
3741
import java.util.Map;
3842
import java.util.concurrent.ScheduledThreadPoolExecutor;
3943
import org.junit.After;
4044
import org.junit.AfterClass;
4145
import org.junit.Before;
4246
import org.junit.BeforeClass;
47+
import org.junit.Rule;
4348
import org.junit.Test;
4449
import org.junit.experimental.categories.Category;
50+
import org.junit.rules.ExpectedException;
4551
import org.junit.runner.RunWith;
4652
import org.junit.runners.JUnit4;
53+
import org.threeten.bp.Duration;
4754

4855
@RunWith(JUnit4.class)
4956
@Category(TracerTest.class)
@@ -84,9 +91,36 @@ public class SpanTest {
8491
.build();
8592
private Spanner spanner;
8693
private DatabaseClient client;
94+
private Spanner spannerWithTimeout;
95+
private DatabaseClient clientWithTimeout;
8796
private static FailOnOverkillTraceComponentImpl failOnOverkillTraceComponent =
8897
new FailOnOverkillTraceComponentImpl();
8998

99+
private static final SimulatedExecutionTime ONE_SECOND =
100+
SimulatedExecutionTime.ofMinimumAndRandomTime(1000, 0);
101+
private static final Statement SELECT1AND2 =
102+
Statement.of("SELECT 1 AS COL1 UNION ALL SELECT 2 AS COL1");
103+
private static final ResultSetMetadata SELECT1AND2_METADATA =
104+
ResultSetMetadata.newBuilder()
105+
.setRowType(
106+
StructType.newBuilder()
107+
.addFields(
108+
Field.newBuilder()
109+
.setName("COL1")
110+
.setType(
111+
com.google.spanner.v1.Type.newBuilder()
112+
.setCode(TypeCode.INT64)
113+
.build())
114+
.build())
115+
.build())
116+
.build();
117+
private static final StatusRuntimeException FAILED_PRECONDITION =
118+
io.grpc.Status.FAILED_PRECONDITION
119+
.withDescription("Non-retryable test exception.")
120+
.asRuntimeException();
121+
122+
@Rule public ExpectedException expectedException = ExpectedException.none();
123+
90124
@BeforeClass
91125
public static void startStaticServer() throws Exception {
92126
mockSpanner = new MockSpannerServiceImpl();
@@ -126,27 +160,93 @@ public static void stopServer() throws InterruptedException {
126160
}
127161

128162
@Before
129-
public void setUp() throws IOException {
130-
spanner =
163+
public void setUp() throws Exception {
164+
SpannerOptions.Builder builder =
131165
SpannerOptions.newBuilder()
132166
.setProjectId(TEST_PROJECT)
133167
.setChannelProvider(channelProvider)
134168
.setCredentials(NoCredentials.getInstance())
135-
.setSessionPoolOption(SessionPoolOptions.newBuilder().setMinSessions(0).build())
136-
.build()
137-
.getService();
169+
.setSessionPoolOption(SessionPoolOptions.newBuilder().setMinSessions(0).build());
170+
171+
spanner = builder.build().getService();
172+
138173
client = spanner.getDatabaseClient(DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE));
139174

175+
final RetrySettings retrySettings =
176+
RetrySettings.newBuilder()
177+
.setInitialRetryDelay(Duration.ofMillis(1L))
178+
.setMaxRetryDelay(Duration.ofMillis(1L))
179+
.setInitialRpcTimeout(Duration.ofMillis(75L))
180+
.setMaxRpcTimeout(Duration.ofMillis(75L))
181+
.setMaxAttempts(3)
182+
.setTotalTimeout(Duration.ofMillis(200L))
183+
.build();
184+
RetrySettings commitRetrySettings =
185+
RetrySettings.newBuilder()
186+
.setInitialRetryDelay(Duration.ofMillis(1L))
187+
.setMaxRetryDelay(Duration.ofMillis(1L))
188+
.setInitialRpcTimeout(Duration.ofMillis(5000L))
189+
.setMaxRpcTimeout(Duration.ofMillis(10000L))
190+
.setMaxAttempts(1)
191+
.setTotalTimeout(Duration.ofMillis(20000L))
192+
.build();
193+
builder
194+
.getSpannerStubSettingsBuilder()
195+
.applyToAllUnaryMethods(
196+
new ApiFunction<Builder<?, ?>, Void>() {
197+
@Override
198+
public Void apply(Builder<?, ?> input) {
199+
input.setRetrySettings(retrySettings);
200+
return null;
201+
}
202+
});
203+
builder
204+
.getSpannerStubSettingsBuilder()
205+
.executeStreamingSqlSettings()
206+
.setRetrySettings(retrySettings);
207+
builder.getSpannerStubSettingsBuilder().commitSettings().setRetrySettings(commitRetrySettings);
208+
builder
209+
.getSpannerStubSettingsBuilder()
210+
.executeStreamingSqlSettings()
211+
.setRetrySettings(retrySettings);
212+
builder.getSpannerStubSettingsBuilder().streamingReadSettings().setRetrySettings(retrySettings);
213+
spannerWithTimeout = builder.build().getService();
214+
clientWithTimeout =
215+
spannerWithTimeout.getDatabaseClient(
216+
DatabaseId.of(TEST_PROJECT, TEST_INSTANCE, TEST_DATABASE));
217+
140218
failOnOverkillTraceComponent.clearSpans();
141219
}
142220

143221
@After
144-
public void tearDown() throws Exception {
222+
public void tearDown() {
145223
spanner.close();
146224
mockSpanner.reset();
147225
mockSpanner.removeAllExecutionTimes();
148226
}
149227

228+
@Test
229+
public void singleUseNonRetryableErrorOnNext() {
230+
expectedException.expect(SpannerMatchers.isSpannerException(ErrorCode.FAILED_PRECONDITION));
231+
try (ResultSet rs = client.singleUse().executeQuery(SELECT1AND2)) {
232+
mockSpanner.addException(FAILED_PRECONDITION);
233+
while (rs.next()) {
234+
// Just consume the result set.
235+
}
236+
}
237+
}
238+
239+
@Test
240+
public void singleUseExecuteStreamingSqlTimeout() {
241+
expectedException.expect(SpannerMatchers.isSpannerException(ErrorCode.DEADLINE_EXCEEDED));
242+
try (ResultSet rs = clientWithTimeout.singleUse().executeQuery(SELECT1AND2)) {
243+
mockSpanner.setExecuteStreamingSqlExecutionTime(ONE_SECOND);
244+
while (rs.next()) {
245+
// Just consume the result set.
246+
}
247+
}
248+
}
249+
150250
@Test
151251
public void singleUse() {
152252
try (ResultSet rs = client.singleUse().executeQuery(SELECT1)) {
@@ -193,7 +293,6 @@ public Void run(TransactionContext transaction) throws Exception {
193293
return null;
194294
}
195295
});
196-
197296
Map<String, Boolean> spans = failOnOverkillTraceComponent.getSpans();
198297
assertThat(spans.size()).isEqualTo(6);
199298
assertThat(spans).containsEntry("CloudSpanner.ReadWriteTransaction", true);

0 commit comments

Comments
 (0)