enterIdleMode puts the channel in idle mode, and as part of it shuts down the name resolver, load balancer, and any subchannels. This should never be called directly; use cc.idlenessMgr.EnterIdleMode instead.
()
| 437 | // name resolver, load balancer, and any subchannels. This should never be |
| 438 | // called directly; use cc.idlenessMgr.EnterIdleMode instead. |
| 439 | func (cc *ClientConn) enterIdleMode() { |
| 440 | cc.mu.Lock() |
| 441 | |
| 442 | if cc.conns == nil { |
| 443 | cc.mu.Unlock() |
| 444 | return |
| 445 | } |
| 446 | |
| 447 | conns := cc.conns |
| 448 | |
| 449 | rWrapper := cc.resolverWrapper |
| 450 | rWrapper.close() |
| 451 | cc.pickerWrapper.reset() |
| 452 | bWrapper := cc.balancerWrapper |
| 453 | bWrapper.close() |
| 454 | cc.csMgr.updateState(connectivity.Idle) |
| 455 | cc.addTraceEvent("entering idle mode") |
| 456 | |
| 457 | cc.initIdleStateLocked() |
| 458 | |
| 459 | cc.mu.Unlock() |
| 460 | |
| 461 | // Block until the name resolver and LB policy are closed. |
| 462 | <-rWrapper.serializer.Done() |
| 463 | <-bWrapper.serializer.Done() |
| 464 | |
| 465 | // Close all subchannels after the LB policy is closed. |
| 466 | for ac := range conns { |
| 467 | ac.tearDown(errConnIdling) |
| 468 | } |
| 469 | } |
| 470 | |
| 471 | // validateTransportCredentials performs a series of checks on the configured |
| 472 | // transport credentials. It returns a non-nil error if any of these conditions |
no test coverage detected