fixed dht race #270
Juan Batiz-Benet committed
Nov 5, 2014 at 08:49 UTC
70f796afd6d208f88531a06c6a564fabdd6c242c
2 files changed
+19
-4
routing/dht/dht_test.go
+2
-2
@@ -417,14 +417,14 @@ func TestConnectCollision(t *testing.T) {
417
418
done := make(chan struct{})
419
go func() {
420
- _, err = dhtA.Connect(ctx, peerB)
420
+ _, err := dhtA.Connect(ctx, peerB)
421
if err != nil {
422
t.Fatal(err)
423
}
424
done <- struct{}{}
425
}()
426
go func() {
427
- _, err = dhtB.Connect(ctx, peerA)
427
+ _, err := dhtB.Connect(ctx, peerA)
428
if err != nil {
429
t.Fatal(err)
430
}
routing/dht/ext_test.go
+17
-2
@@ -16,6 +16,7 @@ import (
16
pb "github.com/jbenet/go-ipfs/routing/dht/pb"
17
u "github.com/jbenet/go-ipfs/util"
18
19
+ "sync"
20
"time"
21
)
22
@@ -28,15 +29,24 @@ type mesHandleFunc func(msg.NetMessage) msg.NetMessage
29
// fauxNet is a standin for a swarm.Network in order to more easily recreate
30
// different testing scenarios
31
type fauxSender struct {
32
+ sync.Mutex
33
handlers []mesHandleFunc
34
}
35
36
func (f *fauxSender) AddHandler(fn func(msg.NetMessage) msg.NetMessage) {
37
+ f.Lock()
38
+ defer f.Unlock()
39
+
40
f.handlers = append(f.handlers, fn)
41
}
42
43
func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.NetMessage, error) {
39
- for _, h := range f.handlers {
44
+ f.Lock()
45
+ handlers := make([]mesHandleFunc, len(f.handlers))
46
+ copy(handlers, f.handlers)
47
+ f.Unlock()
48
+
49
+ for _, h := range handlers {
50
reply := h(m)
51
if reply != nil {
52
return reply, nil
@@ -52,7 +62,12 @@ func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.Net
62
}
63
64
func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error {
55
- for _, h := range f.handlers {
65
+ f.Lock()
66
+ handlers := make([]mesHandleFunc, len(f.handlers))
67
+ copy(handlers, f.handlers)
68
+ f.Unlock()
69
+
70
+ for _, h := range handlers {
71
reply := h(m)
72
if reply != nil {
73
return nil