java-topology/defects/ipfs-cluster-0001/patch/ipfs-cluster-0001.patch

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