# 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