Source File
balancer_conn_wrappers.go
Belonging Package
google.golang.org/grpc
package grpc
import (
)
type scStateUpdate struct {
sc balancer.SubConn
state connectivity.State
err error
}
type ccBalancerWrapper struct {
cc *ClientConn
balancerMu sync.Mutex // synchronizes calls to the balancer
balancer balancer.Balancer
scBuffer *buffer.Unbounded
done *grpcsync.Event
mu sync.Mutex
subConns map[*acBalancerWrapper]struct{}
}
func ( *ClientConn, balancer.Builder, balancer.BuildOptions) *ccBalancerWrapper {
:= &ccBalancerWrapper{
cc: ,
scBuffer: buffer.NewUnbounded(),
done: grpcsync.NewEvent(),
subConns: make(map[*acBalancerWrapper]struct{}),
}
go .watcher()
.balancer = .Build(, )
return
}
func ( *ccBalancerWrapper) () {
for {
select {
case := <-.scBuffer.Get():
.scBuffer.Load()
if .done.HasFired() {
break
}
.balancerMu.Lock()
:= .(*scStateUpdate)
.balancer.UpdateSubConnState(.sc, balancer.SubConnState{ConnectivityState: .state, ConnectionError: .err})
.balancerMu.Unlock()
case <-.done.Done():
}
if .done.HasFired() {
.balancer.Close()
.mu.Lock()
:= .subConns
.subConns = nil
.mu.Unlock()
for := range {
.cc.removeAddrConn(.getAddrConn(), errConnDrain)
}
.UpdateState(balancer.State{ConnectivityState: connectivity.Connecting, Picker: nil})
return
}
}
}
func ( *ccBalancerWrapper) () {
.done.Fire()
}
if == nil {
return
}
.scBuffer.Put(&scStateUpdate{
sc: ,
state: ,
err: ,
})
}
func ( *ccBalancerWrapper) ( *balancer.ClientConnState) error {
.balancerMu.Lock()
defer .balancerMu.Unlock()
return .balancer.UpdateClientConnState(*)
}
func ( *ccBalancerWrapper) ( error) {
.balancerMu.Lock()
.balancer.ResolverError()
.balancerMu.Unlock()
}
func ( *ccBalancerWrapper) ( []resolver.Address, balancer.NewSubConnOptions) (balancer.SubConn, error) {
if len() <= 0 {
return nil, fmt.Errorf("grpc: cannot create SubConn with empty address list")
}
.mu.Lock()
defer .mu.Unlock()
if .subConns == nil {
return nil, fmt.Errorf("grpc: ClientConn balancer wrapper was closed")
}
, := .cc.newAddrConn(, )
if != nil {
return nil,
}
:= &acBalancerWrapper{ac: }
.ac.mu.Lock()
.acbw =
.ac.mu.Unlock()
.subConns[] = struct{}{}
return , nil
}
func ( *ccBalancerWrapper) ( balancer.SubConn) {
, := .(*acBalancerWrapper)
if ! {
return
}
.mu.Lock()
defer .mu.Unlock()
if .subConns == nil {
return
}
delete(.subConns, )
.cc.removeAddrConn(.getAddrConn(), errConnDrain)
}
func ( *ccBalancerWrapper) ( balancer.State) {
.mu.Lock()
defer .mu.Unlock()
if .subConns == nil {
return
.cc.blockingpicker.updatePicker(.Picker)
.cc.csMgr.updateState(.ConnectivityState)
}
func ( *ccBalancerWrapper) ( resolver.ResolveNowOptions) {
.cc.resolveNow()
}
func ( *ccBalancerWrapper) () string {
return .cc.target
}
.ac.acbw = nil
.ac.mu.Unlock()
:= .ac.getState()
.ac.tearDown(errConnDrain)
if == connectivity.Shutdown {
return
}
, := .newAddrConn(, )
if != nil {
channelz.Warningf(logger, .ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", )
return
}
.ac =
.mu.Lock()
.acbw =
.mu.Unlock()
if != connectivity.Idle {
.connect()
}
}
}
func ( *acBalancerWrapper) () {
.mu.Lock()
defer .mu.Unlock()
.ac.connect()
}
func ( *acBalancerWrapper) () *addrConn {
.mu.Lock()
defer .mu.Unlock()
return .ac
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |