package grpc
import (
)
type ccResolverWrapper struct {
cc *ClientConn
resolverMu sync.Mutex
resolver resolver.Resolver
done *grpcsync.Event
curState resolver.State
incomingMu sync.Mutex
}
func ( *ClientConn, resolver.Builder) (*ccResolverWrapper, error) {
:= &ccResolverWrapper{
cc: ,
done: grpcsync.NewEvent(),
}
var credentials.TransportCredentials
if := .dopts.copts.TransportCredentials; != nil {
= .Clone()
}
:= resolver.BuildOptions{
DisableServiceConfig: .dopts.disableServiceConfig,
DialCreds: ,
CredsBundle: .dopts.copts.CredsBundle,
Dialer: .dopts.copts.Dialer,
}
var error
.resolverMu.Lock()
defer .resolverMu.Unlock()
.resolver, = .Build(.parsedTarget, , )
if != nil {
return nil,
}
return , nil
}
func ( *ccResolverWrapper) ( resolver.ResolveNowOptions) {
.resolverMu.Lock()
if !.done.HasFired() {
.resolver.ResolveNow()
}
.resolverMu.Unlock()
}
func ( *ccResolverWrapper) () {
.resolverMu.Lock()
.resolver.Close()
.done.Fire()
.resolverMu.Unlock()
}
func ( *ccResolverWrapper) ( resolver.State) error {
.incomingMu.Lock()
defer .incomingMu.Unlock()
if .done.HasFired() {
return nil
}
.addChannelzTraceEvent()
.curState =
if := .cc.updateResolverState(.curState, nil); == balancer.ErrBadResolverState {
return balancer.ErrBadResolverState
}
return nil
}
func ( *ccResolverWrapper) ( error) {
.incomingMu.Lock()
defer .incomingMu.Unlock()
if .done.HasFired() {
return
}
channelz.Warningf(logger, .cc.channelzID, "ccResolverWrapper: reporting error to cc: %v", )
.cc.updateResolverState(resolver.State{}, )
}
func ( *ccResolverWrapper) ( []resolver.Address) {
.incomingMu.Lock()
defer .incomingMu.Unlock()
if .done.HasFired() {
return
}
.addChannelzTraceEvent(resolver.State{Addresses: , ServiceConfig: .curState.ServiceConfig})
.curState.Addresses =
.cc.updateResolverState(.curState, nil)
}
func ( *ccResolverWrapper) ( string) {
.incomingMu.Lock()
defer .incomingMu.Unlock()
if .done.HasFired() {
return
}
channelz.Infof(logger, .cc.channelzID, "ccResolverWrapper: got new service config: %s", )
if .cc.dopts.disableServiceConfig {
channelz.Info(logger, .cc.channelzID, "Service config lookups disabled; ignoring config")
return
}
:= parseServiceConfig()
if .Err != nil {
channelz.Warningf(logger, .cc.channelzID, "ccResolverWrapper: error parsing service config: %v", .Err)
return
}
.addChannelzTraceEvent(resolver.State{Addresses: .curState.Addresses, ServiceConfig: })
.curState.ServiceConfig =
.cc.updateResolverState(.curState, nil)
}
func ( *ccResolverWrapper) ( string) *serviceconfig.ParseResult {
return parseServiceConfig()
}
func ( *ccResolverWrapper) ( resolver.State) {
var []string
var , *ServiceConfig
var , bool
if .curState.ServiceConfig != nil {
, = .curState.ServiceConfig.Config.(*ServiceConfig)
}
if .ServiceConfig != nil {
, = .ServiceConfig.Config.(*ServiceConfig)
}
if != || ( && && .rawJSONString != .rawJSONString) {
= append(, "service config updated")
}
if len(.curState.Addresses) > 0 && len(.Addresses) == 0 {
= append(, "resolver returned an empty address list")
} else if len(.curState.Addresses) == 0 && len(.Addresses) > 0 {
= append(, "resolver returned new addresses")
}
channelz.Infof(logger, .cc.channelzID, "Resolver state updated: %s (%v)", pretty.ToJSON(), strings.Join(, "; "))
}