@cryptotaxi247 / kubo / commits / 70f796afd

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