@cryptotaxi247 / kubo / commits / b7744b2a1

fix for #141, routing table segmentation

Jeromy committed Oct 22, 2014 at 15:08 UTC b7744b2a110dc457088cb52d21fb2cd64e347fa8
1 file changed +19 -11
routing/kbucket/table.go
+19 -11
@@ -65,18 +65,10 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer {
65
66 // Are we past the max bucket size?
67 if bucket.len() > rt.bucketsize {
68 + // If this bucket is the rightmost bucket, and its full
69 + // we need to split it and create a new bucket
70 if bucketID == len(rt.Buckets)-1 {
69 - newBucket := bucket.Split(bucketID, rt.local)
70 - rt.Buckets = append(rt.Buckets, newBucket)
71 - if newBucket.len() > rt.bucketsize {
72 - // TODO: This is a very rare and annoying case
73 - panic("Case not handled.")
74 - }
75 -
76 - // If all elements were on left side of split...
77 - if bucket.len() > rt.bucketsize {
78 - return bucket.popBack()
79 - }
71 + return rt.nextBucket()
72 } else {
73 // If the bucket cant split kick out least active node
74 return bucket.popBack()
@@ -91,6 +83,22 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer {
83 return nil
84 }
85
86 +func (rt *RoutingTable) nextBucket() peer.Peer {
87 + bucket := rt.Buckets[len(rt.Buckets)-1]
88 + newBucket := bucket.Split(len(rt.Buckets)-1, rt.local)
89 + rt.Buckets = append(rt.Buckets, newBucket)
90 + if newBucket.len() > rt.bucketsize {
91 + // TODO: This is a very rare and annoying case
92 + return rt.nextBucket()
93 + }
94 +
95 + // If all elements were on left side of split...
96 + if bucket.len() > rt.bucketsize {
97 + return bucket.popBack()
98 + }
99 + return nil
100 +}
101 +
102 // A helper struct to sort peers by their distance to the local node
103 type peerDistance struct {
104 p peer.Peer