From 5a7f4a33bb6cfe9eb467a17080aa884c07304383 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Fri, 5 Dec 2025 17:12:59 +0530 Subject: [PATCH 1/6] fix: store-query issue in v0.37.0 --- tools/confutils/cli_args.nim | 15 +++------------ waku/factory/conf_builder/waku_conf_builder.nim | 9 +++++---- waku/node/peer_manager/peer_manager.nim | 2 +- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/tools/confutils/cli_args.nim b/tools/confutils/cli_args.nim index e6b3fc97d..c7af0a0ec 100644 --- a/tools/confutils/cli_args.nim +++ b/tools/confutils/cli_args.nim @@ -206,22 +206,16 @@ type WakuNodeConf* = object .}: bool maxConnections* {. - desc: "Maximum allowed number of libp2p connections.", - defaultValue: 50, + desc: "Maximum allowed number of libp2p connections. (Default: 200) can't set it to less than 200", + defaultValue: 200, name: "max-connections" .}: int - maxRelayPeers* {. - desc: - "Deprecated. Use relay-service-ratio instead. It represents the maximum allowed number of relay peers.", - name: "max-relay-peers" - .}: Option[int] - relayServiceRatio* {. desc: "This percentage ratio represents the relay peers to service peers. For example, 60:40, tells that 60% of the max-connections will be used for relay protocol and the other 40% of max-connections will be reserved for other service protocols (e.g., filter, lightpush, store, metadata, etc.)", name: "relay-service-ratio", - defaultValue: "60:40" # 60:40 ratio of relay to service peers + defaultValue: "50:50" .}: string colocationLimit* {. @@ -957,9 +951,6 @@ proc toWakuConf*(n: WakuNodeConf): ConfResult[WakuConf] = b.withExtMultiAddrsOnly(n.extMultiAddrsOnly) b.withMaxConnections(n.maxConnections) - if n.maxRelayPeers.isSome(): - b.withMaxRelayPeers(n.maxRelayPeers.get()) - if n.relayServiceRatio != "": b.withRelayServiceRatio(n.relayServiceRatio) b.withColocationLimit(n.colocationLimit) diff --git a/waku/factory/conf_builder/waku_conf_builder.nim b/waku/factory/conf_builder/waku_conf_builder.nim index 645869247..e1c3703ff 100644 --- a/waku/factory/conf_builder/waku_conf_builder.nim +++ b/waku/factory/conf_builder/waku_conf_builder.nim @@ -208,7 +208,11 @@ proc withPeerStoreCapacity*(b: var WakuConfBuilder, peerStoreCapacity: int) = b.peerStoreCapacity = some(peerStoreCapacity) proc withMaxConnections*(b: var WakuConfBuilder, maxConnections: int) = - b.maxConnections = some(maxConnections) + if maxConnections < 200: + raise newException(ValueError, "maxConnections cannot be less than 200") + b.maxConnections = some(200) + else: + b.maxConnections = some(maxConnections) proc withDnsAddrsNameServers*( b: var WakuConfBuilder, dnsAddrsNameServers: seq[IpAddress] @@ -248,9 +252,6 @@ proc withAgentString*(b: var WakuConfBuilder, agentString: string) = proc withColocationLimit*(b: var WakuConfBuilder, colocationLimit: int) = b.colocationLimit = some(colocationLimit) -proc withMaxRelayPeers*(b: var WakuConfBuilder, maxRelayPeers: int) = - b.maxRelayPeers = some(maxRelayPeers) - proc withRelayServiceRatio*(b: var WakuConfBuilder, relayServiceRatio: string) = b.relayServiceRatio = some(relayServiceRatio) diff --git a/waku/node/peer_manager/peer_manager.nim b/waku/node/peer_manager/peer_manager.nim index 1abcc1ac0..c2358763b 100644 --- a/waku/node/peer_manager/peer_manager.nim +++ b/waku/node/peer_manager/peer_manager.nim @@ -1041,7 +1041,7 @@ proc new*( wakuMetadata: WakuMetadata = nil, maxRelayPeers: Option[int] = none(int), maxServicePeers: Option[int] = none(int), - relayServiceRatio: string = "60:40", + relayServiceRatio: string = "50:50", storage: PeerStorage = nil, initialBackoffInSec = InitialBackoffInSec, backoffFactor = BackoffFactor, From 41630f4fa3bc082076d84946d226eda62c6c0b37 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Mon, 8 Dec 2025 17:42:42 +0530 Subject: [PATCH 2/6] fix: store-query issue in v0.37.0 --- tests/testlib/wakunode.nim | 4 ++-- tools/confutils/cli_args.nim | 9 ++++---- waku/waku_archive/archive.nim | 10 +++++++++ waku/waku_store/client.nim | 40 ++++++++++++++++++++++++++++------- 4 files changed, 49 insertions(+), 14 deletions(-) diff --git a/tests/testlib/wakunode.nim b/tests/testlib/wakunode.nim index ef6ba2b24..b732ede64 100644 --- a/tests/testlib/wakunode.nim +++ b/tests/testlib/wakunode.nim @@ -34,8 +34,8 @@ proc defaultTestWakuConfBuilder*(): WakuConfBuilder = @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")] ) builder.withNatStrategy("any") - builder.withMaxConnections(50) - builder.withRelayServiceRatio("60:40") + builder.withMaxConnections(200) + builder.withRelayServiceRatio("50:50") builder.withMaxMessageSize("1024 KiB") builder.withClusterId(DefaultClusterId) builder.withSubscribeShards(@[DefaultShardId]) diff --git a/tools/confutils/cli_args.nim b/tools/confutils/cli_args.nim index c7af0a0ec..856b51ddc 100644 --- a/tools/confutils/cli_args.nim +++ b/tools/confutils/cli_args.nim @@ -206,16 +206,17 @@ type WakuNodeConf* = object .}: bool maxConnections* {. - desc: "Maximum allowed number of libp2p connections. (Default: 200) can't set it to less than 200", - defaultValue: 200, + desc: + "Maximum allowed number of libp2p connections. (Default: 200) can't set it to less than 200", + defaultValue: 200, name: "max-connections" .}: int relayServiceRatio* {. desc: "This percentage ratio represents the relay peers to service peers. For example, 60:40, tells that 60% of the max-connections will be used for relay protocol and the other 40% of max-connections will be reserved for other service protocols (e.g., filter, lightpush, store, metadata, etc.)", - name: "relay-service-ratio", - defaultValue: "50:50" + defaultValue: "50:50", + name: "relay-service-ratio" .}: string colocationLimit* {. diff --git a/waku/waku_archive/archive.nim b/waku/waku_archive/archive.nim index 707c757a3..8eb1fc051 100644 --- a/waku/waku_archive/archive.nim +++ b/waku/waku_archive/archive.nim @@ -61,9 +61,19 @@ proc validate*(msg: WakuMessage): Result[void, string] = upperBound = now + MaxMessageTimestampVariance if msg.timestamp < lowerBound: + warn "rejecting message with old timestamp", + msgTimestamp = msg.timestamp, + lowerBound = lowerBound, + now = now, + drift = (now - msg.timestamp) div 1_000_000_000 return err(invalidMessageOld) if upperBound < msg.timestamp: + warn "rejecting message with future timestamp", + msgTimestamp = msg.timestamp, + upperBound = upperBound, + now = now, + drift = (msg.timestamp - now) div 1_000_000_000 return err(invalidMessageFuture) return ok() diff --git a/waku/waku_store/client.nim b/waku/waku_store/client.nim index 308d7f98e..3d6011d37 100644 --- a/waku/waku_store/client.nim +++ b/waku/waku_store/client.nim @@ -1,6 +1,12 @@ {.push raises: [].} -import std/[options, tables], results, chronicles, chronos, metrics, bearssl/rand +import + std/[options, tables, sequtils, algorithm], + results, + chronicles, + chronos, + metrics, + bearssl/rand import ../node/peer_manager, ../utils/requests, ./protocol_metrics, ./common, ./rpc_codec @@ -10,6 +16,8 @@ logScope: const DefaultPageSize*: uint = 20 # A recommended default number of waku messages per page +const MaxQueryRetries = 5 # Maximum number of store peers to try before giving up + type WakuStoreClient* = ref object peerManager: PeerManager rng: ref rand.HmacDrbgContext @@ -79,18 +87,34 @@ proc query*( proc queryToAny*( self: WakuStoreClient, request: StoreQueryRequest, peerId = none(PeerId) ): Future[StoreQueryResult] {.async.} = - ## This proc is similar to the query one but in this case - ## we don't specify a particular peer and instead we get it from peer manager + ## we don't specify a particular peer and instead we get it from peer manager. + ## It will retry with different store peers if the dial fails. if request.paginationCursor.isSome() and request.paginationCursor.get() == EmptyCursor: return err(StoreError(kind: ErrorCode.BAD_REQUEST, cause: "invalid cursor")) - let peer = self.peerManager.selectPeer(WakuStoreCodec).valueOr: + # Get all available store peers + var peers = self.peerManager.switch.peerStore.getPeersByProtocol(WakuStoreCodec) + if peers.len == 0: return err(StoreError(kind: BAD_RESPONSE, cause: "no service store peer connected")) - let connection = (await self.peerManager.dialPeer(peer, WakuStoreCodec)).valueOr: - waku_store_errors.inc(labelValues = [DialFailure]) + # Shuffle to distribute load and limit retries + let peersToTry = peers[0 ..< min(peers.len, MaxQueryRetries)] - return err(StoreError(kind: ErrorCode.PEER_DIAL_FAILURE, address: $peer)) + var lastError: StoreError + for peer in peersToTry: + let connection = (await self.peerManager.dialPeer(peer, WakuStoreCodec)).valueOr: + waku_store_errors.inc(labelValues = [DialFailure]) + warn "failed to dial store peer, trying next" + lastError = StoreError(kind: ErrorCode.PEER_DIAL_FAILURE, address: $peer) + continue - return await self.sendStoreRequest(request, connection) + let res = await self.sendStoreRequest(request, connection) + if res.isOk(): + return res + + warn "store query failed, trying next peer", + peerId = peer.peerId, cause = $res.error + lastError = res.error + + return err(lastError) From 867c758451dd12a7a81551e70488f24b474ce6b7 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Mon, 8 Dec 2025 23:30:47 +0530 Subject: [PATCH 3/6] fix: store-query issue in v0.37.0 --- waku/factory/conf_builder/waku_conf_builder.nim | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/waku/factory/conf_builder/waku_conf_builder.nim b/waku/factory/conf_builder/waku_conf_builder.nim index e1c3703ff..a250226f8 100644 --- a/waku/factory/conf_builder/waku_conf_builder.nim +++ b/waku/factory/conf_builder/waku_conf_builder.nim @@ -208,11 +208,7 @@ proc withPeerStoreCapacity*(b: var WakuConfBuilder, peerStoreCapacity: int) = b.peerStoreCapacity = some(peerStoreCapacity) proc withMaxConnections*(b: var WakuConfBuilder, maxConnections: int) = - if maxConnections < 200: - raise newException(ValueError, "maxConnections cannot be less than 200") - b.maxConnections = some(200) - else: - b.maxConnections = some(maxConnections) + b.maxConnections = some(maxConnections) proc withDnsAddrsNameServers*( b: var WakuConfBuilder, dnsAddrsNameServers: seq[IpAddress] From 8133e545be42b607cc3321e843757a75d4f71c80 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Mon, 8 Dec 2025 23:56:38 +0530 Subject: [PATCH 4/6] fix: store-query issue in v0.37.0 --- tests/testlib/wakunode.nim | 2 +- tools/confutils/cli_args.nim | 4 ++-- .../factory/conf_builder/waku_conf_builder.nim | 18 +++++++++++------- waku/factory/waku_conf.nim | 11 +++++++++++ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/tests/testlib/wakunode.nim b/tests/testlib/wakunode.nim index b732ede64..0ab94265b 100644 --- a/tests/testlib/wakunode.nim +++ b/tests/testlib/wakunode.nim @@ -34,7 +34,7 @@ proc defaultTestWakuConfBuilder*(): WakuConfBuilder = @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")] ) builder.withNatStrategy("any") - builder.withMaxConnections(200) + builder.withMaxConnections(300) builder.withRelayServiceRatio("50:50") builder.withMaxMessageSize("1024 KiB") builder.withClusterId(DefaultClusterId) diff --git a/tools/confutils/cli_args.nim b/tools/confutils/cli_args.nim index 856b51ddc..2be92105f 100644 --- a/tools/confutils/cli_args.nim +++ b/tools/confutils/cli_args.nim @@ -207,8 +207,8 @@ type WakuNodeConf* = object maxConnections* {. desc: - "Maximum allowed number of libp2p connections. (Default: 200) can't set it to less than 200", - defaultValue: 200, + "Maximum allowed number of libp2p connections. (Default: 300) can't set it to less than 300", + defaultValue: 300, name: "max-connections" .}: int diff --git a/waku/factory/conf_builder/waku_conf_builder.nim b/waku/factory/conf_builder/waku_conf_builder.nim index a250226f8..5833fcdfd 100644 --- a/waku/factory/conf_builder/waku_conf_builder.nim +++ b/waku/factory/conf_builder/waku_conf_builder.nim @@ -585,12 +585,16 @@ proc build*( warn "Peer persistence not specified, defaulting to false" false - let maxConnections = - if builder.maxConnections.isSome(): - builder.maxConnections.get() - else: - warn "Max Connections was not specified, defaulting to 300" - 300 + var maxConnections: int + if builder.maxConnections.isSome(): + var mc = builder.maxConnections.get() # mutable to enforce minimum + if mc < 300: + warn "max-connections less than 300; using default 300", provided = mc + mc = 300 + maxConnections = mc + else: + warn "Max Connections was not specified, defaulting to 300" + maxConnections = 300 # TODO: Do the git version thing here let agentString = builder.agentString.get("nwaku") @@ -660,7 +664,7 @@ proc build*( agentString: agentString, colocationLimit: colocationLimit, maxRelayPeers: builder.maxRelayPeers, - relayServiceRatio: builder.relayServiceRatio.get("60:40"), + relayServiceRatio: builder.relayServiceRatio.get("50:50"), rateLimit: rateLimit, circuitRelayClient: builder.circuitRelayClient.get(false), staticNodes: builder.staticNodes, diff --git a/waku/factory/waku_conf.nim b/waku/factory/waku_conf.nim index 899008221..404f690e7 100644 --- a/waku/factory/waku_conf.nim +++ b/waku/factory/waku_conf.nim @@ -231,8 +231,19 @@ proc validateNoEmptyStrings(wakuConf: WakuConf): Result[void, string] = return ok() +proc validateMaxConnectionsAndRatio(wakuConf: WakuConf): Result[void, string] = + if wakuConf.maxConnections < 300: + return + err("max-connections must be at least 300, provided " & $wakuConf.maxConnections) + if wakuConf.relayServiceRatio != "50:50": + return err( + "relay-service-ratio must be exactly 50:50, provided " & wakuConf.relayServiceRatio + ) + ok() + proc validate*(wakuConf: WakuConf): Result[void, string] = ?wakuConf.validateNodeKey() ?wakuConf.shardingConf.validateShards(wakuConf.subscribeShards) ?wakuConf.validateNoEmptyStrings() + ?wakuConf.validateMaxConnectionsAndRatio() return ok() From 25737bcb6bc7ab82985a0c27c2ca53a320c26041 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Wed, 10 Dec 2025 16:48:03 +0530 Subject: [PATCH 5/6] fix: store-query issue in v0.37.0 --- tests/testlib/wakunode.nim | 2 +- tools/confutils/cli_args.nim | 4 ++-- waku/factory/conf_builder/waku_conf_builder.nim | 13 ++++++------- waku/factory/waku_conf.nim | 11 ----------- waku/waku_store/client.nim | 11 +++++------ 5 files changed, 14 insertions(+), 27 deletions(-) diff --git a/tests/testlib/wakunode.nim b/tests/testlib/wakunode.nim index 0ab94265b..36aacce03 100644 --- a/tests/testlib/wakunode.nim +++ b/tests/testlib/wakunode.nim @@ -34,7 +34,7 @@ proc defaultTestWakuConfBuilder*(): WakuConfBuilder = @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")] ) builder.withNatStrategy("any") - builder.withMaxConnections(300) + builder.withMaxConnections(150) builder.withRelayServiceRatio("50:50") builder.withMaxMessageSize("1024 KiB") builder.withClusterId(DefaultClusterId) diff --git a/tools/confutils/cli_args.nim b/tools/confutils/cli_args.nim index 2be92105f..6811e335f 100644 --- a/tools/confutils/cli_args.nim +++ b/tools/confutils/cli_args.nim @@ -207,8 +207,8 @@ type WakuNodeConf* = object maxConnections* {. desc: - "Maximum allowed number of libp2p connections. (Default: 300) can't set it to less than 300", - defaultValue: 300, + "Maximum allowed number of libp2p connections. (Default: 150) that's recommended value for better connectivity", + defaultValue: 150, name: "max-connections" .}: int diff --git a/waku/factory/conf_builder/waku_conf_builder.nim b/waku/factory/conf_builder/waku_conf_builder.nim index 5833fcdfd..e80f1b4aa 100644 --- a/waku/factory/conf_builder/waku_conf_builder.nim +++ b/waku/factory/conf_builder/waku_conf_builder.nim @@ -587,14 +587,13 @@ proc build*( var maxConnections: int if builder.maxConnections.isSome(): - var mc = builder.maxConnections.get() # mutable to enforce minimum - if mc < 300: - warn "max-connections less than 300; using default 300", provided = mc - mc = 300 - maxConnections = mc + maxConnections = builder.maxConnections.get() + if maxConnections < 150: + warn "max-connections less than 150; we suggest using 150 or more for better connectivity", + provided = maxConnections else: - warn "Max Connections was not specified, defaulting to 300" - maxConnections = 300 + warn "Max Connections was not specified, defaulting to 150" + maxConnections = 150 # TODO: Do the git version thing here let agentString = builder.agentString.get("nwaku") diff --git a/waku/factory/waku_conf.nim b/waku/factory/waku_conf.nim index 404f690e7..899008221 100644 --- a/waku/factory/waku_conf.nim +++ b/waku/factory/waku_conf.nim @@ -231,19 +231,8 @@ proc validateNoEmptyStrings(wakuConf: WakuConf): Result[void, string] = return ok() -proc validateMaxConnectionsAndRatio(wakuConf: WakuConf): Result[void, string] = - if wakuConf.maxConnections < 300: - return - err("max-connections must be at least 300, provided " & $wakuConf.maxConnections) - if wakuConf.relayServiceRatio != "50:50": - return err( - "relay-service-ratio must be exactly 50:50, provided " & wakuConf.relayServiceRatio - ) - ok() - proc validate*(wakuConf: WakuConf): Result[void, string] = ?wakuConf.validateNodeKey() ?wakuConf.shardingConf.validateShards(wakuConf.subscribeShards) ?wakuConf.validateNoEmptyStrings() - ?wakuConf.validateMaxConnectionsAndRatio() return ok() diff --git a/waku/waku_store/client.nim b/waku/waku_store/client.nim index 3d6011d37..5b261af47 100644 --- a/waku/waku_store/client.nim +++ b/waku/waku_store/client.nim @@ -109,12 +109,11 @@ proc queryToAny*( lastError = StoreError(kind: ErrorCode.PEER_DIAL_FAILURE, address: $peer) continue - let res = await self.sendStoreRequest(request, connection) - if res.isOk(): - return res + let response = (await self.sendStoreRequest(request, connection)).valueOr: + warn "store query failed, trying next peer", peerId = peer.peerId, error = $error + lastError = error + continue - warn "store query failed, trying next peer", - peerId = peer.peerId, cause = $res.error - lastError = res.error + return ok(response) return err(lastError) From 98493ff605ad9f0254c2696ffca02d56c652c464 Mon Sep 17 00:00:00 2001 From: darshankabariya Date: Tue, 23 Dec 2025 16:01:35 +0530 Subject: [PATCH 6/6] chore: not forcing value --- waku/factory/conf_builder/waku_conf_builder.nim | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/waku/factory/conf_builder/waku_conf_builder.nim b/waku/factory/conf_builder/waku_conf_builder.nim index cd01897a9..d0e5af9fc 100644 --- a/waku/factory/conf_builder/waku_conf_builder.nim +++ b/waku/factory/conf_builder/waku_conf_builder.nim @@ -585,15 +585,10 @@ proc build*( warn "Peer persistence not specified, defaulting to false" false - var maxConnections: int - if builder.maxConnections.isSome(): - maxConnections = builder.maxConnections.get() - if maxConnections < 150: - warn "max-connections less than 150; we suggest using 150 or more for better connectivity", - provided = maxConnections - else: - warn "Max Connections was not specified, defaulting to 150" - maxConnections = 150 + let maxConnections = builder.maxConnections.get() + if maxConnections < 150: + warn "max-connections less than 150; we suggest using 150 or more for better connectivity", + provided = maxConnections # TODO: Do the git version thing here let agentString = builder.agentString.get("nwaku")