diff --git a/libi2pd_client/SAM.cpp b/libi2pd_client/SAM.cpp index 60589e84..cdc662a3 100644 --- a/libi2pd_client/SAM.cpp +++ b/libi2pd_client/SAM.cpp @@ -1647,9 +1647,16 @@ namespace client { i2p::data::PrivateKeys keys; if (!keys.FromBase64 (destination)) return nullptr; - localDestination = m_IsSingleThread ? - i2p::client::context.CreateNewLocalDestination (GetIOService (), keys, true, ¶ms) : - i2p::client::context.CreateNewLocalDestination (keys, true, ¶ms); + localDestination = i2p::client::context.FindLocalDestination (keys.GetPublic ()->GetIdentHash ()); + if (localDestination && localDestination->GetRefCounter () <= 0) + { + LogPrint (eLogError, "SAM: Orphaned destination ", keys.GetPublic ()->GetIdentHash ().ToBase32 (), ". Try later"); + return nullptr; + } + if (!localDestination) + localDestination = m_IsSingleThread ? + i2p::client::context.CreateNewLocalDestination (GetIOService (), keys, true, ¶ms) : + i2p::client::context.CreateNewLocalDestination (keys, true, ¶ms); } else // transient { @@ -1716,7 +1723,7 @@ namespace client void SAMBridge::ScheduleSessionCleanupTimer (std::shared_ptr session) { auto timer = std::make_shared(GetService ()); - timer->expires_after (std::chrono::seconds(5)); // postpone destination clean for 5 seconds + timer->expires_after (std::chrono::seconds(SAM_SESSION_CLEANUP_CHECK_INTERVAL)); // postpone destination cleanup timer->async_wait (std::bind (&SAMBridge::HandleSessionCleanupTimer, this, std::placeholders::_1, session, timer)); } diff --git a/libi2pd_client/SAM.h b/libi2pd_client/SAM.h index b26dfce4..0c899661 100644 --- a/libi2pd_client/SAM.h +++ b/libi2pd_client/SAM.h @@ -37,6 +37,7 @@ namespace client const size_t SAM_STREAM_MAX_SEND_BUFFER_SIZE = 8*SAM_SOCKET_BUFFER_SIZE; const int SAM_SOCKET_CONNECTION_MAX_IDLE = 3600; // in seconds const int SAM_SESSION_READINESS_CHECK_INTERVAL = 3; // in seconds + const int SAM_SESSION_CLEANUP_CHECK_INTERVAL = 5; // in seconds const size_t SAM_SESSION_MAX_ACCEPT_QUEUE_SIZE = 50; const size_t SAM_SESSION_MAX_ACCEPT_INTERVAL = 3; // in seconds