From baabfabedce7fb22adbc6262328c490564815ee9 Mon Sep 17 00:00:00 2001 From: dr7ana Date: Tue, 28 Nov 2023 12:50:07 -0800 Subject: [PATCH] fetch RID result handler logic --- llarp/link/link_manager.cpp | 10 +---- llarp/nodedb.cpp | 79 +++++++++++++++++-------------------- llarp/nodedb.hpp | 4 +- 3 files changed, 41 insertions(+), 52 deletions(-) diff --git a/llarp/link/link_manager.cpp b/llarp/link/link_manager.cpp index ccbeb7539..e9070533a 100644 --- a/llarp/link/link_manager.cpp +++ b/llarp/link/link_manager.cpp @@ -167,7 +167,7 @@ namespace llarp _router.loop()->call([this, msg = std::move(m), func = std::move(func)]() mutable { auto body = msg.body_str(); auto respond = [m = std::move(msg)](std::string response) mutable { - m.respond(std::move(response)); + m.respond(std::move(response), not m); }; std::invoke(func, this, body, std::move(respond)); }); @@ -517,12 +517,6 @@ namespace llarp LinkManager::fetch_router_ids( const RouterID& via, std::string payload, std::function func) { - if (ep.conns.empty()) - { - log::debug(link_cat, "Not attempting to fetch Router IDs: not connected to any relays."); - return; - } - send_control_message(via, "fetch_router_ids"s, std::move(payload), std::move(func)); } @@ -571,7 +565,7 @@ namespace llarp [source_rid = std::move(source_rid), orig_mess = std::move(m)](oxen::quic::message m) mutable { if (not m.timed_out) - orig_mess.respond(m.body_str()); + orig_mess.respond(m.body_str(), not m); // on timeout, just silently drop (as original requester will just time out anyway) }); } diff --git a/llarp/nodedb.cpp b/llarp/nodedb.cpp index 38b930b02..a72211727 100644 --- a/llarp/nodedb.cpp +++ b/llarp/nodedb.cpp @@ -208,11 +208,9 @@ namespace llarp } void - NodeDB::ingest_rid_fetch_responses(const RemoteRC& source, std::vector ids) + NodeDB::ingest_rid_fetch_responses(const RouterID& source, std::vector ids) { - const auto& rid = source.router_id(); - - fetch_rid_responses[rid] = std::move(ids); + fetch_rid_responses[source] = std::move(ids); } // TODO: trust model @@ -355,7 +353,6 @@ namespace llarp while (num_failures < MAX_FETCH_ATTEMPTS) { - RemoteRC& src_rc = known_rcs[src]; auto success = std::make_shared>(); auto f = success->get_future(); fails.clear(); @@ -365,12 +362,12 @@ namespace llarp _router.link_manager().fetch_router_ids( src, RouterIDFetch::serialize(target), - [this, src, src_rc, target, p = std::move(success)](oxen::quic::message m) mutable { + [this, src, target, p = std::move(success)](oxen::quic::message m) mutable { if (not m) { log::info(link_cat, "RID fetch from {} via {} timed out", src, target); - ingest_rid_fetch_responses(src_rc); + ingest_rid_fetch_responses(src); p->set_value(-1); return; } @@ -405,7 +402,7 @@ namespace llarp router_ids.emplace_back(s.data()); } - ingest_rid_fetch_responses(src_rc, std::move(router_ids)); + ingest_rid_fetch_responses(src, std::move(router_ids)); return; } catch (const std::exception& e) @@ -414,7 +411,7 @@ namespace llarp p->set_value(0); } - ingest_rid_fetch_responses(src_rc); // empty response == failure + ingest_rid_fetch_responses(src); // empty response == failure }); switch (f.get()) @@ -581,12 +578,10 @@ namespace llarp void NodeDB::fetch_router_ids() { - auto& num_failures = fetch_failures; - // base case; this function is called recursively - if (num_failures > MAX_FETCH_ATTEMPTS) + if (fetch_failures > MAX_FETCH_ATTEMPTS) { - fetch_rids_result(fetch_source, true); + fetch_rids_result(); return; } @@ -604,20 +599,20 @@ namespace llarp fetch_rid_responses.clear(); RouterID& src = fetch_source; - RemoteRC& src_rc = known_rcs[src]; for (const auto& target : rid_sources) { _router.link_manager().fetch_router_ids( src, RouterIDFetch::serialize(target), - [this, src, src_rc, target](oxen::quic::message m) mutable { - if (not m) + [this, src, target](oxen::quic::message m) mutable { + if (m.timed_out) { log::info(link_cat, "RID fetch from {} via {} timed out", src, target); - ingest_rid_fetch_responses(src_rc); - fetch_rids_result(src, true); + ++fetch_failures; + ingest_rid_fetch_responses(src); + fetch_rids_result(); return; } @@ -644,55 +639,55 @@ namespace llarp { log::warning( link_cat, "RID fetch from {} via {} returned bad RouterID", target, src); - ingest_rid_fetch_responses(src_rc); - fetch_rids_result(src, true); + ingest_rid_fetch_responses(target); + fail_sources.insert(target); + fetch_rids_result(); return; } router_ids.emplace_back(s.data()); } - ingest_rid_fetch_responses(src_rc, std::move(router_ids)); - fetch_rids_result(src); + ingest_rid_fetch_responses(target, std::move(router_ids)); + fetch_rids_result(); // success return; } catch (const std::exception& e) { log::info(link_cat, "Error handling fetch RouterIDs response: {}", e.what()); - ingest_rid_fetch_responses(src_rc); - fetch_rids_result(src, true); + ingest_rid_fetch_responses(target); + fail_sources.insert(target); + fetch_rids_result(); } }); } } void - NodeDB::fetch_rids_result(const RouterID& target, bool error) + NodeDB::fetch_rids_result() { - if (error) + if (fetch_failures > MAX_FETCH_ATTEMPTS) { - fail_sources.insert(target); - ++fetch_failures; + log::info( + logcat, + "Failed {} attempts to fetch RID's from {}; reverting to bootstrap...", + MAX_FETCH_ATTEMPTS, + fetch_source); - if (fetch_failures > MAX_FETCH_ATTEMPTS) - { - log::info( - logcat, - "Failed {} attempts to fetch RID's from {}; reverting to bootstrap...", - MAX_FETCH_ATTEMPTS, - fetch_source); - // TODO: revert to bootstrap - // set rc_fetch_source to bootstrap and START OVER! - } - else - // find new non-bootstrap RC fetch source and try again buddy - fetch_source = std::next(known_rcs.begin(), csrng() % known_rcs.size())->first; + // TODO: revert rc_source to bootstrap, start over fetch_router_ids(); return; } - log::debug(logcat, "Successfully fetched RID's from {}", fetch_source); + auto n_responses = fetch_rid_responses.size(); + + if (n_responses < MIN_RID_FETCHES) + { + log::debug(logcat, "Received {}/{} fetch RID requests", n_responses, 12); + return; + } + auto n_fails = fail_sources.size(); if (n_fails <= MAX_RID_ERRORS) diff --git a/llarp/nodedb.hpp b/llarp/nodedb.hpp index df5fb1ee8..fec6d5d51 100644 --- a/llarp/nodedb.hpp +++ b/llarp/nodedb.hpp @@ -143,7 +143,7 @@ namespace llarp process_fetched_rcs(RouterID source, std::vector rcs, rc_time timestamp); void - ingest_rid_fetch_responses(const RemoteRC& source, std::vector ids = {}); + ingest_rid_fetch_responses(const RouterID& source, std::vector ids = {}); bool process_fetched_rids(); @@ -173,7 +173,7 @@ namespace llarp post_fetch_rids(); void - fetch_rids_result(const RouterID& target, bool error = false); + fetch_rids_result(); void select_router_id_sources(std::unordered_set excluded = {});