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;