forked from cloudfoundry/locket
/
burglar.go
81 lines (68 loc) · 1.99 KB
/
burglar.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package expiration
import (
"context"
"os"
"time"
"code.cloudfoundry.org/clock"
loggingclient "code.cloudfoundry.org/diego-logging-client"
"code.cloudfoundry.org/lager/v3"
"code.cloudfoundry.org/locket"
"code.cloudfoundry.org/locket/db"
)
const (
locksExpiredCounter = "LocksExpired"
presenceExpiredCounter = "PresenceExpired"
)
type burglar struct {
logger lager.Logger
lockDB db.LockDB
lockPick LockPick
clock clock.Clock
checkInterval time.Duration
metronClient loggingclient.IngressClient
}
func NewBurglar(logger lager.Logger, lockDB db.LockDB, lockPick LockPick, clock clock.Clock, checkInterval time.Duration, metronClient loggingclient.IngressClient) burglar {
return burglar{
logger: logger,
lockDB: lockDB,
lockPick: lockPick,
clock: clock,
checkInterval: checkInterval,
metronClient: metronClient,
}
}
func (b burglar) Run(signals <-chan os.Signal, ready chan<- struct{}) error {
logger := b.logger.Session("burglar")
logger.Info("started")
defer logger.Info("complete")
locks, err := b.lockDB.FetchAll(context.Background(), logger, "")
if err != nil {
logger.Error("failed-fetching-locks", err)
}
for _, lock := range locks {
b.lockPick.RegisterTTL(logger, lock)
}
check := b.clock.NewTicker(b.checkInterval)
expirationCheck := b.clock.NewTicker(locket.ExpirationMetricsInterval)
close(ready)
for {
select {
case sig := <-signals:
logger.Info("signalled", lager.Data{"signal": sig})
return nil
case <-check.C():
locks, err := b.lockDB.FetchAll(context.Background(), logger, "")
if err != nil {
logger.Error("failed-fetching-locks", err)
continue
}
for _, lock := range locks {
b.lockPick.RegisterTTL(logger, lock)
}
case <-expirationCheck.C():
locksExpired, presencesExpired := b.lockPick.ExpirationCounts()
b.metronClient.SendMetric(locksExpiredCounter, int(locksExpired))
b.metronClient.SendMetric(presenceExpiredCounter, int(presencesExpired))
}
}
}