From 5309ce294b1986ad19b975b3882daef52d57db13 Mon Sep 17 00:00:00 2001 From: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> Date: Tue, 23 Jun 2026 11:39:35 +0200 Subject: [PATCH] fix: retry send tasks stuck in Entry state --- .../send_service/send_processor.nim | 7 +++- tests/api/test_api_send.nim | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/logos_delivery/messaging/delivery_service/send_service/send_processor.nim b/logos_delivery/messaging/delivery_service/send_service/send_processor.nim index 3782b9d4e..ae6d7141d 100644 --- a/logos_delivery/messaging/delivery_service/send_service/send_processor.nim +++ b/logos_delivery/messaging/delivery_service/send_service/send_processor.nim @@ -32,5 +32,10 @@ method process*( currentProcessor = currentProcessor.fallbackProcessor keepTrying = task.state == DeliveryState.FallbackRetry - if task.state == DeliveryState.FallbackRetry: + # A task still in `FallbackRetry` exhausted the chain without delivering, and + # one still in `Entry` was never attempted because no processor had a usable + # peer yet (e.g. a lightpush peer that finishes registering right after the + # first send). Both must be queued for the next round so the service loop + # retries them; otherwise the task would sit untouched until it ages out. + if task.state == DeliveryState.FallbackRetry or task.state == DeliveryState.Entry: task.state = DeliveryState.NextRoundRetry diff --git a/tests/api/test_api_send.nim b/tests/api/test_api_send.nim index 5c75f2e4a..0585998b2 100644 --- a/tests/api/test_api_send.nim +++ b/tests/api/test_api_send.nim @@ -352,6 +352,43 @@ suite "Waku API - Send": (await node.stop()).isOkOr: raiseAssert "Failed to stop node: " & error + asyncTest "Edge sender delivers via lightpush (no relay)": + ## Reproduces issue #3847: an Edge node (no relay mounted) that is only + ## connected to a lightpush-capable peer must deliver through lightpush. + var node: Waku + lockNewGlobalBrokerContext: + node = (await createNode(createApiNodeConf(cli_args.WakuMode.Edge))).valueOr: + raiseAssert error + node.mountMessagingClient().isOkOr: + raiseAssert "Failed to mount messaging: " & error + (await node.start()).isOkOr: + raiseAssert "Failed to start Waku node: " & error + + # Edge node has no relay; its only path to the network is the + # lightpush peer it is connected to. + await node.node.connectToNodes(@[lightpushNodePeerInfo]) + + check node.node.wakuRelay.isNil() + + let eventManager = newSendEventListenerManager(node.brokerCtx) + defer: + await eventManager.teardown() + + let envelope = MessageEnvelope.init( + ContentTopic("/waku/2/default-content/proto"), "test payload" + ) + + let requestId = (await node.send(envelope)).valueOr: + raiseAssert error + + const eventTimeout = 10.seconds + discard await eventManager.waitForEvents(eventTimeout) + + eventManager.validate({SendEventOutcome.Propagated}, requestId) + + (await node.stop()).isOkOr: + raiseAssert "Failed to stop node: " & error + asyncTest "Send fully validates fallback to lightpush": var node: LogosDelivery lockNewGlobalBrokerContext: