From f27a8f26a8a0fd0bc2a5fa3ed2d590297d93077d Mon Sep 17 00:00:00 2001 From: Chengyuan Zhang Date: Tue, 17 Nov 2020 02:05:48 -0800 Subject: [PATCH] xds: use GC finalization predicate to avoid race between ref enqueued and calling cleanQueue() (#7629) GcFinalization.awaitClear() only guarantees the reference is cleared but no guarantee for the ref is enqueued. This could cause race for calling cleanQueue() in the test. --- .../java/io/grpc/xds/SharedCallCounterMapTest.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/xds/src/test/java/io/grpc/xds/SharedCallCounterMapTest.java b/xds/src/test/java/io/grpc/xds/SharedCallCounterMapTest.java index 992b5cb310..9f2293d3c5 100644 --- a/xds/src/test/java/io/grpc/xds/SharedCallCounterMapTest.java +++ b/xds/src/test/java/io/grpc/xds/SharedCallCounterMapTest.java @@ -19,6 +19,7 @@ package io.grpc.xds; import static com.google.common.truth.Truth.assertThat; import com.google.common.testing.GcFinalization; +import com.google.common.testing.GcFinalization.FinalizationPredicate; import io.grpc.xds.SharedCallCounterMap.CounterReference; import java.util.HashMap; import java.util.Map; @@ -50,9 +51,14 @@ public class SharedCallCounterMapTest { public void autoCleanUp() { @SuppressWarnings("UnusedVariable") AtomicLong counter = map.getOrCreate(CLUSTER, EDS_SERVICE_NAME); - CounterReference ref = counters.get(CLUSTER).get(EDS_SERVICE_NAME); + final CounterReference ref = counters.get(CLUSTER).get(EDS_SERVICE_NAME); counter = null; - GcFinalization.awaitClear(ref); + GcFinalization.awaitDone(new FinalizationPredicate() { + @Override + public boolean isDone() { + return ref.isEnqueued(); + } + }); map.cleanQueue(); assertThat(counters).isEmpty(); }