From d2bea3023fc9e7a2f43ed700f9b16f2de9f577f9 Mon Sep 17 00:00:00 2001 From: Larry Safran Date: Wed, 12 Feb 2025 15:16:14 -0800 Subject: [PATCH] don't process resourceDoesNotExist for watchers that have been cancelled. --- .../java/io/grpc/xds/XdsDependencyManager.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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(); }