...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package rafthttp
16
17 import (
18 "net/url"
19 "sync"
20
21 "go.etcd.io/etcd/client/pkg/v3/types"
22 )
23
24 type urlPicker struct {
25 mu sync.Mutex
26 urls types.URLs
27 picked int
28 }
29
30 func newURLPicker(urls types.URLs) *urlPicker {
31 return &urlPicker{
32 urls: urls,
33 }
34 }
35
36 func (p *urlPicker) update(urls types.URLs) {
37 p.mu.Lock()
38 defer p.mu.Unlock()
39 p.urls = urls
40 p.picked = 0
41 }
42
43 func (p *urlPicker) pick() url.URL {
44 p.mu.Lock()
45 defer p.mu.Unlock()
46 return p.urls[p.picked]
47 }
48
49
50
51 func (p *urlPicker) unreachable(u url.URL) {
52 p.mu.Lock()
53 defer p.mu.Unlock()
54 if u == p.urls[p.picked] {
55 p.picked = (p.picked + 1) % len(p.urls)
56 }
57 }
58
View as plain text