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.
This commit is contained in:
Eric Anderson 2025-03-05 13:29:55 -08:00
parent bc3c764058
commit bb120a8cbb
1 changed files with 11 additions and 7 deletions

View File

@ -537,17 +537,21 @@ final class XdsNameResolver extends NameResolver {
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());
}
}
});