-
Notifications
You must be signed in to change notification settings - Fork 199
/
diffPeerListCreator.go
112 lines (93 loc) · 3.14 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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package topicResolverSender
import (
"bytes"
"fmt"
"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/core/check"
"github.com/multiversx/mx-chain-go/dataRetriever"
)
var _ dataRetriever.PeerListCreator = (*DiffPeerListCreator)(nil)
// 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
intraShardTopic string
excludePeersFromTopic string
}
// NewDiffPeerListCreator is the constructor for DiffPeerListCreator
func NewDiffPeerListCreator(
messenger dataRetriever.MessageHandler,
mainTopic string,
intraShardTopic string,
excludePeersFromTopic string,
) (*DiffPeerListCreator, error) {
if check.IfNil(messenger) {
return nil, dataRetriever.ErrNilMessenger
}
if len(mainTopic) == 0 {
return nil, fmt.Errorf("%w for mainTopic", dataRetriever.ErrEmptyString)
}
if len(intraShardTopic) == 0 {
return nil, fmt.Errorf("%w for intraShardTopic", dataRetriever.ErrEmptyString)
}
return &DiffPeerListCreator{
messenger: messenger,
mainTopic: mainTopic,
intraShardTopic: intraShardTopic,
excludePeersFromTopic: excludePeersFromTopic,
}, nil
}
// CrossShardPeerList will return the generated list of cross shard peers
func (dplc *DiffPeerListCreator) CrossShardPeerList() []core.PeerID {
allConnectedPeers := dplc.messenger.ConnectedPeersOnTopic(dplc.mainTopic)
mainTopicHasPeers := len(allConnectedPeers) != 0
if !mainTopicHasPeers {
return allConnectedPeers
}
excludedConnectedPeers := make([]core.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
}
// IntraShardPeerList returns the intra shard peer list
func (dplc *DiffPeerListCreator) IntraShardPeerList() []core.PeerID {
return dplc.messenger.ConnectedPeersOnTopic(dplc.intraShardTopic)
}
// FullHistoryList returns the full history peers list
func (dplc *DiffPeerListCreator) FullHistoryList() []core.PeerID {
return dplc.messenger.ConnectedFullHistoryPeersOnTopic(dplc.intraShardTopic)
}
// IsInterfaceNil returns true if there is no value under the interface
func (dplc *DiffPeerListCreator) IsInterfaceNil() bool {
return dplc == nil
}
func makeDiffList(
allConnectedPeers []core.PeerID,
excludedConnectedPeers []core.PeerID,
) []core.PeerID {
if len(excludedConnectedPeers) == 0 {
return allConnectedPeers
}
diff := make([]core.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
}