@cryptotaxi247 / kubo / commits / 0bd63633d

dht/kbucket: race condition fix

Juan Batiz-Benet committed Jan 24, 2015 at 09:45 UTC 0bd63633d569f973f73520376ce00f3101655a3a
2 files changed +14 -7
routing/kbucket/bucket.go
+11 -4
@@ -19,6 +19,17 @@ func newBucket() *Bucket {
19 return b
20 }
21
22 +func (b *Bucket) Peers() []peer.ID {
23 + b.lk.RLock()
24 + defer b.lk.RUnlock()
25 + ps := make([]peer.ID, 0, b.list.Len())
26 + for e := b.list.Front(); e != nil; e = e.Next() {
27 + id := e.Value.(peer.ID)
28 + ps = append(ps, id)
29 + }
30 + return ps
31 +}
32 +
33 func (b *Bucket) find(id peer.ID) *list.Element {
34 b.lk.RLock()
35 defer b.lk.RUnlock()
@@ -81,7 +92,3 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket {
92 }
93 return newbuck
94 }
84 -
85 -func (b *Bucket) getIter() *list.Element {
86 - return b.list.Front()
87 -}
routing/kbucket/table.go
+3 -3
@@ -176,11 +176,11 @@ func (rt *RoutingTable) Size() int {
176 // NOTE: This is potentially unsafe... use at your own risk
177 func (rt *RoutingTable) ListPeers() []peer.ID {
178 var peers []peer.ID
179 + rt.tabLock.RLock()
180 for _, buck := range rt.Buckets {
180 - for e := buck.getIter(); e != nil; e = e.Next() {
181 - peers = append(peers, e.Value.(peer.ID))
182 - }
181 + peers = append(peers, buck.Peers()...)
182 }
183 + rt.tabLock.RUnlock()
184 return peers
185 }
186