62 lines
2.4 KiB
Diff
62 lines
2.4 KiB
Diff
# UNDF: UNDF-2026-000001015
|
|
--- a/allocate.go
|
|
+++ b/allocate.go
|
|
@@ -123,11 +123,22 @@ func (c *Cluster) filterMetrics(ctx context.Context, mSet api.MetricsSet, numMet
|
|
// For a metric/peer to be included in a group, it is necessary that it has
|
|
// metrics for all informers.
|
|
func (c *Cluster) filterMetrics(ctx context.Context, mSet api.MetricsSet, numMetrics int, currentAllocs, priorityList, blacklist []peer.ID) classifiedMetrics {
|
|
curPeersMap := make(map[peer.ID][]api.Metric)
|
|
candPeersMap := make(map[peer.ID][]api.Metric)
|
|
prioPeersMap := make(map[peer.ID][]api.Metric)
|
|
|
|
- // Divide the metric by current/candidate/prio and by peer
|
|
+ // Build O(1) lookup sets for peer classification.
|
|
+ blacklistSet := make(map[peer.ID]struct{}, len(blacklist))
|
|
+ for _, p := range blacklist {
|
|
+ blacklistSet[p] = struct{}{}
|
|
+ }
|
|
+ currentAllocsSet := make(map[peer.ID]struct{}, len(currentAllocs))
|
|
+ for _, p := range currentAllocs {
|
|
+ currentAllocsSet[p] = struct{}{}
|
|
+ }
|
|
+ prioritySet := make(map[peer.ID]struct{}, len(priorityList))
|
|
+ for _, p := range priorityList {
|
|
+ prioritySet[p] = struct{}{}
|
|
+ }
|
|
+
|
|
+ // Divide our metrics by current/candidate/prio and by peer
|
|
for _, metrics := range mSet {
|
|
for _, m := range metrics {
|
|
switch {
|
|
- case containsPeer(blacklist, m.Peer):
|
|
+ case peerInSet(blacklistSet, m.Peer):
|
|
// discard blacklisted peers
|
|
continue
|
|
case c.config.PinOnlyOnTrustedPeers && !c.consensus.IsTrustedPeer(ctx, m.Peer):
|
|
@@ -136,9 +147,9 @@ func (c *Cluster) filterMetrics(ctx context.Context, mSet api.MetricsSet, numMet
|
|
case c.config.PinOnlyOnUntrustedPeers && c.consensus.IsTrustedPeer(ctx, m.Peer):
|
|
// discard peers that are trusted
|
|
continue
|
|
- case containsPeer(currentAllocs, m.Peer):
|
|
+ case peerInSet(currentAllocsSet, m.Peer):
|
|
curPeersMap[m.Peer] = append(curPeersMap[m.Peer], m)
|
|
- case containsPeer(priorityList, m.Peer):
|
|
+ case peerInSet(prioritySet, m.Peer):
|
|
prioPeersMap[m.Peer] = append(prioPeersMap[m.Peer], m)
|
|
default:
|
|
candPeersMap[m.Peer] = append(candPeersMap[m.Peer], m)
|
|
--- a/util.go
|
|
+++ b/util.go
|
|
@@ -72,6 +72,12 @@ func containsPeer(list []peer.ID, peer peer.ID) bool {
|
|
return false
|
|
}
|
|
|
|
+// peerInSet checks for peer membership in a pre-built set. O(1) average.
|
|
+func peerInSet(set map[peer.ID]struct{}, p peer.ID) bool {
|
|
+ _, ok := set[p]
|
|
+ return ok
|
|
+}
|
|
+
|
|
func minInt(x, y int) int {
|
|
if x < y {
|
|
return x
|