From dc8209837cc4fb7881a91cd55ff25ad9afef05db Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 26 Feb 2015 14:54:28 -0500 Subject: [PATCH] cleanup expired peer tests --- SSU.cpp | 32 +++++++++++++++++++++++++++++++- SSU.h | 6 +++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/SSU.cpp b/SSU.cpp index c735d912..1987eb0e 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -13,7 +13,7 @@ namespace transport m_Work (m_Service), m_WorkV6 (m_ServiceV6), m_ReceiversWork (m_ReceiversService), m_Endpoint (boost::asio::ip::udp::v4 (), port), m_EndpointV6 (boost::asio::ip::udp::v6 (), port), m_Socket (m_ReceiversService, m_Endpoint), m_SocketV6 (m_ReceiversService), - m_IntroducersUpdateTimer (m_Service) + m_IntroducersUpdateTimer (m_Service), m_PeerTestsCleanupTimer (m_Service) { m_Socket.set_option (boost::asio::socket_base::receive_buffer_size (65535)); m_Socket.set_option (boost::asio::socket_base::send_buffer_size (65535)); @@ -44,6 +44,7 @@ namespace transport } if (i2p::context.IsUnreachable ()) ScheduleIntroducersUpdateTimer (); + SchedulePeerTestsCleanupTimer (); } void SSUServer::Stop () @@ -488,6 +489,35 @@ namespace transport { m_PeerTests.erase (nonce); } + + void SSUServer::SchedulePeerTestsCleanupTimer () + { + m_PeerTestsCleanupTimer.expires_from_now (boost::posix_time::seconds(SSU_PEER_TEST_TIMEOUT)); + m_PeerTestsCleanupTimer.async_wait (std::bind (&SSUServer::HandlePeerTestsCleanupTimer, + this, std::placeholders::_1)); + } + + void SSUServer::HandlePeerTestsCleanupTimer (const boost::system::error_code& ecode) + { + if (ecode != boost::asio::error::operation_aborted) + { + int numDeleted = 0; + uint64_t ts = i2p::util::GetMillisecondsSinceEpoch (); + for (auto it = m_PeerTests.begin (); it != m_PeerTests.end ();) + { + if (ts > it->second.creationTime + SSU_PEER_TEST_TIMEOUT*1000LL) + { + numDeleted++; + it = m_PeerTests.erase (it); + } + else + it++; + } + if (numDeleted > 0) + LogPrint (eLogInfo, numDeleted, " peer tests have been expired"); + SchedulePeerTestsCleanupTimer (); + } + } } } diff --git a/SSU.h b/SSU.h index f5f3cc87..01afe606 100644 --- a/SSU.h +++ b/SSU.h @@ -21,6 +21,7 @@ namespace i2p namespace transport { const int SSU_KEEP_ALIVE_INTERVAL = 30; // 30 seconds + const int SSU_PEER_TEST_TIMEOUT = 60; // 60 seconds const int SSU_TO_INTRODUCER_SESSION_DURATION = 3600; // 1 hour const size_t SSU_MAX_NUM_INTRODUCERS = 3; @@ -76,6 +77,9 @@ namespace transport void ScheduleIntroducersUpdateTimer (); void HandleIntroducersUpdateTimer (const boost::system::error_code& ecode); + void SchedulePeerTestsCleanupTimer (); + void HandlePeerTestsCleanupTimer (const boost::system::error_code& ecode); + private: struct PeerTest @@ -90,7 +94,7 @@ namespace transport boost::asio::io_service::work m_Work, m_WorkV6, m_ReceiversWork; boost::asio::ip::udp::endpoint m_Endpoint, m_EndpointV6; boost::asio::ip::udp::socket m_Socket, m_SocketV6; - boost::asio::deadline_timer m_IntroducersUpdateTimer; + boost::asio::deadline_timer m_IntroducersUpdateTimer, m_PeerTestsCleanupTimer; std::list m_Introducers; // introducers we are connected to std::mutex m_SessionsMutex; std::map > m_Sessions;