From b6f01c68aa56b0a15e6af0e930c926ca8ce770a0 Mon Sep 17 00:00:00 2001
From: "Mark D. Roth" <roth@google.com>
Date: Fri, 15 Sep 2023 12:45:54 -0700
Subject: [PATCH] [pick_first] ignore duplicate calls to ExitIdleLocked()
 (#34374)

---
 .../client_channel/lb_policy/pick_first/pick_first.cc        | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
index be41867712a..86955752a85 100644
--- a/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
+++ b/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc
@@ -317,7 +317,10 @@ void PickFirst::ShutdownLocked() {
 
 void PickFirst::ExitIdleLocked() {
   if (shutdown_) return;
-  if (state_ == GRPC_CHANNEL_IDLE) {
+  // Need to check subchannel_list_ being null here, in case the
+  // application calls channel->GetState(true) again before we
+  // transition to state CONNECTING.
+  if (state_ == GRPC_CHANNEL_IDLE && subchannel_list_ == nullptr) {
     if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
       gpr_log(GPR_INFO, "Pick First %p exiting idle", this);
     }