diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 01907c25..0579ca31 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -659,6 +659,7 @@ namespace util default: s << "Unknown"; } s << "
"; + s << "Tunnel creation success rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%
"; s << "Data path: " << i2p::util::filesystem::GetDataDir().string() << "

"; s << "Our external address:" << "
" ; for (auto& address : i2p::context.GetRouterInfo().GetAddresses()) diff --git a/Tunnel.cpp b/Tunnel.cpp index de3096d6..5a0a96a9 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -203,7 +203,8 @@ namespace tunnel Tunnels tunnels; - Tunnels::Tunnels (): m_IsRunning (false), m_Thread (nullptr) + Tunnels::Tunnels (): m_IsRunning (false), m_Thread (nullptr), + m_NumSuccesiveTunnelCreations (0), m_NumFailedTunnelCreations (0) { } @@ -488,6 +489,7 @@ namespace tunnel { LogPrint ("Pending tunnel build request ", it->first, " timeout. Deleted"); it = pendingTunnels.erase (it); + m_NumFailedTunnelCreations++; } else it++; @@ -495,13 +497,16 @@ namespace tunnel case eTunnelStateBuildFailed: LogPrint ("Pending tunnel build request ", it->first, " failed. Deleted"); it = pendingTunnels.erase (it); + m_NumFailedTunnelCreations++; break; case eTunnelStateBuildReplyReceived: // intermediate state, will be either established of build failed it++; break; default: + // success it = pendingTunnels.erase (it); + m_NumSuccesiveTunnelCreations++; } } } diff --git a/Tunnel.h b/Tunnel.h index 83334b42..b59e3d7f 100644 --- a/Tunnel.h +++ b/Tunnel.h @@ -175,6 +175,9 @@ namespace tunnel std::shared_ptr m_ExploratoryPool; i2p::util::Queue m_Queue; + // some stats + int m_NumSuccesiveTunnelCreations, m_NumFailedTunnelCreations; + public: // for HTTP only @@ -182,6 +185,11 @@ namespace tunnel const decltype(m_InboundTunnels)& GetInboundTunnels () const { return m_InboundTunnels; }; const decltype(m_TransitTunnels)& GetTransitTunnels () const { return m_TransitTunnels; }; int GetQueueSize () { return m_Queue.GetSize (); }; + int GetTunnelCreationSuccessRate () const // in percents + { + int totalNum = m_NumSuccesiveTunnelCreations + m_NumFailedTunnelCreations; + return totalNum ? m_NumSuccesiveTunnelCreations*100/totalNum : 0; + } }; extern Tunnels tunnels;