99
}
100
101
>
func (m *grpcBuilder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (resolver.Resolver, error) {
grpc_resolver.go
102
>
serviceResolver, err := m.getServiceResolver(&target.URL)
103
>
if err != nil {
104
return nil, err
105
}
107
>
cc: cc,
108
>
r: serviceResolver,
109
>
notifyCh: make(chan *ChangedEvent, 1),
110
>
}
111
>
if err := grpcResolver.start(); err != nil {
112
return nil, err
113
}
115
}
116
118
>
if err := m.r.AddListener(fmt.Sprintf("%p", m), m.notifyCh); err != nil {
119
return err
120
}
122
>
go m.listen()
123
>
124
>
// Try once to get address synchronously. If this fails, it's okay, we'll listen for
125
>
// changes and update the resolver later.
126
>
m.resolve()
127
>
return nil
128
}
129
131
>
for range m.notifyCh {
132
>
m.resolve()
133
>
}
134
m.wg.Done()
135
}
136
138
>
members := m.r.AvailableMembers()
139
>
if len(members) == 0 {
140
// grpc considers it an error if we report no addresses, and fails the connection eagerly.
141
// Instead, just poke membership and then wait until it notifies us.