diff --git a/Profiling.cpp b/Profiling.cpp index 19c9e2e7..b572f3bb 100644 --- a/Profiling.cpp +++ b/Profiling.cpp @@ -16,9 +16,14 @@ namespace data { } + boost::posix_time::ptime RouterProfile::GetTime () const + { + return boost::posix_time::second_clock::local_time(); + } + void RouterProfile::UpdateTime () { - m_LastUpdateTime = boost::posix_time::second_clock::local_time(); + m_LastUpdateTime = GetTime (); } void RouterProfile::Save () @@ -90,11 +95,16 @@ namespace data auto t = pt.get (PEER_PROFILE_LAST_UPDATE_TIME, ""); if (t.length () > 0) m_LastUpdateTime = boost::posix_time::time_from_string (t); - // read participations - auto participations = pt.get_child (PEER_PROFILE_SECTION_PARTICIPATION); - m_NumTunnelsAgreed = participations.get (PEER_PROFILE_PARTICIPATION_AGREED, 0); - m_NumTunnelsDeclined = participations.get (PEER_PROFILE_PARTICIPATION_DECLINED, 0); - m_NumTunnelsNonReplied = participations.get (PEER_PROFILE_PARTICIPATION_NON_REPLIED, 0); + if ((GetTime () - m_LastUpdateTime).hours () < 72) // profile becomes obsolete after 3 days of inactivity + { + // read participations + auto participations = pt.get_child (PEER_PROFILE_SECTION_PARTICIPATION); + m_NumTunnelsAgreed = participations.get (PEER_PROFILE_PARTICIPATION_AGREED, 0); + m_NumTunnelsDeclined = participations.get (PEER_PROFILE_PARTICIPATION_DECLINED, 0); + m_NumTunnelsNonReplied = participations.get (PEER_PROFILE_PARTICIPATION_NON_REPLIED, 0); + } + else + *this = RouterProfile (m_IdentHash); } catch (std::exception& ex) { @@ -117,6 +127,19 @@ namespace data m_NumTunnelsNonReplied++; UpdateTime (); } + + bool RouterProfile::IsLowPartcipationRate () const + { + if ((GetTime () - m_LastUpdateTime).total_seconds () < 900) // if less than 15 minutes + return m_NumTunnelsAgreed < m_NumTunnelsDeclined; // 50% rate + else + return 4*m_NumTunnelsAgreed < m_NumTunnelsDeclined; // 20% rate + } + + bool RouterProfile::IsBad () const + { + return IsAlwaysDeclining () || IsNonResponding () || IsLowPartcipationRate (); + } std::shared_ptr GetRouterProfile (const IdentHash& identHash) { diff --git a/Profiling.h b/Profiling.h index 03928925..9ff03f4b 100644 --- a/Profiling.h +++ b/Profiling.h @@ -24,18 +24,24 @@ namespace data public: RouterProfile (const IdentHash& identHash); + RouterProfile& operator= (const RouterProfile& ) = default; void Save (); void Load (); - bool IsBad () const { return !m_NumTunnelsAgreed && m_NumTunnelsDeclined >= 5; }; + bool IsBad () const; void TunnelBuildResponse (uint8_t ret); void TunnelNonReplied (); private: + boost::posix_time::ptime GetTime () const; void UpdateTime (); + + bool IsAlwaysDeclining () const { return !m_NumTunnelsAgreed && m_NumTunnelsDeclined >= 5; }; + bool IsNonResponding () const { return m_NumTunnelsNonReplied > 20 && !(m_NumTunnelsAgreed + m_NumTunnelsDeclined); }; + bool IsLowPartcipationRate () const; private: