-
Notifications
You must be signed in to change notification settings - Fork 338
/
skip_peers.go
68 lines (53 loc) · 1.46 KB
/
skip_peers.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
// Copyright 2020 The Swarm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package retrieval
import (
"sync"
"github.com/ethersphere/bee/pkg/swarm"
)
type skipPeers struct {
overdraftAddresses []swarm.Address
addresses []swarm.Address
mu sync.Mutex
}
func newSkipPeers() *skipPeers {
return &skipPeers{}
}
func (s *skipPeers) All() []swarm.Address {
s.mu.Lock()
defer s.mu.Unlock()
return append(append(s.addresses[:0:0], s.addresses...), s.overdraftAddresses...)
}
func (s *skipPeers) Reset() {
s.mu.Lock()
defer s.mu.Unlock()
s.overdraftAddresses = []swarm.Address{}
}
func (s *skipPeers) Add(address swarm.Address) {
s.mu.Lock()
defer s.mu.Unlock()
for _, a := range s.addresses {
if a.Equal(address) {
return
}
}
s.addresses = append(s.addresses, address)
}
func (s *skipPeers) AddOverdraft(address swarm.Address) {
s.mu.Lock()
defer s.mu.Unlock()
for _, a := range s.overdraftAddresses {
if a.Equal(address) {
return
}
}
s.overdraftAddresses = append(s.overdraftAddresses, address)
}
// Saturated function returns whether all skipped entries a permanently skipped for this skiplist
// Temporary entries are stored in the overdraftAddresses slice of the skiplist, so if that is empty, the function returns true
func (s *skipPeers) Saturated() bool {
s.mu.Lock()
defer s.mu.Unlock()
return len(s.overdraftAddresses) <= 0
}