From 77461e0f0bec9b8f5992c6f9c48387ece960eddb Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Wed, 5 Mar 2025 13:29:55 -0800 Subject: [PATCH] xds: Assert XdsNR's cluster ref counting is consistent It is much harder to debug refcounting problems when we ignore impossible situations. So make such impossible cases complain loudly so the bug is obvious. --- .../main/java/io/grpc/xds/XdsNameResolver.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java index 123d3a77172..bbe36bdd744 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java @@ -537,17 +537,21 @@ private boolean retainCluster(String cluster) { private void releaseCluster(final String cluster) { int count = clusterRefs.get(cluster).refCount.decrementAndGet(); + if (count < 0) { + throw new AssertionError(); + } if (count == 0) { syncContext.execute(new Runnable() { @Override public void run() { - if (clusterRefs.get(cluster).refCount.get() == 0) { - clusterRefs.remove(cluster); - if (resolveState.lastConfigOrStatus.hasValue()) { - updateResolutionResult(resolveState.lastConfigOrStatus.getValue()); - } else { - resolveState.cleanUpRoutes(resolveState.lastConfigOrStatus.getStatus()); - } + if (clusterRefs.get(cluster).refCount.get() != 0) { + throw new AssertionError(); + } + clusterRefs.remove(cluster); + if (resolveState.lastConfigOrStatus.hasValue()) { + updateResolutionResult(resolveState.lastConfigOrStatus.getValue()); + } else { + resolveState.cleanUpRoutes(resolveState.lastConfigOrStatus.getStatus()); } } });