-
Notifications
You must be signed in to change notification settings - Fork 199
/
diffPeerListCreator.go
92 lines (76 loc) · 2.33 KB
/
diffPeerListCreator.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
88
89
90
91
92
package topicResolverSender
import (
"bytes"
"github.com/ElrondNetwork/elrond-go/dataRetriever"
"github.com/ElrondNetwork/elrond-go/p2p"
)
// DiffPeerListCreator can create a peer list by making the set difference between peers on
// main topic and the exclusion topic. If the resulting list is empty, will return the peers on the main topic.
type DiffPeerListCreator struct {
messenger dataRetriever.MessageHandler
mainTopic string
excludePeersFromTopic string
}
// NewDiffPeerListCreator is the constructor for DiffPeerListCreator
func NewDiffPeerListCreator(
messenger dataRetriever.MessageHandler,
mainTopic string,
excludePeersFromTopic string,
) (*DiffPeerListCreator, error) {
if messenger == nil || messenger.IsInterfaceNil() {
return nil, dataRetriever.ErrNilMessenger
}
return &DiffPeerListCreator{
messenger: messenger,
mainTopic: mainTopic,
excludePeersFromTopic: excludePeersFromTopic,
}, nil
}
// PeerList will return the generated list of peers
func (dplc *DiffPeerListCreator) PeerList() []p2p.PeerID {
allConnectedPeers := dplc.messenger.ConnectedPeersOnTopic(dplc.mainTopic)
mainTopicHasPeers := len(allConnectedPeers) != 0
if !mainTopicHasPeers {
return allConnectedPeers
}
excludedConnectedPeers := make([]p2p.PeerID, 0)
isExcludedTopicSet := len(dplc.excludePeersFromTopic) > 0
if isExcludedTopicSet {
excludedConnectedPeers = dplc.messenger.ConnectedPeersOnTopic(dplc.excludePeersFromTopic)
}
diffList := makeDiffList(allConnectedPeers, excludedConnectedPeers)
if len(diffList) == 0 {
//no differences: fallback to all connected peers
diffList = allConnectedPeers
}
return diffList
}
// IsInterfaceNil returns true if there is no value under the interface
func (dplc *DiffPeerListCreator) IsInterfaceNil() bool {
if dplc == nil {
return true
}
return false
}
func makeDiffList(
allConnectedPeers []p2p.PeerID,
excludedConnectedPeers []p2p.PeerID,
) []p2p.PeerID {
if len(excludedConnectedPeers) == 0 {
return allConnectedPeers
}
diff := make([]p2p.PeerID, 0)
for _, pid := range allConnectedPeers {
isPeerExcluded := false
for _, excluded := range excludedConnectedPeers {
if bytes.Equal(pid.Bytes(), excluded.Bytes()) {
isPeerExcluded = true
break
}
}
if !isPeerExcluded {
diff = append(diff, pid)
}
}
return diff
}