...
1 package etcdv3
2
3 import (
4 "sync"
5 "time"
6
7 "github.com/go-kit/log"
8 )
9
10 const minHeartBeatTime = 500 * time.Millisecond
11
12
13 type Registrar struct {
14 client Client
15 service Service
16 logger log.Logger
17
18 quitmtx sync.Mutex
19 quit chan struct{}
20 }
21
22
23
24
25 type Service struct {
26 Key string
27 Value string
28 TTL *TTLOption
29 }
30
31
32
33 type TTLOption struct {
34 heartbeat time.Duration
35 ttl time.Duration
36 }
37
38
39
40
41
42
43
44 func NewTTLOption(heartbeat, ttl time.Duration) *TTLOption {
45 if heartbeat <= minHeartBeatTime {
46 heartbeat = minHeartBeatTime
47 }
48 if ttl <= heartbeat {
49 ttl = 3 * heartbeat
50 }
51 return &TTLOption{
52 heartbeat: heartbeat,
53 ttl: ttl,
54 }
55 }
56
57
58
59 func NewRegistrar(client Client, service Service, logger log.Logger) *Registrar {
60 return &Registrar{
61 client: client,
62 service: service,
63 logger: log.With(logger, "key", service.Key, "value", service.Value),
64 }
65 }
66
67
68
69 func (r *Registrar) Register() {
70 if err := r.client.Register(r.service); err != nil {
71 r.logger.Log("err", err)
72 return
73 }
74 if r.service.TTL != nil {
75 r.logger.Log("action", "register", "lease", r.client.LeaseID())
76 } else {
77 r.logger.Log("action", "register")
78 }
79 }
80
81
82
83 func (r *Registrar) Deregister() {
84 if err := r.client.Deregister(r.service); err != nil {
85 r.logger.Log("err", err)
86 } else {
87 r.logger.Log("action", "deregister")
88 }
89
90 r.quitmtx.Lock()
91 defer r.quitmtx.Unlock()
92 if r.quit != nil {
93 close(r.quit)
94 r.quit = nil
95 }
96 }
97
View as plain text