diff --git a/debian/patches/0003-Apply-majestrate-introset-spacing-2021-05-19.patch b/debian/patches/0003-Apply-majestrate-introset-spacing-2021-05-19.patch deleted file mode 100644 index e0b1036c7..000000000 --- a/debian/patches/0003-Apply-majestrate-introset-spacing-2021-05-19.patch +++ /dev/null @@ -1,407 +0,0 @@ -From: Jason Rhinelander -Date: Thu, 20 May 2021 11:40:11 -0300 -Subject: Apply majestrate/introset-spacing-2021-05-19 - ---- - llarp/constants/path.hpp | 2 +- - llarp/path/path.cpp | 21 ++++++++++++++++++++- - llarp/path/path.hpp | 2 +- - llarp/path/pathbuilder.cpp | 4 ++-- - llarp/path/pathset.cpp | 34 +++++++--------------------------- - llarp/path/pathset.hpp | 6 +----- - llarp/service/endpoint.cpp | 21 +++++++++++++-------- - llarp/service/endpoint.hpp | 9 +++++---- - llarp/service/intro_set.cpp | 9 +++++++++ - llarp/service/intro_set.hpp | 4 ++++ - llarp/service/outbound_context.cpp | 22 +++++++++++----------- - llarp/service/outbound_context.hpp | 4 ++-- - llarp/service/sendcontext.cpp | 1 + - 13 files changed, 77 insertions(+), 62 deletions(-) - -diff --git a/llarp/constants/path.hpp b/llarp/constants/path.hpp -index 512f561..72a22f9 100644 ---- a/llarp/constants/path.hpp -+++ b/llarp/constants/path.hpp -@@ -21,7 +21,7 @@ namespace llarp - /// minimum into lifetime we will advertise - constexpr std::chrono::milliseconds min_intro_lifetime = default_lifetime / 2; - /// spacing frequency at which we try to build paths for introductions -- constexpr std::chrono::milliseconds intro_path_spread = default_lifetime / 5; -+ constexpr std::chrono::milliseconds intro_path_spread = default_lifetime / 8; - /// Minimum paths to keep around for intros; mainly used at startup (the - /// spread, above, should be able to maintain more than this number of paths - /// normally once things are going). -diff --git a/llarp/path/path.cpp b/llarp/path/path.cpp -index fcc2734..0547670 100644 ---- a/llarp/path/path.cpp -+++ b/llarp/path/path.cpp -@@ -682,6 +682,20 @@ namespace llarp - return m_DataHandler && m_DataHandler(shared_from_this(), frame); - } - -+ template -+ static llarp_time_t -+ computeLatency(const Samples_t& samps) -+ { -+ llarp_time_t mean = 0s; -+ if (samps.empty()) -+ return mean; -+ for (const auto& samp : samps) -+ mean += samp; -+ return mean / samps.size(); -+ } -+ -+ constexpr auto MaxLatencySamples = 8; -+ - bool - Path::HandlePathLatencyMessage(const routing::PathLatencyMessage& msg, AbstractRouter* r) - { -@@ -689,7 +703,12 @@ namespace llarp - MarkActive(now); - if (msg.L == m_LastLatencyTestID) - { -- intro.latency = now - m_LastLatencyTestTime; -+ m_LatencySamples.emplace_back(now - m_LastLatencyTestTime); -+ -+ while (m_LatencySamples.size() > MaxLatencySamples) -+ m_LatencySamples.pop_front(); -+ -+ intro.latency = computeLatency(m_LatencySamples); - m_LastLatencyTestID = 0; - EnterState(ePathEstablished, now); - if (m_BuiltHook) -diff --git a/llarp/path/path.hpp b/llarp/path/path.hpp -index 0d57b37..44d130a 100644 ---- a/llarp/path/path.hpp -+++ b/llarp/path/path.hpp -@@ -424,7 +424,7 @@ namespace llarp - uint64_t m_RXRate = 0; - uint64_t m_LastTXRate = 0; - uint64_t m_TXRate = 0; -- -+ std::deque m_LatencySamples; - const std::string m_shortName; - }; - } // namespace path -diff --git a/llarp/path/pathbuilder.cpp b/llarp/path/pathbuilder.cpp -index e035bbd..0ccffbf 100644 ---- a/llarp/path/pathbuilder.cpp -+++ b/llarp/path/pathbuilder.cpp -@@ -211,8 +211,8 @@ namespace llarp - { - util::StatusObject obj{ - {"buildStats", m_BuildStats.ExtractStatus()}, -- {"numHops", uint64_t(numHops)}, -- {"numPaths", uint64_t(numDesiredPaths)}}; -+ {"numHops", uint64_t{numHops}}, -+ {"numPaths", uint64_t{numDesiredPaths}}}; - std::transform( - m_Paths.begin(), - m_Paths.end(), -diff --git a/llarp/path/pathset.cpp b/llarp/path/pathset.cpp -index f5f7885..969fdd0 100644 ---- a/llarp/path/pathset.cpp -+++ b/llarp/path/pathset.cpp -@@ -280,44 +280,24 @@ namespace llarp - return itr->second; - } - -- bool -+ std::optional> - PathSet::GetCurrentIntroductionsWithFilter( -- std::set& intros, - std::function filter) const - { -- intros.clear(); -- size_t count = 0; -- Lock_t l(m_PathsMutex); -+ std::set intros; -+ Lock_t l{m_PathsMutex}; - auto itr = m_Paths.begin(); - while (itr != m_Paths.end()) - { -- if (itr->second->IsReady() && filter(itr->second->intro)) -+ if (itr->second->IsReady() and filter(itr->second->intro)) - { - intros.insert(itr->second->intro); -- ++count; -- } -- ++itr; -- } -- return count > 0; -- } -- -- bool -- PathSet::GetCurrentIntroductions(std::set& intros) const -- { -- intros.clear(); -- size_t count = 0; -- Lock_t l(m_PathsMutex); -- auto itr = m_Paths.begin(); -- while (itr != m_Paths.end()) -- { -- if (itr->second->IsReady()) -- { -- intros.insert(itr->second->intro); -- ++count; - } - ++itr; - } -- return count > 0; -+ if (intros.empty()) -+ return std::nullopt; -+ return intros; - } - - void -diff --git a/llarp/path/pathset.hpp b/llarp/path/pathset.hpp -index db26b56..d58e520 100644 ---- a/llarp/path/pathset.hpp -+++ b/llarp/path/pathset.hpp -@@ -258,14 +258,10 @@ namespace llarp - Path_ptr - GetByEndpointWithID(RouterID router, PathID_t id) const; - -- bool -+ std::optional> - GetCurrentIntroductionsWithFilter( -- std::set& intros, - std::function filter) const; - -- bool -- GetCurrentIntroductions(std::set& intros) const; -- - virtual bool - PublishIntroSet(const service::EncryptedIntroSet&, AbstractRouter*) - { -diff --git a/llarp/service/endpoint.cpp b/llarp/service/endpoint.cpp -index 9eeac81..2bacb1d 100644 ---- a/llarp/service/endpoint.cpp -+++ b/llarp/service/endpoint.cpp -@@ -102,10 +102,14 @@ namespace llarp - const auto now = llarp::time_now_ms(); - m_LastIntrosetRegenAttempt = now; - std::set introset; -- if (!GetCurrentIntroductionsWithFilter( -- introset, [now](const service::Introduction& intro) -> bool { -+ if (const auto maybe = -+ GetCurrentIntroductionsWithFilter([now](const service::Introduction& intro) -> bool { - return not intro.ExpiresSoon(now, path::min_intro_lifetime); - })) -+ { -+ introset = *maybe; -+ } -+ else - { - LogWarn( - "could not publish descriptors for endpoint ", -@@ -710,8 +714,9 @@ namespace llarp - return false; - - auto next_pub = m_state->m_LastPublishAttempt -- + (m_state->m_IntroSet.HasExpiredIntros(now) ? INTROSET_PUBLISH_RETRY_INTERVAL -- : INTROSET_PUBLISH_INTERVAL); -+ + (m_state->m_IntroSet.HasStaleIntros(now, path::min_intro_lifetime) -+ ? IntrosetPublishRetryCooldown -+ : IntrosetPublishInterval); - - return now >= next_pub and m_LastIntrosetRegenAttempt + 1s <= now; - } -@@ -776,7 +781,7 @@ namespace llarp - auto i = range.first; - while (i != range.second) - { -- itr->second->SetReadyHook( -+ itr->second->AddReadyHook( - [callback = i->second, addr](auto session) { callback(addr, session); }, left); - ++i; - } -@@ -793,7 +798,7 @@ namespace llarp - auto itr = range.first; - if (itr != range.second) - { -- session->SetReadyHook( -+ session->AddReadyHook( - [callback = itr->second, addr](auto session) { callback(addr, session); }, left); - ++itr; - } -@@ -1279,8 +1284,8 @@ namespace llarp - { - m_router->routerProfiling().MarkPathTimeout(p.get()); - ManualRebuild(1); -- RegenAndPublishIntroSet(); - path::Builder::HandlePathDied(p); -+ RegenAndPublishIntroSet(); - } - - bool -@@ -1886,7 +1891,7 @@ namespace llarp - if (not path::Builder::ShouldBuildMore(now)) - return false; - return ((now - lastBuild) > path::intro_path_spread) -- || NumInStatus(path::ePathEstablished) < path::min_intro_paths; -+ or NumInStatus(path::ePathEstablished) < std::max(numDesiredPaths, path::min_intro_paths); - } - - AbstractRouter* -diff --git a/llarp/service/endpoint.hpp b/llarp/service/endpoint.hpp -index 9de2e05..7acbc68 100644 ---- a/llarp/service/endpoint.hpp -+++ b/llarp/service/endpoint.hpp -@@ -49,12 +49,13 @@ namespace llarp - struct OutboundContext; - - /// minimum interval for publishing introsets -- static constexpr auto INTROSET_PUBLISH_INTERVAL = -- std::chrono::milliseconds(path::default_lifetime) / 4; -+ static constexpr auto IntrosetPublishInterval = path::intro_path_spread / 2; - -- static constexpr auto INTROSET_PUBLISH_RETRY_INTERVAL = 5s; -+ /// how agressively should we retry publishing introset on failure -+ static constexpr auto IntrosetPublishRetryCooldown = 1s; - -- static constexpr auto INTROSET_LOOKUP_RETRY_COOLDOWN = 3s; -+ /// how aggressively should we retry looking up introsets -+ static constexpr auto IntrosetLookupCooldown = 250ms; - - struct Endpoint : public path::Builder, - public ILookupHolder, -diff --git a/llarp/service/intro_set.cpp b/llarp/service/intro_set.cpp -index 8bd8ae6..ca6e584 100644 ---- a/llarp/service/intro_set.cpp -+++ b/llarp/service/intro_set.cpp -@@ -351,6 +351,15 @@ namespace llarp::service - return false; - } - -+ bool -+ IntroSet::HasStaleIntros(llarp_time_t now, llarp_time_t delta) const -+ { -+ for (const auto& intro : intros) -+ if (intro.ExpiresSoon(now, delta)) -+ return true; -+ return false; -+ } -+ - bool - IntroSet::IsExpired(llarp_time_t now) const - { -diff --git a/llarp/service/intro_set.hpp b/llarp/service/intro_set.hpp -index d0fbca6..66e88fb 100644 ---- a/llarp/service/intro_set.hpp -+++ b/llarp/service/intro_set.hpp -@@ -69,6 +69,10 @@ namespace llarp - bool - HasExpiredIntros(llarp_time_t now) const; - -+ /// return true if any of our intros expires soon given a delta -+ bool -+ HasStaleIntros(llarp_time_t now, llarp_time_t delta) const; -+ - bool - IsExpired(llarp_time_t now) const; - -diff --git a/llarp/service/outbound_context.cpp b/llarp/service/outbound_context.cpp -index c24928d..67ce324 100644 ---- a/llarp/service/outbound_context.cpp -+++ b/llarp/service/outbound_context.cpp -@@ -48,6 +48,7 @@ namespace llarp - MarkCurrentIntroBad(Now()); - ShiftIntroduction(false); - UpdateIntroSet(); -+ SwapIntros(); - } - return true; - } -@@ -112,6 +113,7 @@ namespace llarp - return true; - } - currentIntroSet = *foundIntro; -+ ShiftIntroRouter(RouterID{}); - } - else - { -@@ -145,7 +147,6 @@ namespace llarp - } - if (selectedIntro.router.IsZero() || selectedIntro.ExpiresSoon(now)) - return; -- LogWarn(Name(), " shfiting intro off of ", r, " to ", RouterID(selectedIntro.router)); - m_NextIntro = selectedIntro; - } - -@@ -346,7 +347,7 @@ namespace llarp - ++itr; - } - -- if (ReadyToSend() and m_ReadyHook) -+ if (ReadyToSend() and not m_ReadyHooks.empty()) - { - const auto path = GetPathByRouter(remoteIntro.router); - if (not path) -@@ -354,8 +355,9 @@ namespace llarp - LogWarn(Name(), " ready but no path to ", remoteIntro.router, " ???"); - return true; - } -- m_ReadyHook(this); -- m_ReadyHook = nullptr; -+ for (const auto& hook : m_ReadyHooks) -+ hook(this); -+ m_ReadyHooks.clear(); - } - - if (lastGoodSend > 0s and now >= lastGoodSend + (sendTimeout / 2)) -@@ -370,15 +372,13 @@ namespace llarp - } - - void -- OutboundContext::SetReadyHook(std::function hook, llarp_time_t timeout) -+ OutboundContext::AddReadyHook(std::function hook, llarp_time_t timeout) - { -- if (m_ReadyHook) -- return; -- m_ReadyHook = hook; -+ m_ReadyHooks.push_back(hook); - m_router->loop()->call_later(timeout, [this]() { -- if (m_ReadyHook) -- m_ReadyHook(nullptr); -- m_ReadyHook = nullptr; -+ for (const auto& hook : m_ReadyHooks) -+ hook(nullptr); -+ m_ReadyHooks.clear(); - }); - } - -diff --git a/llarp/service/outbound_context.hpp b/llarp/service/outbound_context.hpp -index 011aa74..8c47ac1 100644 ---- a/llarp/service/outbound_context.hpp -+++ b/llarp/service/outbound_context.hpp -@@ -71,7 +71,7 @@ namespace llarp - ReadyToSend() const; - - void -- SetReadyHook(std::function readyHook, llarp_time_t timeout); -+ AddReadyHook(std::function readyHook, llarp_time_t timeout); - - /// for exits - void -@@ -152,7 +152,7 @@ namespace llarp - llarp_time_t m_LastInboundTraffic = 0s; - bool m_GotInboundTraffic = false; - bool sentIntro = false; -- std::function m_ReadyHook; -+ std::vector> m_ReadyHooks; - llarp_time_t m_LastIntrosetUpdateAt = 0s; - }; - } // namespace service -diff --git a/llarp/service/sendcontext.cpp b/llarp/service/sendcontext.cpp -index 5425839..78558b0 100644 ---- a/llarp/service/sendcontext.cpp -+++ b/llarp/service/sendcontext.cpp -@@ -84,6 +84,7 @@ namespace llarp - auto path = m_PathSet->GetPathByRouter(remoteIntro.router); - if (!path) - { -+ ShiftIntroduction(false); - LogWarn(m_Endpoint->Name(), " cannot encrypt and send: no path for intro ", remoteIntro); - return; - } diff --git a/debian/patches/series b/debian/patches/series index 5520a8638..9c469c08f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,2 @@ 0005-Move-default-user-group-into-deb-patch.patch 0007-Pass-debian-version-as-GIT_VERSION.patch -0003-Apply-majestrate-introset-spacing-2021-05-19.patch