handle cancelledError in extended kad

This commit is contained in:
Prem Chaitanya Prathi 2026-02-06 14:41:59 +05:30
parent 051d77f5f5
commit d6f7ab3398
No known key found for this signature in database
2 changed files with 51 additions and 45 deletions

View File

@ -209,7 +209,7 @@ type
contentTopic* {.
desc: "Content topic for chat messages.",
defaultValue: "/toy-chat-mix/2/huilong/proto",
defaultValue: "/toy-chat/2/baixa-chiado/proto",
name: "content-topic"
.}: string

View File

@ -73,14 +73,18 @@ proc setupExtendedKademliaDiscovery*(
proc extractMixPubKey(service: ServiceInfo): Option[Curve25519Key] =
if service.id != MixProtocolID:
trace "service is not mix protocol", serviceId = service.id, mixProtocolId = MixProtocolID
trace "service is not mix protocol",
serviceId = service.id, mixProtocolId = MixProtocolID
return none(Curve25519Key)
debug "found mix protocol service", dataLen = service.data.len, expectedLen = Curve25519KeySize
debug "found mix protocol service",
dataLen = service.data.len, expectedLen = Curve25519KeySize
if service.data.len != Curve25519KeySize:
warn "invalid mix pub key length from kademlia record",
expected = Curve25519KeySize, actual = service.data.len, dataHex = service.data.toHex()
expected = Curve25519KeySize,
actual = service.data.len,
dataHex = service.data.toHex()
return none(Curve25519Key)
let key = intoCurve25519Key(service.data)
@ -107,7 +111,8 @@ proc remotePeerInfoFrom(record: ExtendedPeerRecord): Option[RemotePeerInfo] =
var mixPubKey = none(Curve25519Key)
for service in record.services:
debug "checking service", peerId = record.peerId, serviceId = service.id, dataLen = service.data.len
debug "checking service",
peerId = record.peerId, serviceId = service.id, dataLen = service.data.len
mixPubKey = extractMixPubKey(service)
if mixPubKey.isSome():
debug "extracted mix public key from service", peerId = record.peerId
@ -115,8 +120,7 @@ proc remotePeerInfoFrom(record: ExtendedPeerRecord): Option[RemotePeerInfo] =
if record.services.len > 0 and mixPubKey.isNone():
debug "record has services but no valid mix key",
peerId = record.peerId,
services = record.services.mapIt(it.id)
peerId = record.peerId, services = record.services.mapIt(it.id)
some(
RemotePeerInfo.init(
@ -133,44 +137,49 @@ proc runExtendedKademliaDiscoveryLoop*(
): Future[void] {.async.} =
info "extended kademlia discovery loop started", interval = interval
while true:
if node.wakuKademlia.isNil():
info "extended kademlia discovery loop stopping: protocol disabled"
return
try:
while true:
if node.wakuKademlia.isNil():
info "extended kademlia discovery loop stopping: protocol disabled"
return
if not node.started:
await sleepAsync(ExtendedKademliaDiscoveryStartupDelay)
continue
var records: seq[ExtendedPeerRecord]
try:
records = await node.wakuKademlia.randomRecords()
except CatchableError:
warn "extended kademlia discovery failed", error = getCurrentExceptionMsg()
await sleepAsync(interval)
continue
debug "received random records from kademlia", numRecords = records.len
var added = 0
for record in records:
let peerOpt = remotePeerInfoFrom(record)
if peerOpt.isNone():
if not node.started:
await sleepAsync(ExtendedKademliaDiscoveryStartupDelay)
continue
let peerInfo = peerOpt.get()
node.peerManager.addPeer(peerInfo, PeerOrigin.Kademlia)
debug "peer added via extended kademlia discovery",
peerId = $peerInfo.peerId,
addresses = peerInfo.addrs.mapIt($it),
protocols = peerInfo.protocols,
hasMixPubKey = peerInfo.mixPubKey.isSome()
added.inc()
var records: seq[ExtendedPeerRecord]
try:
records = await node.wakuKademlia.randomRecords()
except CatchableError:
warn "extended kademlia discovery failed", error = getCurrentExceptionMsg()
await sleepAsync(interval)
continue
if added > 0:
info "added peers from extended kademlia discovery", count = added
debug "received random records from kademlia", numRecords = records.len
await sleepAsync(interval)
var added = 0
for record in records:
let peerOpt = remotePeerInfoFrom(record)
if peerOpt.isNone():
continue
let peerInfo = peerOpt.get()
node.peerManager.addPeer(peerInfo, PeerOrigin.Kademlia)
debug "peer added via extended kademlia discovery",
peerId = $peerInfo.peerId,
addresses = peerInfo.addrs.mapIt($it),
protocols = peerInfo.protocols,
hasMixPubKey = peerInfo.mixPubKey.isSome()
added.inc()
if added > 0:
info "added peers from extended kademlia discovery", count = added
await sleepAsync(interval)
except CancelledError:
debug "extended kademlia discovery loop cancelled"
except CatchableError as e:
error "extended kademlia discovery loop failed", error = e.msg
proc startExtendedKademliaDiscoveryLoop*(
node: WakuNode, interval = DefaultExtendedKademliaDiscoveryInterval
@ -185,9 +194,7 @@ proc startExtendedKademliaDiscoveryLoop*(
node.kademliaDiscoveryLoop = node.runExtendedKademliaDiscoveryLoop(interval)
proc lookupMixPeers*(
node: WakuNode
): Future[int] {.async.} =
proc lookupMixPeers*(node: WakuNode): Future[int] {.async.} =
## Lookup mix peers via kademlia and add them to the peer store.
## Returns the number of mix peers found and added.
if node.wakuKademlia.isNil():
@ -216,8 +223,7 @@ proc lookupMixPeers*(
node.peerManager.addPeer(peerInfo, PeerOrigin.Kademlia)
info "mix peer added via kademlia lookup",
peerId = $peerInfo.peerId,
mixPubKey = peerInfo.mixPubKey.get().toHex()
peerId = $peerInfo.peerId, mixPubKey = peerInfo.mixPubKey.get().toHex()
added.inc()
info "mix peer lookup complete", found = added