Skip to content

Commit 4957ae8

Browse files
committed
Post-rebase fixes.
1 parent afd0754 commit 4957ae8

File tree

2 files changed

+101
-5
lines changed

2 files changed

+101
-5
lines changed

beacon_chain/networking/peer_pool.nim

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,20 +370,18 @@ proc joinPeer*[A, B](pool: PeerPool[A, B], peer: A): Future[void] =
370370
future.removeCallback(continuation)
371371

372372
let key = getKey(peer)
373-
if pool.registry.hasKey(key):
374-
let pindex = pool.registry[key].data
375-
var item = addr(pool.storage[pindex])
373+
pool.registry.withValue(key, pindex):
374+
var item = addr(pool.storage[pindex[].data])
376375
future = item[].future
377376
# If peer is still in PeerPool, then item[].future should not be finished.
378377
doAssert(not(future.finished()))
379378
future.addCallback(continuation)
380379
retFuture.cancelCallback = cancellation
381-
else:
380+
do:
382381
# If there no such peer in PeerPool anymore, its possible that
383382
# PeerItem.future's callbacks is not yet processed, so we going to complete
384383
# retFuture only in next `poll()` call.
385384
callSoon(continuation, cast[pointer](retFuture))
386-
387385
retFuture
388386

389387
proc addPeerImpl[A, B](pool: PeerPool[A, B], peer: A, peerKey: B,

tests/test_peer_pool.nim

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,104 @@ suite "PeerPool testing suite":
686686

687687
check waitFor(testDeleteOnRelease()) == true
688688

689+
test "Notify when peer leaves pool test":
690+
proc testNotifyOnLeave(): Future[bool] {.async.} =
691+
var pool = newPeerPool[PeerTest, PeerTestID]()
692+
var peer0 = PeerTest.init("idInc0", 100)
693+
var peer1 = PeerTest.init("idOut0", 100)
694+
var peer2 = PeerTest.init("idInc1", 100)
695+
var peer3 = PeerTest.init("idOut1", 100)
696+
697+
# Case 1. Deleting peer which is not part of PeerPool.
698+
block:
699+
var fut0 = pool.joinPeer(peer0)
700+
doAssert(fut0.finished == false)
701+
await sleepAsync(20.milliseconds)
702+
doAssert(fut0.finished == true and fut0.failed == false)
703+
704+
# Case 2. Deleting peer which is not acquired.
705+
discard pool.addPeerNoWait(peer0, PeerType.Incoming)
706+
block:
707+
var fut0 = pool.joinPeer(peer0)
708+
discard pool.deletePeer(peer0)
709+
var fut1 = pool.joinPeer(peer0)
710+
await sleepAsync(20.milliseconds)
711+
var fut2 = pool.joinPeer(peer0)
712+
doAssert(fut0.finished == true and fut0.failed == false)
713+
doAssert(fut1.finished == true and fut1.failed == false)
714+
doAssert(fut2.finished == false)
715+
await sleepAsync(20.milliseconds)
716+
doAssert(fut2.finished == true and fut2.failed == false)
717+
718+
# Case 3. Peer disconnected while it wasn't acquired.
719+
discard pool.addPeerNoWait(peer1, PeerType.Outgoing)
720+
block:
721+
var fut0 = pool.joinPeer(peer1)
722+
# Peer disconnecting
723+
peer1.future.complete()
724+
var fut1 = pool.joinPeer(peer1)
725+
await sleepAsync(20.milliseconds)
726+
var fut2 = pool.joinPeer(peer1)
727+
doAssert(fut0.finished == true and fut0.failed == false)
728+
doAssert(fut1.finished == true and fut1.failed == false)
729+
doAssert(fut2.finished == false)
730+
await sleepAsync(20.milliseconds)
731+
doAssert(fut2.finished == true and fut2.failed == false)
732+
733+
# Case 4. Peer deleted when it was acquired.
734+
discard pool.addPeerNoWait(peer2, PeerType.Incoming)
735+
block:
736+
var fut0 = pool.joinPeer(peer2)
737+
var p = await pool.acquire()
738+
doAssert(p.id == "idInc1")
739+
var fut1 = pool.joinPeer(peer2)
740+
discard pool.deletePeer(peer2)
741+
await sleepAsync(20.milliseconds)
742+
var fut2 = pool.joinPeer(peer2)
743+
doAssert(fut0.finished == false)
744+
doAssert(fut1.finished == false)
745+
doAssert(fut2.finished == false)
746+
pool.release(peer2)
747+
var fut3 = pool.joinPeer(peer2)
748+
await sleepAsync(20.milliseconds)
749+
var fut4 = pool.joinPeer(peer2)
750+
doAssert(fut0.finished == true and fut0.failed == false)
751+
doAssert(fut1.finished == true and fut1.failed == false)
752+
doAssert(fut2.finished == true and fut2.failed == false)
753+
doAssert(fut3.finished == true and fut3.failed == false)
754+
doAssert(fut4.finished == false)
755+
await sleepAsync(20.milliseconds)
756+
doAssert(fut4.finished == true and fut4.failed == false)
757+
758+
# Case 5. Peer disconnected while it was acquired.
759+
discard pool.addPeerNoWait(peer3, PeerType.Outgoing)
760+
block:
761+
var fut0 = pool.joinPeer(peer3)
762+
var p = await pool.acquire()
763+
doAssert(p.id == "idOut1")
764+
var fut1 = pool.joinPeer(peer3)
765+
# Peer disconnecting
766+
peer3.future.complete()
767+
await sleepAsync(20.milliseconds)
768+
var fut2 = pool.joinPeer(peer3)
769+
doAssert(fut0.finished == false)
770+
doAssert(fut1.finished == false)
771+
doAssert(fut2.finished == false)
772+
pool.release(peer3)
773+
var fut3 = pool.joinPeer(peer3)
774+
await sleepAsync(20.milliseconds)
775+
var fut4 = pool.joinPeer(peer3)
776+
doAssert(fut0.finished == true and fut0.failed == false)
777+
doAssert(fut1.finished == true and fut1.failed == false)
778+
doAssert(fut2.finished == true and fut2.failed == false)
779+
doAssert(fut3.finished == true and fut3.failed == false)
780+
doAssert(fut4.finished == false)
781+
await sleepAsync(20.milliseconds)
782+
doAssert(fut4.finished == true and fut4.failed == false)
783+
return true
784+
785+
check waitFor(testNotifyOnLeave()) == true
786+
689787
test "Space tests":
690788
var pool1 = newPeerPool[PeerTest, PeerTestID](maxPeers = 79)
691789
var pool2 = newPeerPool[PeerTest, PeerTestID](maxPeers = 79,

0 commit comments

Comments
 (0)