From b5ac492fac9034d91862292c26d3f30fb7997ef6 Mon Sep 17 00:00:00 2001 From: Chrysostomos Nanakos Date: Wed, 1 Jul 2026 22:52:53 +0300 Subject: [PATCH] fix(dht-proxy): read timeout to prevent slot exhaustion (#1484) Signed-off-by: Chrysostomos Nanakos --- storage/dht_proxy/handler.nim | 19 ++++++++++++------- storage/dht_proxy/protocol.nim | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/storage/dht_proxy/handler.nim b/storage/dht_proxy/handler.nim index 20ed2d8b..b3a0a807 100644 --- a/storage/dht_proxy/handler.nim +++ b/storage/dht_proxy/handler.nim @@ -61,6 +61,18 @@ proc handleLookupRequest( self: DhtProxyProtocol, conn: Connection ) {.async: (raises: [CancelledError]).} = try: + let reqBytes = + try: + await conn.readLp(MaxLookupRequestBytes).wait(DhtProxyRequestReadTimeout) + except AsyncTimeoutError: + debug "DHT proxy request read timed out" + return + + let req = LookupRequest.decode(reqBytes).valueOr: + warn "Failed to decode lookup request" + await conn.writeLp(LookupResponse(code: LookupCode.ErrDecodeFailed).encode()) + return + if self.inFlight >= self.maxInFlight: debug "DHT proxy at capacity, replying ErrTooBusy", inFlight = self.inFlight, max = self.maxInFlight @@ -71,13 +83,6 @@ proc handleLookupRequest( defer: dec self.inFlight - let - reqBytes = await conn.readLp(MaxLookupRequestBytes) - req = LookupRequest.decode(reqBytes).valueOr: - warn "Failed to decode lookup request" - await conn.writeLp(LookupResponse(code: LookupCode.ErrDecodeFailed).encode()) - return - let resp = case req.queryType of FindProviders: diff --git a/storage/dht_proxy/protocol.nim b/storage/dht_proxy/protocol.nim index 74ad385d..90327c73 100644 --- a/storage/dht_proxy/protocol.nim +++ b/storage/dht_proxy/protocol.nim @@ -9,6 +9,7 @@ {.push raises: [].} +import pkg/chronos import pkg/libp2p/protobuf/minprotobuf import pkg/libp2p_mix import pkg/libp2p/routing_record @@ -19,6 +20,7 @@ import ../logutils const DhtProxyCodec* = "/storage/dht-proxy/1.0.0" const DefaultMaxInFlightLookups* = 100 +const DhtProxyRequestReadTimeout* = 5.seconds let MaxLookupRequestBytes* = getMaxMessageSizeForCodec(DhtProxyCodec, 1).expect( "DhtProxyCodec framing leaves no room for a Sphinx forward payload"