Newer
Older
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
package probes
import (
"container/ring"
"fmt"
"sync"
"time"
)
type Result struct {
ID string
Spec SpecCommon
Ok bool
Start time.Time
Duration time.Duration
Logs string
}
// Nice displayable string.
func (r *Result) String() string {
return fmt.Sprintf("%s(%s)", r.Spec.Name, r.ID)
}
type ResultStore interface {
Push(*Result)
DoOk(func(*Result))
DoErrs(func(*Result))
Find(string) *Result
}
type memResultStore struct {
mx sync.Mutex
last *ring.Ring
errs *ring.Ring
}
func NewResultStore(numOk, numErrs int) ResultStore {
return &memResultStore{
last: ring.New(numOk),
errs: ring.New(numErrs),
}
}
func (r *memResultStore) Push(result *Result) {
r.mx.Lock()
r.last.Value = result
r.last = r.last.Next()
if !result.Ok {
r.errs.Value = result
r.errs = r.errs.Next()
}
r.mx.Unlock()
}
func (r *memResultStore) DoOk(f func(*Result)) {
r.mx.Lock()
r.last.Do(func(r interface{}) {
f(r.(*Result))
})
r.mx.Unlock()
}
func (r *memResultStore) DoErrs(f func(*Result)) {
r.mx.Lock()
r.errs.Do(func(r interface{}) {
f(r.(*Result))
})
r.mx.Unlock()
}
func (r *memResultStore) Find(id string) (out *Result) {
r.mx.Lock()
r.last.Do(func(r interface{}) {
result := r.(*Result)
if result.ID == id {
out = result
}
})
r.mx.Unlock()
return
}