Lines Matching refs:rr

144 func (rr *roundRobin) watchAddrUpdates() error {
145 updates, err := rr.w.Next()
150 rr.mu.Lock()
151 defer rr.mu.Unlock()
160 for _, v := range rr.addrs {
170 rr.addrs = append(rr.addrs, &addrInfo{addr: addr})
172 for i, v := range rr.addrs {
174 copy(rr.addrs[i:], rr.addrs[i+1:])
175 rr.addrs = rr.addrs[:len(rr.addrs)-1]
184 open := make([]Address, len(rr.addrs))
185 for i, v := range rr.addrs {
188 if rr.done {
192 case <-rr.addrCh:
195 rr.addrCh <- open
199 func (rr *roundRobin) Start(target string, config BalancerConfig) error {
200 rr.mu.Lock()
201 defer rr.mu.Unlock()
202 if rr.done {
205 if rr.r == nil {
209 rr.addrs = append(rr.addrs, &addrInfo{addr: Address{Addr: target}})
212 w, err := rr.r.Resolve(target)
216 rr.w = w
217 rr.addrCh = make(chan []Address, 1)
220 if err := rr.watchAddrUpdates(); err != nil {
230 func (rr *roundRobin) Up(addr Address) func(error) {
231 rr.mu.Lock()
232 defer rr.mu.Unlock()
234 for _, a := range rr.addrs {
246 if cnt == 1 && rr.waitCh != nil {
247 close(rr.waitCh)
248 rr.waitCh = nil
251 rr.down(addr, err)
256 func (rr *roundRobin) down(addr Address, err error) {
257 rr.mu.Lock()
258 defer rr.mu.Unlock()
259 for _, a := range rr.addrs {
268 func (rr *roundRobin) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), …
270 rr.mu.Lock()
271 if rr.done {
272 rr.mu.Unlock()
277 if len(rr.addrs) > 0 {
278 if rr.next >= len(rr.addrs) {
279 rr.next = 0
281 next := rr.next
283 a := rr.addrs[next]
284 next = (next + 1) % len(rr.addrs)
287 rr.next = next
288 rr.mu.Unlock()
291 if next == rr.next {
298 if len(rr.addrs) == 0 {
299 rr.mu.Unlock()
304 addr = rr.addrs[rr.next].addr
305 rr.next++
306 rr.mu.Unlock()
310 if rr.waitCh == nil {
312 rr.waitCh = ch
314 ch = rr.waitCh
316 rr.mu.Unlock()
323 rr.mu.Lock()
324 if rr.done {
325 rr.mu.Unlock()
330 if len(rr.addrs) > 0 {
331 if rr.next >= len(rr.addrs) {
332 rr.next = 0
334 next := rr.next
336 a := rr.addrs[next]
337 next = (next + 1) % len(rr.addrs)
340 rr.next = next
341 rr.mu.Unlock()
344 if next == rr.next {
351 if rr.waitCh == nil {
353 rr.waitCh = ch
355 ch = rr.waitCh
357 rr.mu.Unlock()
362 func (rr *roundRobin) Notify() <-chan []Address {
363 return rr.addrCh
366 func (rr *roundRobin) Close() error {
367 rr.mu.Lock()
368 defer rr.mu.Unlock()
369 if rr.done {
372 rr.done = true
373 if rr.w != nil {
374 rr.w.Close()
376 if rr.waitCh != nil {
377 close(rr.waitCh)
378 rr.waitCh = nil
380 if rr.addrCh != nil {
381 close(rr.addrCh)