From 6d1622875a3f3fe4174b8d77f795a031c0cd7f29 Mon Sep 17 00:00:00 2001 From: Kim De Mey Date: Fri, 24 Nov 2023 15:07:23 +0100 Subject: [PATCH] Do a radius check before accessing the db in handleFindContent (#1906) --- fluffy/network/wire/portal_protocol.nim | 38 +++++++++++++------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/fluffy/network/wire/portal_protocol.nim b/fluffy/network/wire/portal_protocol.nim index d6a2282af..be019aca2 100644 --- a/fluffy/network/wire/portal_protocol.nim +++ b/fluffy/network/wire/portal_protocol.nim @@ -369,27 +369,29 @@ proc handleFindContent( portal_find_content_log_distance.observe( int64(logDistance), labelValues = [$p.protocolId]) - let contentResult = p.dbGet(fc.contentKey, contentId) + # Check first if content is in range, as this is a cheaper operation + if p.inRange(contentId): + let contentResult = p.dbGet(fc.contentKey, contentId) + if contentResult.isOk(): + let content = contentResult.get() + if content.len <= maxPayloadSize: + return encodeMessage(ContentMessage( + contentMessageType: contentType, content: ByteList(content))) + else: + let connectionId = p.stream.addContentRequest(srcId, content) - if contentResult.isOk(): - let content = contentResult.get() - if content.len <= maxPayloadSize: - encodeMessage(ContentMessage( - contentMessageType: contentType, content: ByteList(content))) - else: - let connectionId = p.stream.addContentRequest(srcId, content) + return encodeMessage(ContentMessage( + contentMessageType: connectionIdType, connectionId: connectionId)) - encodeMessage(ContentMessage( - contentMessageType: connectionIdType, connectionId: connectionId)) - else: - # Don't have the content, send closest neighbours to content id. - let - closestNodes = p.routingTable.neighbours( - NodeId(contentId), seenOnly = true) - enrs = truncateEnrs(closestNodes, maxPayloadSize, enrOverhead) - portal_content_enrs_packed.observe(enrs.len().int64) + # Node does not have the content, or content is not even in radius, + # send closest neighbours to the requested content id. + let + closestNodes = p.routingTable.neighbours( + NodeId(contentId), seenOnly = true) + enrs = truncateEnrs(closestNodes, maxPayloadSize, enrOverhead) + portal_content_enrs_packed.observe(enrs.len().int64) - encodeMessage(ContentMessage(contentMessageType: enrsType, enrs: enrs)) + encodeMessage(ContentMessage(contentMessageType: enrsType, enrs: enrs)) proc handleOffer(p: PortalProtocol, o: OfferMessage, srcId: NodeId): seq[byte] = # Early return when our contentQueue is full. This means there is a backlog