diff --git a/llarp/link/connection.cpp b/llarp/link/connection.cpp index d5fa0abf9..ca994e99c 100644 --- a/llarp/link/connection.cpp +++ b/llarp/link/connection.cpp @@ -5,7 +5,7 @@ namespace llarp::link Connection::Connection( const std::shared_ptr& c, std::shared_ptr& s) - : conn{c}, control_stream{s} /* , remote_rc{std::move(rc)} */ + : conn{c}, control_stream{s}, inbound{conn->is_inbound()} {} } // namespace llarp::link diff --git a/llarp/link/link_manager.cpp b/llarp/link/link_manager.cpp index 5297e34b0..5343b1341 100644 --- a/llarp/link/link_manager.cpp +++ b/llarp/link/link_manager.cpp @@ -67,6 +67,22 @@ namespace llarp return active_conns.count(remote) or pending_conns.count(remote); } + std::pair + Endpoint::num_in_out() const + { + size_t in{0}, out{0}; + + for (const auto& c : active_conns) + { + if (c.second->inbound) + ++in; + else + ++out; + } + + return {in, out}; + } + size_t Endpoint::num_connected(bool clients_only) const { @@ -494,16 +510,17 @@ namespace llarp void LinkManager::connect_to(const RemoteRC& rc, conn_open_hook on_open, conn_closed_hook on_close) { - if (auto conn = ep.get_conn(rc.router_id()); conn) + const auto& rid = rc.router_id(); + + if (ep.have_conn(rid)) { - log::error(logcat, "We should not be here!"); + log::warning(logcat, "We already have a connection to {}!", rid); // TODO: should implement some connection failed logic, but not the same logic that // would be executed for another failure case return; } const auto& remote_addr = rc.addr(); - const auto& rid = rc.router_id(); // TODO: confirm remote end is using the expected pubkey (RouterID). // TODO: ALPN for "client" vs "relay" (could just be set on endpoint creation) @@ -560,6 +577,12 @@ namespace llarp } } + std::pair + LinkManager::num_in_out() const + { + return ep.num_in_out(); + } + size_t LinkManager::get_num_connected(bool clients_only) const { @@ -613,7 +636,7 @@ namespace llarp auto res = client_only ? not ep.have_client_conn(rc.router_id()) : not ep.have_conn(rc.router_id()); - log::critical(logcat, "RID:{} {}", rc.router_id(), res ? "ACCEPTED" : "REJECTED"); + log::debug(logcat, "RID:{} {}", rc.router_id(), res ? "ACCEPTED" : "REJECTED"); return res; }; @@ -640,6 +663,8 @@ namespace llarp LinkManager::gossip_rc( const RouterID& gossip_src, const RouterID& last_sender, std::string serialized_rc) { + int count = 0; + for (auto& [rid, conn] : ep.active_conns) { // don't send back to the gossip source or the last sender @@ -650,8 +675,6 @@ namespace llarp if (not conn->remote_is_relay) continue; - log::critical(logcat, "Dispatching gossip_rc to {}", rid); - send_control_message( rid, "gossip_rc"s, @@ -659,7 +682,10 @@ namespace llarp [](oxen::quic::message) mutable { log::critical(logcat, "PLACEHOLDER FOR GOSSIP RC RESPONSE HANDLER"); }); + ++count; } + + log::critical(logcat, "Dispatched {} GossipRC requests!", count); } void diff --git a/llarp/link/link_manager.hpp b/llarp/link/link_manager.hpp index 54d06eb1e..a24190956 100644 --- a/llarp/link/link_manager.hpp +++ b/llarp/link/link_manager.hpp @@ -72,6 +72,9 @@ namespace llarp bool have_conn(const RouterID& remote) const; + std::pair + num_in_out() const; + size_t num_connected(bool clients_only) const; @@ -291,6 +294,9 @@ namespace llarp void set_conn_persist(const RouterID& remote, llarp_time_t until); + std::pair + num_in_out() const; + size_t get_num_connected(bool clients_only = false) const; diff --git a/llarp/nodedb.cpp b/llarp/nodedb.cpp index 91e8d4ed2..b459b91a9 100644 --- a/llarp/nodedb.cpp +++ b/llarp/nodedb.cpp @@ -915,15 +915,6 @@ namespace llarp return rc_lookup.count(pk); } - std::optional - NodeDB::get_rc(const RemoteRC& pk) const - { - if (auto itr = known_rcs.find(pk); itr != known_rcs.end()) - return *itr; - - return std::nullopt; - } - std::optional NodeDB::get_rc(const RouterID& pk) const { @@ -997,7 +988,7 @@ namespace llarp bool NodeDB::verify_store_gossip_rc(const RemoteRC& rc) { - if (not registered_routers().count(rc.router_id())) + if (registered_routers().count(rc.router_id())) return put_rc_if_newer(rc); return false; @@ -1006,13 +997,15 @@ namespace llarp bool NodeDB::put_rc_if_newer(RemoteRC rc) { - if (auto maybe = get_rc(rc)) + if (auto maybe = get_rc(rc.router_id())) { if (maybe->other_is_newer(rc)) return put_rc(rc); + + return false; } - return false; + return put_rc(rc); } void diff --git a/llarp/nodedb.hpp b/llarp/nodedb.hpp index 57a835915..7b8a3b4ea 100644 --- a/llarp/nodedb.hpp +++ b/llarp/nodedb.hpp @@ -423,9 +423,6 @@ namespace llarp std::optional get_rc(const RouterID& pk) const; - std::optional - get_rc(const RemoteRC& pk) const; - std::optional get_random_rc() const; @@ -450,7 +447,8 @@ namespace llarp get_random_rc_conditional(std::function hook) const; std::optional> - get_n_random_rcs_conditional(size_t n, std::function hook, bool exact = false) const; + get_n_random_rcs_conditional( + size_t n, std::function hook, bool exact = false) const; // Updates `current` to not contain any of the elements of `replace` and resamples (up to // `target_size`) from population to refill it. diff --git a/llarp/router/router.cpp b/llarp/router/router.cpp index a530c6712..2d7fe5e66 100644 --- a/llarp/router/router.cpp +++ b/llarp/router/router.cpp @@ -750,14 +750,18 @@ namespace llarp if (is_service_node()) { + auto [in, out] = _link_manager->num_in_out(); + log::critical( logcat, - "Local Service Node has {} RCs, {} RIDs, {} bootstrap peers, {} router " + "Local Service Node has {} RCs, {} RIDs, {} bootstrap peers, {}:{} (inbound:outbound) " + "router " "connections, and {} client connections since last RC update ({} to expiry)", _node_db->num_rcs(), _node_db->num_rids(), _node_db->num_bootstraps(), - num_router_connections(), + in, + out, num_client_connections(), router_contact.time_to_expiry(now)); } @@ -874,7 +878,7 @@ namespace llarp last_rc_gossip = now_timepoint; - // TESTNET: 1 to 2 minutes before testnet gossip interval + // TESTNET: 1 to 4 minutes before testnet gossip interval auto random_delta = std::chrono::seconds{std::uniform_int_distribution{60, 300}(llarp::csrng)}; // 1min to 5min before "stale time" is next gossip time diff --git a/llarp/router/router.hpp b/llarp/router/router.hpp index 39d0c8693..9434d2ad4 100644 --- a/llarp/router/router.hpp +++ b/llarp/router/router.hpp @@ -49,7 +49,7 @@ namespace llarp (INTROSET_RELAY_REDUNDANCY * INTROSET_REQS_PER_RELAY)}; // TESTNET: these constants are shortened for testing purposes - inline constexpr std::chrono::milliseconds TESTNET_GOSSIP_INTERVAL{4min}; + inline constexpr std::chrono::milliseconds TESTNET_GOSSIP_INTERVAL{10min}; inline constexpr std::chrono::milliseconds RC_UPDATE_INTERVAL{4min}; // as we advance towards full mesh, we try to connect to this number per tick inline constexpr int FULL_MESH_ITERATION{1};