@@ -25,6 +25,7 @@ import (
25
25
26
26
"google.golang.org/grpc/balancer"
27
27
"google.golang.org/grpc/resolver"
28
+ "google.golang.org/grpc/resolver/manual"
28
29
)
29
30
30
31
// The parent ClientConn should re-resolve when grpclb loses connection to the
@@ -60,50 +61,41 @@ import (
60
61
// so when grpclb client lose contact with remote balancers, the parent
61
62
// ClientConn's resolver will re-resolve.
62
63
type lbManualResolver struct {
63
- scheme string
64
- ccr resolver. ClientConn
65
- ccb balancer. ClientConn
66
-
67
- // Cache the most recently received state update via UpdateState(), and push
68
- // the same when Build() is invoked. This ensures that this manual resolver
69
- // can handle restarts when channel idleness comes into the picture.
70
- stateMu sync. Mutex
71
- lastState resolver. State
72
- stateUpdateRecv bool
73
- }
74
-
75
- func ( r * lbManualResolver ) Build ( _ resolver. Target , cc resolver .ClientConn , _ resolver. BuildOptions ) (resolver. Resolver , error ) {
76
- r . ccr = cc
77
-
78
- r . stateMu . Lock ()
79
- if r . stateUpdateRecv {
80
- r . ccr . UpdateState ( r . lastState )
64
+ // These fields are setup at creation time and are read-only after that, and
65
+ // therefore need not be protected with a mutex.
66
+ resolver. Builder // The underlying manual resolver builder.
67
+ resolver. Resolver // The underlying manual resolver.
68
+ ccb balancer. ClientConn // ClientConn passed to the parent channel.
69
+
70
+ // The resolver.ClientConn is updated everytime the resolver on the channel
71
+ // is restarted, and this happens when the channel exits IDLE.
72
+ mu sync. Mutex
73
+ ccr resolver. ClientConn
74
+ }
75
+
76
+ func newManualResolver ( scheme string , ccb balancer .ClientConn ) * lbManualResolver {
77
+ mr := manual . NewBuilderWithScheme ( scheme )
78
+ r := & lbManualResolver {
79
+ Builder : mr ,
80
+ Resolver : mr ,
81
+ ccb : ccb ,
81
82
}
82
- r .stateMu .Unlock ()
83
83
84
- return r , nil
85
- }
86
-
87
- func (r * lbManualResolver ) Scheme () string {
88
- return r .scheme
89
- }
90
-
91
- // ResolveNow calls resolveNow on the parent ClientConn.
92
- func (r * lbManualResolver ) ResolveNow (o resolver.ResolveNowOptions ) {
93
- r .ccb .ResolveNow (o )
84
+ mr .BuildCallback = func (_ resolver.Target , ccr resolver.ClientConn , _ resolver.BuildOptions ) {
85
+ r .mu .Lock ()
86
+ r .ccr = ccr
87
+ r .mu .Unlock ()
88
+ }
89
+ mr .ResolveNowCallback = func (o resolver.ResolveNowOptions ) {
90
+ r .ccb .ResolveNow (o )
91
+ }
92
+ return r
94
93
}
95
94
96
- // Close is a noop for Resolver.
97
- func (* lbManualResolver ) Close () {}
98
-
99
- // UpdateState calls cc.UpdateState.
100
95
func (r * lbManualResolver ) UpdateState (s resolver.State ) {
101
- r .stateMu .Lock ()
102
- r .lastState = s
103
- r .stateUpdateRecv = true
104
- r .stateMu .Unlock ()
105
-
96
+ r .mu .Lock ()
106
97
r .ccr .UpdateState (s )
98
+ r .mu .Unlock ()
107
99
}
108
100
109
101
const subConnCacheTime = time .Second * 10
0 commit comments