@@ -132,15 +132,14 @@ proc addPeer*(pm: PeerManager, remotePeerInfo: RemotePeerInfo, origin = UnknownO
132
132
peerId = remotePeerInfo.peerId,
133
133
addresses = remotePeerInfo.addrs,
134
134
origin = origin,
135
- protocols = remotePeerinfo.protocols,
136
135
enr = remotePeerInfo.enr
137
136
138
137
pm.peerStore[AddressBook ][remotePeerInfo.peerId] = remotePeerInfo.addrs
139
138
pm.peerStore[KeyBook ][remotePeerInfo.peerId] = publicKey
140
139
pm.peerStore[SourceBook ][remotePeerInfo.peerId] = origin
141
140
142
- if ( let enr = remotePeerInfo.enr.get (); remotePeerInfo.enr. isSome () ):
143
- pm.peerStore[ENRBook ][remotePeerInfo.peerId] = enr
141
+ if remotePeerInfo.enr.isSome ():
142
+ pm.peerStore[ENRBook ][remotePeerInfo.peerId] = remotePeerInfo. enr. get ()
144
143
145
144
# Add peer to storage. Entry will subsequently be updated with connectedness information
146
145
if not pm.storage.isNil:
@@ -327,24 +326,38 @@ proc onPeerMetadata(pm: PeerManager, peerId: PeerId) {.async.} =
327
326
return
328
327
329
328
let res = catch: await pm.switch.dial (peerId, WakuMetadataCodec )
329
+ let conn = res.valueOr:
330
+ info " disconnecting from peer" , peerId= peerId, reason= " dial failed: " & error.msg
331
+ asyncSpawn (pm.switch.disconnect (peerId))
332
+ pm.peerStore.delete (peerId)
333
+ return
334
+
335
+ let metadata = (await pm.wakuMetadata.request (conn)).valueOr:
336
+ info " disconnecting from peer" , peerId= peerId, reason= " waku metatdata request failed: " & error
337
+ asyncSpawn (pm.switch.disconnect (peerId))
338
+ pm.peerStore.delete (peerId)
339
+ return
330
340
331
- let reason =
332
- if (let conn = res; conn.isOk ()):
333
- if (let metadata = (await pm.wakuMetadata.request (conn.get ())); metadata.isOk ()):
334
- if (let clusterId = metadata.get ().clusterId; clusterId.isSome ()):
335
- if pm.wakuMetadata.clusterId == clusterId.get ():
336
- if metadata.get ().shards.anyIt (pm.wakuMetadata.shards.contains (it)):
337
- return
338
- else : " no shards in common"
339
- else : " different clusterId reported: " & $ pm.wakuMetadata.clusterId & " vs " & $ clusterId
340
- else : " empty clusterId reported"
341
- else : " failed waku metadata codec request"
342
- else : " waku metadata codec not supported"
343
-
344
- info " disconnecting from peer" , peerId= peerId, reason= reason
345
- asyncSpawn (pm.switch.disconnect (peerId))
346
- pm.peerStore.delete (peerId)
341
+ let clusterId = metadata.clusterId.valueOr:
342
+ info " disconnecting from peer" , peerId= peerId, reason= " empty clusterId reported"
343
+ asyncSpawn (pm.switch.disconnect (peerId))
344
+ pm.peerStore.delete (peerId)
345
+ return
346
+
347
+ if pm.wakuMetadata.clusterId != clusterId:
348
+ info " disconnecting from peer" ,
349
+ peerId= peerId,
350
+ reason= " different clusterId reported: " & $ pm.wakuMetadata.clusterId & " vs " & $ clusterId
351
+ asyncSpawn (pm.switch.disconnect (peerId))
352
+ pm.peerStore.delete (peerId)
353
+ return
347
354
355
+ if not metadata.shards.anyIt (pm.wakuMetadata.shards.contains (it)):
356
+ info " disconnecting from peer" , peerId= peerId, reason= " no shard in common"
357
+ asyncSpawn (pm.switch.disconnect (peerId))
358
+ pm.peerStore.delete (peerId)
359
+ return
360
+
348
361
# called when a peer i) first connects to us ii) disconnects all connections from us
349
362
proc onPeerEvent (pm: PeerManager , peerId: PeerId , event: PeerEvent ) {.async .} =
350
363
if not pm.wakuMetadata.isNil () and event.kind == PeerEventKind .Joined :
@@ -586,9 +599,10 @@ proc connectToNodes*(pm: PeerManager,
586
599
# later.
587
600
await sleepAsync (chronos.seconds (5 ))
588
601
589
- # Returns the peerIds of physical connections (in and out)
590
- # containing at least one stream with the given protocol.
591
602
proc connectedPeers * (pm: PeerManager , protocol: string ): (seq [PeerId ], seq [PeerId ]) =
603
+ # # Returns the peerIds of physical connections (in and out)
604
+ # # containing at least one stream with the given protocol.
605
+
592
606
var inPeers: seq [PeerId ]
593
607
var outPeers: seq [PeerId ]
594
608
@@ -631,20 +645,22 @@ proc manageRelayPeers*(pm: PeerManager) {.async.} =
631
645
var peersToConnect: seq [RemotePeerInfo ]
632
646
var peersToDisconnect: int
633
647
634
- for shard in pm.wakuMetadata.shards.items:
635
- var peers = pm.peerStore. getPeersByShard ( uint16 (pm.wakuMetadata.clusterId), uint16 (shard) )
648
+ # Get all connected peers for Waku Relay
649
+ var (inPeers, outPeers) = pm.connectedPeers ( WakuRelayCodec )
636
650
637
- peers.keepItIf (it.protocols.contains (WakuRelayCodec ))
651
+ # Calculate in/out target number of peers for each shards
652
+ let inTarget = pm.inRelayPeersTarget div pm.wakuMetadata.shards.len
653
+ let outTarget = pm.outRelayPeersTarget div pm.wakuMetadata.shards.len
638
654
639
- let connectedInPeers = peers.filterIt (
640
- pm.peerStore.isConnected (it.peerId) and it.direction == Inbound )
641
-
642
- let connectedOutPeers = peers.filterIt (
643
- pm.peerStore.isConnected (it.peerId) and it.direction == Outbound )
655
+ for shard in pm.wakuMetadata.shards.items:
656
+ # Filter out peer not on this shard
657
+ let connectedInPeers = inPeers.filterIt (
658
+ pm.peerStore.hasShard (it, uint16 (pm.wakuMetadata.clusterId), uint16 (shard)))
644
659
645
- let inTarget = pm.inRelayPeersTarget div pm.wakuMetadata.shards.len
646
- let outTarget = pm.outRelayPeersTarget div pm.wakuMetadata.shards.len
660
+ let connectedOutPeers = outPeers. filterIt (
661
+ pm.peerStore. hasShard (it, uint16 ( pm.wakuMetadata.clusterId), uint16 (shard)))
647
662
663
+ # Calculate the difference between current values and targets
648
664
let inPeerDiff = connectedInPeers.len - inTarget
649
665
let outPeerDiff = outTarget - connectedOutPeers.len
650
666
@@ -654,12 +670,17 @@ proc manageRelayPeers*(pm: PeerManager) {.async.} =
654
670
if outPeerDiff <= 0 :
655
671
continue
656
672
657
- let connectablePeers = peers.filterIt (
658
- (not pm.peerStore.isConnected (it.peerId)) and pm.canBeConnected (it.peerId))
673
+ # Get all connectable relay peers for this shard
674
+ var connectablePeers = pm.peerStore.getPeersByShard (
675
+ uint16 (pm.wakuMetadata.clusterId), uint16 (shard))
676
+
677
+ connectablePeers.keepItIf (
678
+ it.protocols.contains (WakuRelayCodec ) and
679
+ not pm.peerStore.isConnected (it.peerId) and
680
+ pm.canBeConnected (it.peerId))
659
681
660
682
debug " Target Peer Count per Shard" ,
661
- Shard = shard,
662
- RelayPeers = peers.len,
683
+ ShardNumber = shard,
663
684
Inbound = $ connectedInPeers.len & " /" & $ inTarget,
664
685
Outbound = $ connectedOutPeers.len & " /" & $ outTarget,
665
686
Connectable = connectablePeers.len
@@ -675,6 +696,7 @@ proc manageRelayPeers*(pm: PeerManager) {.async.} =
675
696
# Even with duplicates, after a couple of iteration the target will be reached
676
697
let uniquePeers = peersToConnect.deduplicate ()
677
698
699
+ # Connect to all nodes
678
700
for i in countup (0 , uniquePeers.len, MaxParallelDials ):
679
701
let stop = min (i + MaxParallelDials , uniquePeers.len)
680
702
await pm.connectToNodes (uniquePeers[i..< stop])
0 commit comments