don't split not full bucket. Check if middleID bit >= 160

This commit is contained in:
orignal committed 2026-09-21 21:06:18 -04:00
1 parent fcb8d44e4d
commit e26055ab51
2 files changed
+22 -16

No files matched your search

+19 -14
View File
@@ -17,25 +17,27 @@ namespace i2p
{
namespace torrents
{
NodeID Bucket::GetMiddleID () const
std::optional<NodeID> Bucket::GetMiddleID () const
{
uint8_t bit = std::max (start.FindLowestBit (), next ? next->start.FindLowestBit () : -1) + 1;
if (bit >= NodeID::len * 8) return {};
NodeID middleID = start;
int bit = std::max (start.FindLowestBit (), next ? next->start.FindLowestBit () : -1) + 1;
middleID[bit >> 3] |= (0x80 >> (bit & 0x07));
return middleID;
return { middleID };
}
void Bucket::Split ()
bool Bucket::Split ()
{
auto middleID = GetMiddleID ();
auto newBucket = new Bucket (middleID);
if (!middleID) return false;
auto newBucket = new Bucket (*middleID);
newBucket->next = next;
next = newBucket;
// move some nodes
auto it = nodes.begin ();
while (it != nodes.end ())
{
if ((*it)->id < middleID)
if ((*it)->id < *middleID)
it++; // stay in old bucket
else
{
@@ -45,6 +47,7 @@ namespace torrents
newBucket->nodes.push_back (node);
}
}
return true;
}
RoutingTable::RoutingTable (const NodeID& ourNode):
@@ -104,16 +107,18 @@ namespace torrents
if (id == m_OurNode) return nullptr;
auto bucket = FindBucket (id);
if (!bucket) return nullptr;
if (bucket->IsFull () && !bucket->IsInBucket (m_OurNode)) return nullptr;
if (bucket->IsFull ())
{
if (!bucket->IsInBucket (m_OurNode)) return nullptr;
do
{
if (!bucket->Split ()) return nullptr;
bucket = FindBucket (id);
}
while (bucket->IsFull ());
}
std::shared_ptr<Node> node;
do
{
bucket->Split ();
bucket = FindBucket (id);
}
while (bucket->IsFull ());
if (bucket)
{
node = std::make_shared<Node>(id, peer, port);
+3 -2
View File
@@ -18,6 +18,7 @@
#include <list>
#include <algorithm>
#include <utility>
#include <optional>
#include "Identity.h"
#include "I2PService.h"
#include "util.h"
@@ -75,8 +76,8 @@ namespace torrents
Bucket (const NodeID& start1): next (nullptr), start (start1) {}
bool IsFull () const { return nodes.size () >= MAX_BUCKET_CAPACITY; }
bool IsInBucket (const NodeID& id) const { return id >= start && (!next || id < next->start); }
NodeID GetMiddleID () const;
void Split ();
std::optional<NodeID> GetMiddleID () const;
bool Split ();
};
class RoutingTable