collect and save participation agreed/declined stats

This commit is contained in:
orignal 2015-03-24 18:48:16 -04:00
parent f8a7beb001
commit fd3dab35cc
6 changed files with 90 additions and 9 deletions

View File

@ -108,6 +108,9 @@ namespace data
void NetDb::Stop ()
{
for (auto it: m_RouterInfos)
it.second->SaveProfile ();
m_RouterInfos.clear ();
if (m_Thread)
{
m_IsRunning = false;
@ -173,8 +176,7 @@ namespace data
}
lastSave = ts;
}
if (i2p::context.GetLastUpdateTime () > lastPublish || // our router has been updated
ts - lastPublish >= 2400) // or publish every 40 minutes
if (ts - lastPublish >= 2400) // publish every 40 minutes
{
Publish ();
lastPublish = ts;
@ -461,7 +463,10 @@ namespace data
for (auto it = m_RouterInfos.begin (); it != m_RouterInfos.end ();)
{
if (it->second->IsUnreachable ())
{
it->second->SaveProfile ();
it = m_RouterInfos.erase (it);
}
else
it++;
}
@ -861,7 +866,6 @@ namespace data
void NetDb::Publish ()
{
i2p::context.UpdateStats ();
std::set<IdentHash> excluded; // TODO: fill up later
for (int i = 0; i < 2; i++)
{
@ -919,7 +923,7 @@ namespace data
[compatibleWith](std::shared_ptr<const RouterInfo> router)->bool
{
return !router->IsHidden () && router != compatibleWith &&
router->IsCompatible (*compatibleWith) && router->IsHighBandwidth ();
router->IsCompatible (*compatibleWith) && (router->GetCaps () & RouterInfo::eHighBandwidth);
});
}

View File

@ -1,5 +1,8 @@
#include <boost/filesystem.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include "base64.h"
#include "util.h"
#include "Profiling.h"
namespace i2p
@ -10,8 +13,60 @@ namespace data
m_IdentHash (identHash), m_NumTunnelsAgreed (0), m_NumTunnelsDeclined (0)
{
}
std::shared_ptr<RouterProfile> GetProfile (const IdentHash& identHash)
void RouterProfile::Save ()
{
// fill sections
boost::property_tree::ptree participation;
participation.put (PEER_PROFILE_PARTICIPATION_AGREED, m_NumTunnelsAgreed);
participation.put (PEER_PROFILE_PARTICIPATION_DECLINED, m_NumTunnelsDeclined);
// fill property tree
boost::property_tree::ptree pt;
pt.put_child (PEER_PROFILE_SECTION_PARTICIPATION, participation);
// save to file
auto path = i2p::util::filesystem::GetDefaultDataDir() / PEER_PROFILES_DIRECTORY;
if (!boost::filesystem::exists (path))
{
// Create directory is necessary
if (!boost::filesystem::create_directory (path))
{
LogPrint (eLogError, "Failed to create directory ", path);
return;
}
const char * chars = GetBase64SubstitutionTable (); // 64 bytes
for (int i = 0; i < 64; i++)
{
auto path1 = path / (std::string ("p") + chars[i]);
if (!boost::filesystem::create_directory (path1))
{
LogPrint (eLogError, "Failed to create directory ", path1);
return;
}
}
}
std::string base64 = m_IdentHash.ToBase64 ();
path = path / (std::string ("p") + base64[0]);
auto filename = path / (std::string (PEER_PROFILE_PREFIX) + base64 + ".txt");
try
{
boost::property_tree::write_ini (filename.string (), pt);
}
catch (std::exception& ex)
{
LogPrint (eLogError, "Can't write ", filename, ": ", ex.what ());
}
}
void RouterProfile::TunnelBuildResponse (uint8_t ret)
{
if (ret > 0)
m_NumTunnelsDeclined++;
else
m_NumTunnelsAgreed++;
}
std::shared_ptr<RouterProfile> GetRouterProfile (const IdentHash& identHash)
{
return std::make_shared<RouterProfile> (identHash);
}

View File

@ -7,12 +7,23 @@
namespace i2p
{
namespace data
{
{
const char PEER_PROFILES_DIRECTORY[] = "peerProfiles";
const char PEER_PROFILE_PREFIX[] = "profile-";
// sections
const char PEER_PROFILE_SECTION_PARTICIPATION[] = "participation";
// params
const char PEER_PROFILE_PARTICIPATION_AGREED[] = "agreed";
const char PEER_PROFILE_PARTICIPATION_DECLINED[] = "declined";
class RouterProfile
{
public:
RouterProfile (const IdentHash& identHash);
void Save ();
void TunnelBuildResponse (uint8_t ret);
private:
@ -22,7 +33,7 @@ namespace data
uint32_t m_NumTunnelsDeclined;
};
std::shared_ptr<RouterProfile> GetProfile (const IdentHash& identHash);
std::shared_ptr<RouterProfile> GetRouterProfile (const IdentHash& identHash);
}
}

View File

@ -652,5 +652,12 @@ namespace data
}
return nullptr;
}
std::shared_ptr<RouterProfile> RouterInfo::GetProfile () const
{
if (!m_Profile)
m_Profile = GetRouterProfile (GetIdentHash ());
return m_Profile;
}
}
}

View File

@ -138,6 +138,9 @@ namespace data
void SetUpdated (bool updated) { m_IsUpdated = updated; };
void SaveToFile (const std::string& fullPath);
std::shared_ptr<RouterProfile> GetProfile () const;
void SaveProfile () { if (m_Profile) m_Profile->Save (); };
void Update (const uint8_t * buf, int len);
void DeleteBuffer () { delete m_Buffer; m_Buffer = nullptr; };
@ -171,7 +174,7 @@ namespace data
std::map<std::string, std::string> m_Properties;
bool m_IsUpdated, m_IsUnreachable;
uint8_t m_SupportedTransports, m_Caps;
std::shared_ptr<RouterProfile> m_Profile;
mutable std::shared_ptr<RouterProfile> m_Profile;
};
}
}

View File

@ -121,6 +121,7 @@ namespace tunnel
const uint8_t * record = msg + 1 + hop->recordIndex*TUNNEL_BUILD_RECORD_SIZE;
uint8_t ret = record[BUILD_RESPONSE_RECORD_RET_OFFSET];
LogPrint ("Ret code=", (int)ret);
hop->router->GetProfile ()->TunnelBuildResponse (ret);
if (ret)
// if any of participants declined the tunnel is not established
established = false;