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

Commit a9f8753

Browse files
authored
test: fix flaky session tests (#2913)
Change-Id: I0d0d51c9df31ffd3224866b2345fc1e5c2531676
1 parent 6b5ed7f commit a9f8753

3 files changed

Lines changed: 46 additions & 20 deletions

File tree

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/session/SessionImplTest.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void sessionCloseBeforeInit() throws Exception {
182182
void sessionGoAwayTest() throws Exception {
183183
SessionImpl session = new SessionImpl(metrics, poolInfo, 0, sessionFactory.createNew());
184184

185-
Duration goAwayDelay = Duration.ofMillis(100);
185+
Duration goAwayDelay = Duration.ofMillis(500);
186186
FakeSessionListener sessionListener = new FakeSessionListener();
187187
session.start(
188188
OpenSessionRequest.newBuilder()
@@ -215,9 +215,14 @@ void sessionGoAwayTest() throws Exception {
215215
try {
216216
f.get();
217217
numOk++;
218-
} catch (VRpcException e) {
219-
if (e.getResult().getState() == State.UNCOMMITED) {
220-
numUncommittedErrors++;
218+
} catch (ExecutionException e) {
219+
if (e.getCause() instanceof VRpcException) {
220+
VRpcException vrpcException = (VRpcException) e.getCause();
221+
if (vrpcException.getResult().getState() == State.UNCOMMITED) {
222+
numUncommittedErrors++;
223+
}
224+
} else {
225+
throw e;
221226
}
222227
}
223228
}

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/session/SessionPoolImplTest.java

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@
7777
import java.io.IOException;
7878
import java.time.Duration;
7979
import java.time.Instant;
80-
import java.util.ArrayList;
8180
import java.util.List;
8281
import java.util.concurrent.CompletableFuture;
82+
import java.util.concurrent.CopyOnWriteArrayList;
8383
import java.util.concurrent.ExecutionException;
8484
import java.util.concurrent.Executors;
8585
import java.util.concurrent.ScheduledExecutorService;
@@ -448,23 +448,44 @@ public void refreshConfigTest() throws Exception {
448448

449449
sessionPool.start(request, new Metadata());
450450

451-
Thread.sleep(500);
451+
long deadline = System.currentTimeMillis() + 10_000;
452+
boolean conditionMet = false;
453+
List<SessionRequest> requests = null;
454+
boolean containsHeader = false;
455+
456+
while (System.currentTimeMillis() < deadline) {
457+
requests = fakeService.getSessionRequests();
458+
List<Metadata> headers = headerInterceptor.getHeadersList();
459+
460+
boolean matchesRefreshRequest = false;
461+
for (SessionRequest r : requests) {
462+
if (OPEN_SESSION_REQUEST_CORRESPONDENCE.compare(r, refreshRequest)) {
463+
matchesRefreshRequest = true;
464+
break;
465+
}
466+
}
467+
468+
containsHeader = false;
469+
for (Metadata header : headers) {
470+
if (header.containsKey(metadataKey) && "refresh_value".equals(header.get(metadataKey))) {
471+
containsHeader = true;
472+
break;
473+
}
474+
}
452475

453-
List<SessionRequest> requests = fakeService.getSessionRequests();
476+
if (requests.size() > 1 && matchesRefreshRequest && containsHeader) {
477+
conditionMet = true;
478+
break;
479+
}
480+
481+
Thread.sleep(50);
482+
}
483+
484+
assertThat(conditionMet).isTrue();
454485
assertThat(requests.size()).isGreaterThan(1);
455486
assertThat(requests)
456487
.comparingElementsUsing(OPEN_SESSION_REQUEST_CORRESPONDENCE)
457488
.contains(refreshRequest);
458-
459-
// Verify headers
460-
List<Metadata> headers = headerInterceptor.getHeadersList();
461-
boolean containsHeader = false;
462-
for (Metadata header : headers) {
463-
if (header.containsKey(metadataKey)) {
464-
containsHeader = true;
465-
assertThat(header.get(metadataKey)).isEqualTo("refresh_value");
466-
}
467-
}
468489
assertThat(containsHeader).isTrue();
469490
}
470491

@@ -519,7 +540,7 @@ public Deadline getObservedDeadline() {
519540
}
520541

521542
private static class HeaderInterceptor implements ServerInterceptor {
522-
private final List<Metadata> headersList = new ArrayList<>();
543+
private final List<Metadata> headersList = new CopyOnWriteArrayList<>();
523544

524545
@Override
525546
public <ReqT, RespT> io.grpc.ServerCall.Listener<ReqT> interceptCall(

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/session/fake/FakeSessionService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import com.google.bigtable.v2.SessionRequest;
2121
import com.google.bigtable.v2.SessionResponse;
2222
import io.grpc.stub.StreamObserver;
23-
import java.util.ArrayList;
2423
import java.util.List;
24+
import java.util.concurrent.CopyOnWriteArrayList;
2525
import java.util.concurrent.ScheduledExecutorService;
2626
import java.util.concurrent.atomic.AtomicInteger;
2727

@@ -30,7 +30,7 @@ public class FakeSessionService extends FakeSessionGrpc.FakeSessionImplBase {
3030
private final ScheduledExecutorService executor;
3131
private final AtomicInteger openRequestCount = new AtomicInteger(0);
3232

33-
private final List<SessionRequest> sessionRequests = new ArrayList<>();
33+
private final List<SessionRequest> sessionRequests = new CopyOnWriteArrayList<>();
3434

3535
public FakeSessionService(ScheduledExecutorService executor) {
3636
this.executor = executor;

0 commit comments

Comments
 (0)