forked from cloudfoundry-attic/app-manager
-
Notifications
You must be signed in to change notification settings - Fork 0
/
presence.go
62 lines (48 loc) · 1.03 KB
/
presence.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package services_bbs
import (
"errors"
"time"
"github.com/cloudfoundry/storeadapter"
)
type Presence interface {
Maintain(interval time.Duration) (status <-chan bool, err error)
Remove()
}
type presence struct {
store storeadapter.StoreAdapter
key string
value []byte
release chan chan bool
}
func NewPresence(store storeadapter.StoreAdapter, key string, value []byte) Presence {
return &presence{
store: store,
key: key,
value: value,
}
}
func (p *presence) Maintain(interval time.Duration) (<-chan bool, error) {
if p.release != nil {
return nil, errors.New("Already maintaining a presence")
}
status, release, err := p.store.MaintainNode(storeadapter.StoreNode{
Key: p.key,
Value: p.value,
TTL: uint64(interval.Seconds()),
})
if err != nil {
return nil, err
}
p.release = release
return status, nil
}
func (p *presence) Remove() {
if p.release == nil {
return
}
release := p.release
p.release = nil
stopFinishedChan := make(chan bool)
release <- stopFinishedChan
<-stopFinishedChan
}