Skip to content

Commit 8468b5c

Browse files
authored
tsan, xds: fix data races in ServerWrapperForXds (#8114)
1 parent b436d0d commit 8468b5c

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

xds/src/main/java/io/grpc/xds/internal/sds/ServerWrapperForXds.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public final class ServerWrapperForXds extends Server {
5656
private XdsServerBuilder.XdsServingStatusListener xdsServingStatusListener;
5757
@Nullable XdsClientWrapperForServerSds.ServerWatcher serverWatcher;
5858
private AtomicBoolean started = new AtomicBoolean();
59-
private ServingState currentServingState;
59+
private volatile ServingState currentServingState;
6060
private final long delayForRetry;
6161
private final TimeUnit timeUnitForDelayForRetry;
6262
private StartRetryTask startRetryTask;
@@ -239,11 +239,13 @@ public void run() {
239239
rebuildAndRestartServer();
240240
}
241241

242-
private synchronized void cleanUpStartRetryTask() {
243-
if (timerService != null) {
244-
timerService = SharedResourceHolder.release(GrpcUtil.TIMER_SERVICE, timerService);
242+
private void cleanUpStartRetryTask() {
243+
synchronized (ServerWrapperForXds.this) {
244+
if (timerService != null) {
245+
timerService = SharedResourceHolder.release(GrpcUtil.TIMER_SERVICE, timerService);
246+
}
247+
startRetryTask = null;
245248
}
246-
startRetryTask = null;
247249
}
248250

249251
public void shutdownNow() {
@@ -290,7 +292,7 @@ private static boolean isPermanentErrorFromXds(Throwable throwable) {
290292

291293
private void cleanupStartRetryTaskAndShutdownDelegateAndXdsClient(boolean shutdownNow) {
292294
Server delegateCopy = null;
293-
synchronized (this) {
295+
synchronized (ServerWrapperForXds.this) {
294296
if (startRetryTask != null) {
295297
startRetryTask.shutdownNow();
296298
}

xds/src/test/java/io/grpc/xds/ServerWrapperForXdsTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,12 @@ public void run() {
9999
}
100100
});
101101
// wait until xdsClientWrapperForServerSds.serverWatchers populated
102-
for (int i = 0; i < 10 && xdsClientWrapperForServerSds.serverWatchers.isEmpty(); i++) {
102+
for (int i = 0; i < 10; i++) {
103+
synchronized (xdsClientWrapperForServerSds.serverWatchers) {
104+
if (!xdsClientWrapperForServerSds.serverWatchers.isEmpty()) {
105+
break;
106+
}
107+
}
103108
Thread.sleep(100L);
104109
}
105110
return settableFuture;

0 commit comments

Comments
 (0)