-
Notifications
You must be signed in to change notification settings - Fork 2
/
targettracker.go
99 lines (81 loc) · 2.24 KB
/
targettracker.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package scheme
import (
"sync"
api "github.com/macrat/ayd/lib-ayd"
)
// FixedSourceReporter is a Reporter that overrides source argument.
//
// This struct is used by TargetTracker.
type FixedSourceReporter struct {
Source *api.URL
Upstreams []Reporter
}
// Report implements Reporter.
// This method just reports to upstream reporters.
func (r FixedSourceReporter) Report(_ *api.URL, rec api.Record) {
for _, u := range r.Upstreams {
u.Report(r.Source, rec)
}
}
// DeactivateTarget implements Reporter.
func (r FixedSourceReporter) DeactivateTarget(source *api.URL, targets ...*api.URL) {
for _, u := range r.Upstreams {
u.DeactivateTarget(r.Source, targets...)
}
}
// TargetTracker tracks the targets is active or not.
type TargetTracker struct {
sync.Mutex
actives []*api.URL
inactives []*api.URL
}
// PrepareReporter prepares to tracking a new probe with a new reporter.
func (t *TargetTracker) PrepareReporter(source *api.URL, r Reporter) Reporter {
t.Lock()
defer t.Unlock()
t.inactives = t.actives
t.actives = nil
return FixedSourceReporter{
Source: source,
Upstreams: []Reporter{r, t},
}
}
// Inactives returns the list of inactive targets that not reported since last PrepareReporter called.
func (t *TargetTracker) Inactives() []*api.URL {
t.Lock()
defer t.Unlock()
return append([]*api.URL{}, t.inactives...)
}
func (t *TargetTracker) addActive(target *api.URL) {
tgt := target.String()
for _, a := range t.actives {
if a.String() == tgt {
return
}
}
t.actives = append(t.actives, target)
}
func (t *TargetTracker) removeInactive(target *api.URL) {
tgt := target.String()
for i, a := range t.inactives {
if a.String() == tgt {
t.inactives = append(t.inactives[:i], t.inactives[i+1:]...)
return
}
}
}
// Activate removes target URL from inactive list and appends to active list.
func (t *TargetTracker) Activate(target *api.URL) {
t.Lock()
defer t.Unlock()
t.addActive(target)
t.removeInactive(target)
}
// Report implements Reporter.
// This method marks as the target is active.
func (t *TargetTracker) Report(_ *api.URL, rec api.Record) {
t.Activate(rec.Target)
}
// DeactivateTarget implements Reporter. it does nothing.
func (t *TargetTracker) DeactivateTarget(_ *api.URL, _ ...*api.URL) {
}