From b7744b2a110dc457088cb52d21fb2cd64e347fa8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Oct 2014 15:08:32 -0700 Subject: [PATCH] fix for #141, routing table segmentation --- routing/kbucket/table.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 6f37e94de..5c3e04867 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -65,18 +65,10 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { // Are we past the max bucket size? if bucket.len() > rt.bucketsize { + // If this bucket is the rightmost bucket, and its full + // we need to split it and create a new bucket if bucketID == len(rt.Buckets)-1 { - newBucket := bucket.Split(bucketID, rt.local) - rt.Buckets = append(rt.Buckets, newBucket) - if newBucket.len() > rt.bucketsize { - // TODO: This is a very rare and annoying case - panic("Case not handled.") - } - - // If all elements were on left side of split... - if bucket.len() > rt.bucketsize { - return bucket.popBack() - } + return rt.nextBucket() } else { // If the bucket cant split kick out least active node return bucket.popBack() @@ -91,6 +83,22 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { return nil } +func (rt *RoutingTable) nextBucket() peer.Peer { + bucket := rt.Buckets[len(rt.Buckets)-1] + newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) + rt.Buckets = append(rt.Buckets, newBucket) + if newBucket.len() > rt.bucketsize { + // TODO: This is a very rare and annoying case + return rt.nextBucket() + } + + // If all elements were on left side of split... + if bucket.len() > rt.bucketsize { + return bucket.popBack() + } + return nil +} + // A helper struct to sort peers by their distance to the local node type peerDistance struct { p peer.Peer