From 43948432998064342e9d691381291224724782d6 Mon Sep 17 00:00:00 2001 From: Igor Sirotin Date: Tue, 21 Apr 2026 22:20:53 +0100 Subject: [PATCH 1/2] fix: make update and wakunode2 build on arm64 after Nimble migration (#3814) Rebuild nat libs (miniupnpc, libnatpmp) for the host architecture during nimble deps setup. The prebuilt libs from the nimble cache are x86_64 and fail to link on arm64 (Apple Silicon). Co-authored-by: Claude Sonnet 4.6 --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 7ba417527..be9e14027 100644 --- a/Makefile +++ b/Makefile @@ -74,6 +74,7 @@ $(NIMBLEDEPS_STAMP): nimble.lock | waku.nims nimble setup --localdeps $(MAKE) build-nph $(MAKE) rebuild-bearssl-nimbledeps + $(MAKE) rebuild-nat-libs-nimbledeps touch $@ update: From bb8a7e878233e8f51fd67cf266ba4df4b7bae08c Mon Sep 17 00:00:00 2001 From: Fabiana Cecin Date: Wed, 22 Apr 2026 09:52:57 -0300 Subject: [PATCH 2/2] Fix redundant start/stop calls (#3817) * remove redundant proto start/stop calls from node start/stop * fix WakuRelay start/stop not overriding GossipSub start/stop * replace startRelay with reconnectRelayPeers --- tests/waku_store_sync/sync_utils.nim | 6 +-- tests/waku_store_sync/test_protocol.nim | 36 ++++++------- waku/node/kernel_api/relay.nim | 3 +- waku/node/waku_node.nim | 68 +++++++------------------ waku/waku_metadata/protocol.nim | 6 --- waku/waku_mix/protocol.nim | 6 --- waku/waku_relay/protocol.nim | 4 +- waku/waku_rendezvous/protocol.nim | 15 ++---- waku/waku_store_sync/reconciliation.nim | 15 +++--- waku/waku_store_sync/transfer.nim | 11 ++-- 10 files changed, 61 insertions(+), 109 deletions(-) diff --git a/tests/waku_store_sync/sync_utils.nim b/tests/waku_store_sync/sync_utils.nim index fe62e02a1..888b10a83 100644 --- a/tests/waku_store_sync/sync_utils.nim +++ b/tests/waku_store_sync/sync_utils.nim @@ -45,7 +45,7 @@ proc newTestWakuRecon*( let proto = res.get() - proto.start() + await proto.start() switch.mount(proto) return proto @@ -55,7 +55,7 @@ proc newTestWakuTransfer*( idsTx: AsyncQueue[(SyncID, PubsubTopic, ContentTopic)], wantsRx: AsyncQueue[PeerId], needsRx: AsyncQueue[(PeerId, WakuMessageHash)], -): SyncTransfer = +): Future[SyncTransfer] {.async.} = let peerManager = PeerManager.new(switch) let proto = SyncTransfer.new( @@ -66,7 +66,7 @@ proc newTestWakuTransfer*( remoteNeedsRx = needsRx, ) - proto.start() + await proto.start() switch.mount(proto) return proto diff --git a/tests/waku_store_sync/test_protocol.nim b/tests/waku_store_sync/test_protocol.nim index d051eebd7..d1f5a102a 100644 --- a/tests/waku_store_sync/test_protocol.nim +++ b/tests/waku_store_sync/test_protocol.nim @@ -63,8 +63,8 @@ suite "Waku Sync: reconciliation": clientPeerInfo = clientSwitch.peerInfo.toRemotePeerInfo() asyncTeardown: - server.stop() - client.stop() + await server.stop() + await client.stop() await allFutures(serverSwitch.stop(), clientSwitch.stop()) @@ -561,8 +561,8 @@ suite "Waku Sync: reconciliation": ) defer: - server.stop() - client.stop() + await server.stop() + await client.stop() let res = await client.storeSynchronization(some(serverPeerInfo)) assert res.isOk(), $res.error @@ -610,8 +610,8 @@ suite "Waku Sync: reconciliation": ) defer: - server.stop() - client.stop() + await server.stop() + await client.stop() let res = await client.storeSynchronization(some(serverPeerInfo)) assert res.isOk(), $res.error @@ -657,8 +657,8 @@ suite "Waku Sync: reconciliation": ) defer: - server.stop() - client.stop() + await server.stop() + await client.stop() let res = await client.storeSynchronization(some(serverPeerInfo)) assert res.isOk(), $res.error @@ -701,8 +701,8 @@ suite "Waku Sync: reconciliation": ) defer: - server.stop() - client.stop() + await server.stop() + await client.stop() let res = await client.storeSynchronization(some(serverPeerInfo)) assert res.isOk(), $res.error @@ -736,8 +736,8 @@ suite "Waku Sync: reconciliation": ) defer: - server.stop() - client.stop() + await server.stop() + await client.stop() let res = await client.storeSynchronization(some(serverPeerInfo)) assert res.isOk(), $res.error @@ -773,8 +773,8 @@ suite "Waku Sync: reconciliation": ) defer: - server.stop() - client.stop() + await server.stop() + await client.stop() let res = await client.storeSynchronization(some(serverPeerInfo)) assert res.isOk(), $res.error @@ -848,8 +848,8 @@ suite "Waku Sync: transfer": remoteNeedsRx = clientRemoteNeeds, ) - server.start() - client.start() + await server.start() + await client.start() serverSwitch.mount(server) clientSwitch.mount(client) @@ -861,8 +861,8 @@ suite "Waku Sync: transfer": clientPeermanager.addPeer(serverPeerInfo) asyncTeardown: - server.stop() - client.stop() + await server.stop() + await client.stop() await allFutures(serverSwitch.stop(), clientSwitch.stop()) diff --git a/waku/node/kernel_api/relay.nim b/waku/node/kernel_api/relay.nim index c5a11ff02..fe46f5bd2 100644 --- a/waku/node/kernel_api/relay.nim +++ b/waku/node/kernel_api/relay.nim @@ -263,7 +263,8 @@ proc mountRelay*( node.wakuRelay.routingRecordsHandler.add(peerExchangeHandler.get()) if node.started: - await node.startRelay() + await node.wakuRelay.start() + await node.reconnectRelayPeers() node.switch.mount(node.wakuRelay, protocolMatcher(WakuRelayCodec)) diff --git a/waku/node/waku_node.nim b/waku/node/waku_node.nim index 506a3e592..45080d9d0 100644 --- a/waku/node/waku_node.nim +++ b/waku/node/waku_node.nim @@ -369,30 +369,16 @@ proc mountStoreSync*( return ok() -proc startRelay*(node: WakuNode) {.async.} = - ## Setup and start relay protocol - info "starting relay protocol" - +proc reconnectRelayPeers*(node: WakuNode) {.async.} = + ## Reconnect to previously-seen WakuRelay peers. if node.wakuRelay.isNil(): - error "Failed to start relay. Not mounted." return - - ## Setup relay protocol - - # Resume previous relay connections - if node.peerManager.switch.peerStore.hasPeers(protocolMatcher(WakuRelayCodec)): - info "Found previous WakuRelay peers. Reconnecting." - - # Reconnect to previous relay peers. This will respect a backoff period, if necessary - let backoffPeriod = - node.wakuRelay.parameters.pruneBackoff + chronos.seconds(BackoffSlackTime) - - await node.peerManager.reconnectPeers(WakuRelayCodec, backoffPeriod) - - # Start the WakuRelay protocol - await node.wakuRelay.start() - - info "relay started successfully" + if not node.peerManager.switch.peerStore.hasPeers(protocolMatcher(WakuRelayCodec)): + return + info "Found previous WakuRelay peers. Reconnecting." + let backoffPeriod = + node.wakuRelay.parameters.pruneBackoff + chronos.seconds(BackoffSlackTime) + await node.peerManager.reconnectPeers(WakuRelayCodec, backoffPeriod) proc selectRandomPeers*(peers: seq[PeerId], numRandomPeers: int): seq[PeerId] = var randomPeers = peers @@ -430,7 +416,10 @@ proc mountRendezvous*( return if node.started: - await node.wakuRendezvous.start() + try: + await node.wakuRendezvous.start() + except CancelledError as exc: + error "failed to start wakuRendezvous", error = exc.msg try: node.switch.mount(node.wakuRendezvous, protocolMatcher(WakuRendezVousCodec)) @@ -578,31 +567,12 @@ proc start*(node: WakuNode) {.async.} = if isBindIpWithZeroPort(address): zeroPortPresent = true - # Perform relay-specific startup tasks TODO: this should be rethought - if not node.wakuRelay.isNil(): - await node.startRelay() - - if not node.wakuMix.isNil(): - node.wakuMix.start() - - if not node.wakuMetadata.isNil(): - node.wakuMetadata.start() - if not node.wakuStoreResume.isNil(): await node.wakuStoreResume.start() - if not node.wakuRendezvous.isNil(): - await node.wakuRendezvous.start() - if not node.wakuRendezvousClient.isNil(): await node.wakuRendezvousClient.start() - if not node.wakuStoreReconciliation.isNil(): - node.wakuStoreReconciliation.start() - - if not node.wakuStoreTransfer.isNil(): - node.wakuStoreTransfer.start() - ## The switch uses this mapper to update peer info addrs ## with announced addrs after start let addressMapper = proc( @@ -612,8 +582,12 @@ proc start*(node: WakuNode) {.async.} = node.switch.peerInfo.addressMappers.add(addressMapper) ## The switch will update addresses after start using the addressMapper + ## NOTE: This will dispatch gossipsub start to the WakuRelay.start method override await node.switch.start() + # After switch.start, run custom Logos Delivery relay start logic + await node.reconnectRelayPeers() + node.started = true if not node.wakuFilterClient.isNil(): @@ -637,6 +611,7 @@ proc stop*(node: WakuNode) {.async.} = node.stopProvidersAndListeners() + ## NOTE: This will dispatch gossipsub stop to the WakuRelay.stop method override await node.switch.stop() node.peerManager.stop() @@ -653,12 +628,6 @@ proc stop*(node: WakuNode) {.async.} = if not node.wakuStoreResume.isNil(): await node.wakuStoreResume.stopWait() - if not node.wakuStoreReconciliation.isNil(): - node.wakuStoreReconciliation.stop() - - if not node.wakuStoreTransfer.isNil(): - node.wakuStoreTransfer.stop() - if not node.wakuPeerExchangeClient.isNil() and not node.wakuPeerExchangeClient.pxLoopHandle.isNil(): await node.wakuPeerExchangeClient.pxLoopHandle.cancelAndWait() @@ -666,9 +635,6 @@ proc stop*(node: WakuNode) {.async.} = if not node.wakuKademlia.isNil(): await node.wakuKademlia.stop() - if not node.wakuRendezvous.isNil(): - await node.wakuRendezvous.stopWait() - if not node.wakuRendezvousClient.isNil(): await node.wakuRendezvousClient.stopWait() diff --git a/waku/waku_metadata/protocol.nim b/waku/waku_metadata/protocol.nim index 623cbb6c3..7c72a6934 100644 --- a/waku/waku_metadata/protocol.nim +++ b/waku/waku_metadata/protocol.nim @@ -108,9 +108,3 @@ proc new*(T: type WakuMetadata, clusterId: uint32, getShards: GetShards): T = clusterId = wm.clusterId, shards = wm.getShards() return wm - -proc start*(wm: WakuMetadata) = - wm.started = true - -proc stop*(wm: WakuMetadata) = - wm.started = false diff --git a/waku/waku_mix/protocol.nim b/waku/waku_mix/protocol.nim index e31929b71..ac8b69eaf 100644 --- a/waku/waku_mix/protocol.nim +++ b/waku/waku_mix/protocol.nim @@ -104,10 +104,4 @@ proc new*( proc poolSize*(mix: WakuMix): int = mix.nodePool.len -method start*(mix: WakuMix) = - info "starting waku mix protocol" - -method stop*(mix: WakuMix) {.async.} = - discard - # Mix Protocol diff --git a/waku/waku_relay/protocol.nim b/waku/waku_relay/protocol.nim index 79d3702eb..b19173d36 100644 --- a/waku/waku_relay/protocol.nim +++ b/waku/waku_relay/protocol.nim @@ -517,12 +517,12 @@ proc topicsHealthLoop(w: WakuRelay) {.async.} = # safety cooldown to protect from edge cases await sleepAsync(100.milliseconds) -method start*(w: WakuRelay) {.async, base.} = +method start*(w: WakuRelay) {.async: (raises: [CancelledError]).} = info "start" await procCall GossipSub(w).start() w.topicHealthLoopHandle = w.topicsHealthLoop() -method stop*(w: WakuRelay) {.async, base.} = +method stop*(w: WakuRelay) {.async: (raises: []).} = info "stop" await procCall GossipSub(w).stop() diff --git a/waku/waku_rendezvous/protocol.nim b/waku/waku_rendezvous/protocol.nim index 00b5f1a5c..89433f533 100644 --- a/waku/waku_rendezvous/protocol.nim +++ b/waku/waku_rendezvous/protocol.nim @@ -211,29 +211,22 @@ proc new*( return ok(wrv) -proc start*(self: WakuRendezVous) {.async: (raises: []).} = +method start*(self: WakuRendezVous) {.async: (raises: [CancelledError]).} = # Start the parent GenericRendezVous (starts the register deletion loop) if self.started: warn "waku rendezvous already started" return - try: - await procCall GenericRendezVous[WakuPeerRecord](self).start() - except CancelledError as exc: - error "failed to start GenericRendezVous", cause = exc.msg - return + await procCall GenericRendezVous[WakuPeerRecord](self).start() # start registering forever self.periodicRegistrationFut = self.periodicRegistration() info "waku rendezvous discovery started" -proc stopWait*(self: WakuRendezVous) {.async: (raises: []).} = +method stop*(self: WakuRendezVous) {.async: (raises: []).} = if not self.periodicRegistrationFut.isNil(): await self.periodicRegistrationFut.cancelAndWait() # Stop the parent GenericRendezVous (stops the register deletion loop) - await GenericRendezVous[WakuPeerRecord](self).stop() - - # Stop the parent GenericRendezVous (stops the register deletion loop) - await GenericRendezVous[WakuPeerRecord](self).stop() + await procCall GenericRendezVous[WakuPeerRecord](self).stop() info "waku rendezvous discovery stopped" diff --git a/waku/waku_store_sync/reconciliation.nim b/waku/waku_store_sync/reconciliation.nim index 23f513322..9dd308255 100644 --- a/waku/waku_store_sync/reconciliation.nim +++ b/waku/waku_store_sync/reconciliation.nim @@ -468,7 +468,7 @@ proc idsReceiverLoop(self: SyncReconciliation) {.async.} = self.messageIngress(id, pubsub, content) -proc start*(self: SyncReconciliation) = +method start*(self: SyncReconciliation) {.async: (raises: [CancelledError]).} = if self.started: return @@ -484,13 +484,16 @@ proc start*(self: SyncReconciliation) = info "Store Sync Reconciliation protocol started" -proc stop*(self: SyncReconciliation) = - if self.syncInterval > ZeroDuration: - self.periodicSyncFut.cancelSoon() +method stop*(self: SyncReconciliation) {.async: (raises: []).} = + defer: + self.started = false if self.syncInterval > ZeroDuration: - self.periodicPruneFut.cancelSoon() + await self.periodicSyncFut.cancelAndWait() - self.idsReceiverFut.cancelSoon() + if self.syncInterval > ZeroDuration: + await self.periodicPruneFut.cancelAndWait() + + await self.idsReceiverFut.cancelAndWait() info "Store Sync Reconciliation protocol stopped" diff --git a/waku/waku_store_sync/transfer.nim b/waku/waku_store_sync/transfer.nim index 6a600b4e3..5d20afb18 100644 --- a/waku/waku_store_sync/transfer.nim +++ b/waku/waku_store_sync/transfer.nim @@ -217,7 +217,7 @@ proc new*( return transfer -proc start*(self: SyncTransfer) = +method start*(self: SyncTransfer) {.async: (raises: [CancelledError]).} = if self.started: return @@ -228,10 +228,11 @@ proc start*(self: SyncTransfer) = info "Store Sync Transfer protocol started" -proc stop*(self: SyncTransfer) = - self.started = false +method stop*(self: SyncTransfer) {.async: (raises: []).} = + defer: + self.started = false - self.localWantsRxFut.cancelSoon() - self.remoteNeedsRxFut.cancelSoon() + await self.localWantsRxFut.cancelAndWait() + await self.remoteNeedsRxFut.cancelAndWait() info "Store Sync Transfer protocol stopped"