-
Notifications
You must be signed in to change notification settings - Fork 0
/
blacklist.go
57 lines (47 loc) · 986 Bytes
/
blacklist.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
package peer_monitor
import (
"sync"
"sync/atomic"
"time"
"golang.org/x/exp/slices"
)
type Blacklist struct {
peers sync.Map
Size atomic.Int64
}
type item struct {
Peer string
Inserted time.Time
}
func (self *Blacklist) Add(peer string) {
self.peers.Store(peer, time.Now())
self.Size.Add(1)
}
func (self *Blacklist) Contains(peer string) bool {
_, contains := self.peers.Load(peer)
return contains
}
func (self *Blacklist) RemoveOldest(n int) {
items := make([]item, 0)
self.peers.Range(func(key any, value any) bool {
peer, _ := key.(string)
inserted, _ := value.(time.Time)
items = append(items, item{
Peer: peer,
Inserted: inserted,
})
return true
})
// Oldest are in the beggining of the slice
slices.SortFunc(items, func(a, b item) int {
if a.Inserted.Before(b.Inserted) {
return -1
} else {
return +1
}
})
for i := 0; i < n && i < len(items); i++ {
self.peers.Delete(items[i])
}
self.Size.Add(int64(-1 * n))
}