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