From ccd4865df5cdc986b60f529fcd864b8ee0f0ad12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Sat, 14 Mar 2026 16:17:32 -0400 Subject: [PATCH] dht: allow search table update with listen token refresh --- src/dht.cpp | 7 +++++-- src/search.h | 10 ++++++++++ tests/test_networkengine.cpp | 6 ++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/dht.cpp b/src/dht.cpp index bd4c4934..187b5c98 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -661,8 +661,9 @@ Dht::searchSynchedNodeListen(const Sp& sr, SearchNode& n) /* on new values */ if (auto sr = ws.lock()) { scheduler.edit(sr->nextSearchStep, scheduler.time()); - sr->insertNode(node, scheduler.time(), answer.ntoken); if (auto sn = sr->getNode(node)) { + if (not answer.ntoken.empty()) + sn->refreshToken(answer.ntoken); sn->onValues(query, std::move(answer), types, scheduler); } } @@ -2715,7 +2716,9 @@ Dht::onListenDone(const Sp& node, net::RequestAnswer& answer, Sp& if (not sr->done) { const auto& now = scheduler.time(); - sr->insertNode(node, now, answer.ntoken); + if (not answer.ntoken.empty()) + if (auto sn = sr->getNode(node)) + sn->refreshToken(answer.ntoken); searchSendGetValues(sr); scheduler.edit(sr->nextSearchStep, now); } diff --git a/src/search.h b/src/search.h index 9a1bcdc5..9b8485ed 100644 --- a/src/search.h +++ b/src/search.h @@ -133,6 +133,16 @@ struct Dht::SearchNode return last_get_reply + Node::NODE_EXPIRE_TIME; } + /** + * Update the token without refreshing last_get_reply, + * so that periodic find_node/get requests still occur. + */ + void refreshToken(const Blob& tok) + { + if (not tok.empty() and tok.size() <= 64) + token = tok; + } + friend std::ostream& operator<<(std::ostream& s, const SearchNode& node) { s << "getStatus:" << node.getStatus.size() << " listenStatus:" << node.listenStatus.size() diff --git a/tests/test_networkengine.cpp b/tests/test_networkengine.cpp index 6cc8a016..16c16251 100644 --- a/tests/test_networkengine.cpp +++ b/tests/test_networkengine.cpp @@ -428,8 +428,10 @@ NetworkEngineTester::testListenConfirmationUpdatesSearchNodeToken() localDht.onListenDone(node, answer, sr); CPPUNIT_ASSERT(searchNodePtr->token == answer.ntoken); - CPPUNIT_ASSERT(searchNodePtr->last_get_reply == localDht.scheduler.time()); - CPPUNIT_ASSERT(searchNodePtr->isSynced(localDht.scheduler.time())); + /* last_get_reply should NOT be updated by listen confirmation, + so that periodic find_node requests still refresh the search table. */ + CPPUNIT_ASSERT(searchNodePtr->last_get_reply == time_point::min()); + CPPUNIT_ASSERT(!searchNodePtr->isSynced(localDht.scheduler.time())); } void