From 87d0ff663eb32e5eff6aba87bdfed62613cb01d5 Mon Sep 17 00:00:00 2001 From: ZHANG Dapeng Date: Thu, 10 Sep 2020 15:11:19 -0700 Subject: [PATCH] core: fix drainPendingCalls might be called twice Fixing the bug: if two consecutive name resolution updates are queued together in SynchronizationContext, drainPendingCalls() might be called twice and be broken. --- core/src/main/java/io/grpc/internal/ManagedChannelImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java index b3a69bbce9b..10aa197efb6 100644 --- a/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java +++ b/core/src/main/java/io/grpc/internal/ManagedChannelImpl.java @@ -1568,6 +1568,7 @@ public void run() { Status serviceConfigError = configOrError != null ? configOrError.getError() : null; ManagedChannelServiceConfig effectiveServiceConfig; + InternalConfigSelector prevConfigSelector = configSelector.get(); if (!lookUpServiceConfig) { if (validServiceConfig != null) { channelLogger.log( @@ -1639,7 +1640,9 @@ public void run() { re); } } - realChannel.drainPendingCalls(); + if (prevConfigSelector == INITIAL_PENDING_SELECTOR) { + realChannel.drainPendingCalls(); + } Attributes effectiveAttrs = resolutionResult.getAttributes(); // Call LB only if it's not shutdown. If LB is shutdown, lbHelper won't match.