From 9a1171a0efcd9226c1df7976048e26ce6eef3d72 Mon Sep 17 00:00:00 2001 From: vyzo Date: Mon, 25 May 2020 10:39:29 +0300 Subject: [PATCH] fix outbound constraint satisfaction in oversubscription pruning --- gossipsub.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/gossipsub.go b/gossipsub.go index c4bebc00..7f5694dc 100644 --- a/gossipsub.go +++ b/gossipsub.go @@ -1302,15 +1302,33 @@ func (gs *GossipSubRouter) heartbeat() { // if it's less than D_out, bubble up some outbound peers from the random selection if outbound < gs.Dout { + rotate := func(i int) { + // rotate the plst to the right and put the ith peer in the front + p := plst[i] + for j := i; j > 0; j-- { + plst[j] = plst[j-1] + } + plst[0] = p + } + + // first bubble up all outbound peers already in the selection to the front + if outbound > 0 { + ihave := outbound + for i := 1; i < gs.D && ihave > 0; i++ { + p := plst[i] + if gs.outbound[p] { + rotate(i) + ihave-- + } + } + } + + // now bubble up enough outbound peers outside the selection to the front ineed := gs.Dout - outbound for i := gs.D; i < len(plst) && ineed > 0; i++ { p := plst[i] if gs.outbound[p] { - // rotate the plst to the right and put the outbound peer in the front - for j := i; j > 0; j-- { - plst[j] = plst[j-1] - } - plst[0] = p + rotate(i) ineed-- } }