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