-
Notifications
You must be signed in to change notification settings - Fork 1
/
inmemory.go
87 lines (66 loc) · 1.89 KB
/
inmemory.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
package deferrals
import (
"log"
"sync"
"github.com/ae6rt/decap/web/api/v1"
)
// InMemoryDeferralService is the working network deferral service.
type InMemoryDeferralService struct {
mutex sync.Mutex
deferrals []v1.UserBuildEvent
logger *log.Logger
}
// NewDefault is the constructor for a DeferralService maintained in memory.
func NewDefault(log *log.Logger) DeferralService {
return &InMemoryDeferralService{logger: log}
}
// Defer puts a build onto the deferred list.
func (t *InMemoryDeferralService) Defer(event v1.UserBuildEvent) error {
t.mutex.Lock()
defer t.mutex.Unlock()
// dedup as we go
if len(t.deferrals) > 0 && event.Lockname() == t.deferrals[len(t.deferrals)-1].Lockname() {
return nil
}
t.deferrals = append(t.deferrals, event)
return nil
}
// List lists and dedupes the deferred builds. Used for presentation in a frontend UI.
func (t *InMemoryDeferralService) List() ([]v1.UserBuildEvent, error) {
t.mutex.Lock()
defer t.mutex.Unlock()
return t.copy(), nil
}
// Poll reads and dedups the list of deferred builds, clears the list from backing store and returns the list to the caller. Called for
// purposes of relaunching builds.
func (t *InMemoryDeferralService) Poll() ([]v1.UserBuildEvent, error) {
t.mutex.Lock()
defer t.mutex.Unlock()
c := t.copy()
t.deferrals = nil
return c, nil
}
// Remove removes a build by ID from the deferred list.
func (t *InMemoryDeferralService) Remove(id string) error {
t.mutex.Lock()
defer t.mutex.Unlock()
var idx int
var found bool
for j, k := range t.deferrals {
if k.ID == id {
idx = j
found = true
break
}
}
if found {
t.deferrals = append(t.deferrals[:idx], t.deferrals[idx+1:]...)
}
return nil
}
// Do not call this outside a mutex.
func (t *InMemoryDeferralService) copy() []v1.UserBuildEvent {
c := make([]v1.UserBuildEvent, len(t.deferrals), len(t.deferrals))
copy(c, t.deferrals)
return c
}