code: @VisibleForTesting
    void exitIdleMode() {
      syncContext.throwIfNotInThisSynchronizationContext();
      if (shutdown.get() || panicMode) {
        return;
      }
      if (inUseStateAggregator.isInUse()) {
        // Cancel the timer now, so that a racing due timer will not put Channel on idleness
        // when the caller of exitIdleMode() is about to use the returned loadBalancer.
        cancelIdleTimer(false);
      } else {
        // exitIdleMode() may be called outside of inUseStateAggregator.handleNotInUse() while
        // isInUse() == false, in which case we still need to schedule the timer.
        rescheduleIdleTimer();
      }
      if (lbHelper != null) {
        return;
      }
      channelLogger.log(ChannelLogLevel.INFO, "Exiting idle mode");
      LbHelperImpl lbHelper = new LbHelperImpl();
      lbHelper.lb = loadBalancerFactory.newLoadBalancer(lbHelper);
      // Delay setting lbHelper until fully initialized, since loadBalancerFactory is user code and
      // may throw. We don't want to confuse our state, even if we will enter panic mode.
      this.lbHelper = lbHelper;
  
      NameResolverObserver observer = new NameResolverObserver(lbHelper, nameResolver);
      nameResolver.start(observer);
      nameResolverStarted = true;
    }
docs: Make the channel exit idle mode, if it's in it.
  
  <p>Must be called from syncContext