/
peer_selector.go
66 lines (52 loc) · 1.43 KB
/
peer_selector.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
package node
import (
"math/rand"
"github.com/abassian/huron/src/peers"
)
//PeerSelector defines and interface for Peer Selectors
type PeerSelector interface {
Peers() *peers.PeerSet
UpdateLast(peer uint32)
Next() *peers.Peer
}
//+++++++++++++++++++++++++++++++++++++++
//RANDOM
// RandomPeerSelector defines a struct which controls the random selection of
// peers
type RandomPeerSelector struct {
peers *peers.PeerSet
selfID uint32
selectablePeers []*peers.Peer
last uint32
}
// NewRandomPeerSelector is a factory method that returns a new instance of
// RandomPeerSelector
func NewRandomPeerSelector(peerSet *peers.PeerSet, selfID uint32) *RandomPeerSelector {
_, selectablePeers := peers.ExcludePeer(peerSet.Peers, selfID)
return &RandomPeerSelector{
peers: peerSet,
selfID: selfID,
selectablePeers: selectablePeers,
}
}
//Peers returns a set of peers
func (ps *RandomPeerSelector) Peers() *peers.PeerSet {
return ps.peers
}
//UpdateLast sets the last peer
func (ps *RandomPeerSelector) UpdateLast(peer uint32) {
ps.last = peer
}
//Next returns the next peer
func (ps *RandomPeerSelector) Next() *peers.Peer {
selectablePeers := ps.selectablePeers
if len(selectablePeers) == 0 {
return nil
}
if len(selectablePeers) > 1 {
_, selectablePeers = peers.ExcludePeer(selectablePeers, ps.last)
}
i := rand.Intn(len(selectablePeers))
peer := selectablePeers[i]
return peer
}