mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
flood to 2 next day closest floodfills before UTC midnight
This commit is contained in:
parent
bc8adf1433
commit
a1995c13cd
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2023, The PurpleI2P Project
|
* Copyright (c) 2013-2024, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@ -790,11 +790,14 @@ namespace data
|
|||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
IdentHash CreateRoutingKey (const IdentHash& ident)
|
IdentHash CreateRoutingKey (const IdentHash& ident, bool nextDay)
|
||||||
{
|
{
|
||||||
uint8_t buf[41]; // ident + yyyymmdd
|
uint8_t buf[41]; // ident + yyyymmdd
|
||||||
memcpy (buf, (const uint8_t *)ident, 32);
|
memcpy (buf, (const uint8_t *)ident, 32);
|
||||||
i2p::util::GetCurrentDate ((char *)(buf + 32));
|
if (nextDay)
|
||||||
|
i2p::util::GetNextDayDate ((char *)(buf + 32));
|
||||||
|
else
|
||||||
|
i2p::util::GetCurrentDate ((char *)(buf + 32));
|
||||||
IdentHash key;
|
IdentHash key;
|
||||||
SHA256(buf, 40, key);
|
SHA256(buf, 40, key);
|
||||||
return key;
|
return key;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2023, The PurpleI2P Project
|
* Copyright (c) 2013-2024, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@ -206,7 +206,7 @@ namespace data
|
|||||||
bool operator< (const XORMetric& other) const { return memcmp (metric, other.metric, 32) < 0; };
|
bool operator< (const XORMetric& other) const { return memcmp (metric, other.metric, 32) < 0; };
|
||||||
};
|
};
|
||||||
|
|
||||||
IdentHash CreateRoutingKey (const IdentHash& ident);
|
IdentHash CreateRoutingKey (const IdentHash& ident, bool nextDay = false);
|
||||||
XORMetric operator^(const IdentHash& key1, const IdentHash& key2);
|
XORMetric operator^(const IdentHash& key1, const IdentHash& key2);
|
||||||
|
|
||||||
// destination for delivery instructions
|
// destination for delivery instructions
|
||||||
|
@ -912,7 +912,10 @@ namespace data
|
|||||||
{
|
{
|
||||||
memcpy (payload + DATABASE_STORE_HEADER_SIZE, buf + payloadOffset, msgLen);
|
memcpy (payload + DATABASE_STORE_HEADER_SIZE, buf + payloadOffset, msgLen);
|
||||||
floodMsg->FillI2NPMessageHeader (eI2NPDatabaseStore);
|
floodMsg->FillI2NPMessageHeader (eI2NPDatabaseStore);
|
||||||
Flood (ident, floodMsg);
|
int minutesBeforeMidnight = 24*60 - i2p::util::GetMinutesSinceEpoch () % (24*60);
|
||||||
|
bool andNextDay = storeType ? minutesBeforeMidnight < NETDB_NEXT_DAY_LEASESET_THRESHOLD:
|
||||||
|
minutesBeforeMidnight < NETDB_NEXT_DAY_ROUTER_INFO_THRESHOLD;
|
||||||
|
Flood (ident, floodMsg, andNextDay);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint (eLogError, "NetDb: Database store message is too long ", floodMsg->len);
|
LogPrint (eLogError, "NetDb: Database store message is too long ", floodMsg->len);
|
||||||
@ -1081,23 +1084,42 @@ namespace data
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetDb::Flood (const IdentHash& ident, std::shared_ptr<I2NPMessage> floodMsg)
|
void NetDb::Flood (const IdentHash& ident, std::shared_ptr<I2NPMessage> floodMsg, bool andNextDay)
|
||||||
{
|
{
|
||||||
std::unordered_set<IdentHash> excluded;
|
std::unordered_set<IdentHash> excluded;
|
||||||
excluded.insert (i2p::context.GetIdentHash ()); // don't flood to itself
|
excluded.insert (i2p::context.GetIdentHash ()); // don't flood to itself
|
||||||
excluded.insert (ident); // don't flood back
|
excluded.insert (ident); // don't flood back
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
auto floodfill = GetClosestFloodfill (ident, excluded);
|
auto floodfill = GetClosestFloodfill (ident, excluded, false); // current day
|
||||||
if (floodfill)
|
if (floodfill)
|
||||||
{
|
{
|
||||||
auto h = floodfill->GetIdentHash();
|
const auto& h = floodfill->GetIdentHash();
|
||||||
LogPrint(eLogDebug, "NetDb: Flood lease set for ", ident.ToBase32(), " to ", h.ToBase64());
|
|
||||||
transports.SendMessage (h, CopyI2NPMessage(floodMsg));
|
transports.SendMessage (h, CopyI2NPMessage(floodMsg));
|
||||||
excluded.insert (h);
|
excluded.insert (h);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
return; // no more floodfills
|
||||||
|
}
|
||||||
|
if (andNextDay)
|
||||||
|
{
|
||||||
|
// flood to two more closest flodfills for next day
|
||||||
|
std::unordered_set<IdentHash> excluded1;
|
||||||
|
excluded1.insert (i2p::context.GetIdentHash ()); // don't flood to itself
|
||||||
|
excluded1.insert (ident); // don't flood back
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
auto floodfill = GetClosestFloodfill (ident, excluded1, true); // next day
|
||||||
|
if (floodfill)
|
||||||
|
{
|
||||||
|
const auto& h = floodfill->GetIdentHash();
|
||||||
|
if (!excluded.count (h)) // we didn't send for current day, otherwise skip
|
||||||
|
transports.SendMessage (h, CopyI2NPMessage(floodMsg));
|
||||||
|
excluded1.insert (h);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1236,9 +1258,9 @@ namespace data
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<const RouterInfo> NetDb::GetClosestFloodfill (const IdentHash& destination,
|
std::shared_ptr<const RouterInfo> NetDb::GetClosestFloodfill (const IdentHash& destination,
|
||||||
const std::unordered_set<IdentHash>& excluded) const
|
const std::unordered_set<IdentHash>& excluded, bool nextDay) const
|
||||||
{
|
{
|
||||||
IdentHash destKey = CreateRoutingKey (destination);
|
IdentHash destKey = CreateRoutingKey (destination, nextDay);
|
||||||
std::lock_guard<std::mutex> l(m_FloodfillsMutex);
|
std::lock_guard<std::mutex> l(m_FloodfillsMutex);
|
||||||
return m_Floodfills.FindClosest (destKey, [&excluded](const std::shared_ptr<RouterInfo>& r)->bool
|
return m_Floodfills.FindClosest (destKey, [&excluded](const std::shared_ptr<RouterInfo>& r)->bool
|
||||||
{
|
{
|
||||||
|
@ -54,6 +54,8 @@ namespace data
|
|||||||
const size_t NETDB_MAX_NUM_SEARCH_REPLY_PEER_HASHES = 16;
|
const size_t NETDB_MAX_NUM_SEARCH_REPLY_PEER_HASHES = 16;
|
||||||
const size_t NETDB_MAX_EXPLORATORY_SELECTION_SIZE = 500;
|
const size_t NETDB_MAX_EXPLORATORY_SELECTION_SIZE = 500;
|
||||||
const int NETDB_EXPLORATORY_SELECTION_UPDATE_INTERVAL = 82; // in seconds. for floodfill
|
const int NETDB_EXPLORATORY_SELECTION_UPDATE_INTERVAL = 82; // in seconds. for floodfill
|
||||||
|
const int NETDB_NEXT_DAY_ROUTER_INFO_THRESHOLD = 45; // in minutes
|
||||||
|
const int NETDB_NEXT_DAY_LEASESET_THRESHOLD = 10; // in minutes
|
||||||
|
|
||||||
/** function for visiting a leaseset stored in a floodfill */
|
/** function for visiting a leaseset stored in a floodfill */
|
||||||
typedef std::function<void(const IdentHash, std::shared_ptr<LeaseSet>)> LeaseSetVisitor;
|
typedef std::function<void(const IdentHash, std::shared_ptr<LeaseSet>)> LeaseSetVisitor;
|
||||||
@ -89,7 +91,7 @@ namespace data
|
|||||||
std::shared_ptr<const RouterInfo> GetHighBandwidthRandomRouter (std::shared_ptr<const RouterInfo> compatibleWith, bool reverse, bool endpoint) const;
|
std::shared_ptr<const RouterInfo> GetHighBandwidthRandomRouter (std::shared_ptr<const RouterInfo> compatibleWith, bool reverse, bool endpoint) const;
|
||||||
std::shared_ptr<const RouterInfo> GetRandomSSU2PeerTestRouter (bool v4, const std::unordered_set<IdentHash>& excluded) const;
|
std::shared_ptr<const RouterInfo> GetRandomSSU2PeerTestRouter (bool v4, const std::unordered_set<IdentHash>& excluded) const;
|
||||||
std::shared_ptr<const RouterInfo> GetRandomSSU2Introducer (bool v4, const std::unordered_set<IdentHash>& excluded) const;
|
std::shared_ptr<const RouterInfo> GetRandomSSU2Introducer (bool v4, const std::unordered_set<IdentHash>& excluded) const;
|
||||||
std::shared_ptr<const RouterInfo> GetClosestFloodfill (const IdentHash& destination, const std::unordered_set<IdentHash>& excluded) const;
|
std::shared_ptr<const RouterInfo> GetClosestFloodfill (const IdentHash& destination, const std::unordered_set<IdentHash>& excluded, bool nextDay = false) const;
|
||||||
std::vector<IdentHash> GetClosestFloodfills (const IdentHash& destination, size_t num,
|
std::vector<IdentHash> GetClosestFloodfills (const IdentHash& destination, size_t num,
|
||||||
std::unordered_set<IdentHash>& excluded, bool closeThanUsOnly = false) const;
|
std::unordered_set<IdentHash>& excluded, bool closeThanUsOnly = false) const;
|
||||||
std::vector<IdentHash> GetExploratoryNonFloodfill (const IdentHash& destination, size_t num, const std::unordered_set<IdentHash>& excluded);
|
std::vector<IdentHash> GetExploratoryNonFloodfill (const IdentHash& destination, size_t num, const std::unordered_set<IdentHash>& excluded);
|
||||||
@ -144,7 +146,7 @@ namespace data
|
|||||||
void PersistRouters (std::list<std::pair<std::string, std::shared_ptr<RouterInfo::Buffer> > >&& update,
|
void PersistRouters (std::list<std::pair<std::string, std::shared_ptr<RouterInfo::Buffer> > >&& update,
|
||||||
std::list<std::string>&& remove);
|
std::list<std::string>&& remove);
|
||||||
void Run ();
|
void Run ();
|
||||||
void Flood (const IdentHash& ident, std::shared_ptr<I2NPMessage> floodMsg);
|
void Flood (const IdentHash& ident, std::shared_ptr<I2NPMessage> floodMsg, bool andNextDay = false);
|
||||||
void ManageRouterInfos ();
|
void ManageRouterInfos ();
|
||||||
void ManageLeaseSets ();
|
void ManageLeaseSets ();
|
||||||
void ManageRequests ();
|
void ManageRequests ();
|
||||||
|
@ -255,6 +255,11 @@ namespace util
|
|||||||
GetDateString (GetSecondsSinceEpoch (), date);
|
GetDateString (GetSecondsSinceEpoch (), date);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetNextDayDate (char * date)
|
||||||
|
{
|
||||||
|
GetDateString (GetSecondsSinceEpoch () + 24*60*60, date);
|
||||||
|
}
|
||||||
|
|
||||||
void GetDateString (uint64_t timestamp, char * date)
|
void GetDateString (uint64_t timestamp, char * date)
|
||||||
{
|
{
|
||||||
using clock = std::chrono::system_clock;
|
using clock = std::chrono::system_clock;
|
||||||
|
@ -28,7 +28,8 @@ namespace util
|
|||||||
uint64_t GetMonotonicMilliseconds ();
|
uint64_t GetMonotonicMilliseconds ();
|
||||||
uint64_t GetMonotonicSeconds ();
|
uint64_t GetMonotonicSeconds ();
|
||||||
|
|
||||||
void GetCurrentDate (char * date); // returns date as YYYYMMDD string, 9 bytes
|
void GetCurrentDate (char * date); // returns UTC date as YYYYMMDD string, 9 bytes
|
||||||
|
void GetNextDayDate (char * date); // returns next UTC day as YYYYMMDD string, 9 bytes
|
||||||
void GetDateString (uint64_t timestamp, char * date); // timestamp is seconds since epoch, returns date as YYYYMMDD string, 9 bytes
|
void GetDateString (uint64_t timestamp, char * date); // timestamp is seconds since epoch, returns date as YYYYMMDD string, 9 bytes
|
||||||
void AdjustTimeOffset (int64_t offset); // in seconds from current
|
void AdjustTimeOffset (int64_t offset); // in seconds from current
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user