diff --git a/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java b/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java index 4adfebfe74d..7eff0c549e2 100644 --- a/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java +++ b/xds/src/main/java/io/grpc/xds/XdsDependencyManager.java @@ -149,6 +149,7 @@ private void cancelWatcher(XdsWatcherBase watcher) throwIfParentContextsNotEmpty(watcher); } + watcher.cancelled = true; XdsResourceType type = watcher.type; String resourceName = watcher.resourceName; @@ -597,6 +598,8 @@ private abstract static class XdsWatcherBase implements ResourceWatcher { private final XdsResourceType type; private final String resourceName; + boolean cancelled; + @Nullable private StatusOr data; @@ -693,6 +696,10 @@ public void onError(Status error) { @Override public void onResourceDoesNotExist(String resourceName) { + if (cancelled) { + return; + } + handleDoesNotExist(resourceName); xdsConfigWatcher.onResourceDoesNotExist(toContextString()); } @@ -752,6 +759,9 @@ public void onError(Status error) { @Override public void onResourceDoesNotExist(String resourceName) { + if (cancelled) { + return; + } handleDoesNotExist(checkNotNull(resourceName, "resourceName")); xdsConfigWatcher.onResourceDoesNotExist(toContextString()); } @@ -836,6 +846,9 @@ public void onChanged(XdsClusterResource.CdsUpdate update) { @Override public void onResourceDoesNotExist(String resourceName) { + if (cancelled) { + return; + } handleDoesNotExist(checkNotNull(resourceName, "resourceName")); maybePublishConfig(); } @@ -857,6 +870,9 @@ public void onChanged(XdsEndpointResource.EdsUpdate update) { @Override public void onResourceDoesNotExist(String resourceName) { + if (cancelled) { + return; + } handleDoesNotExist(checkNotNull(resourceName, "resourceName")); maybePublishConfig(); }