fix(blockstore, bitswap) enforce threadsafety in blockstore
fixes data race detected in a testnet test
Brian Tiger Chow committed
Oct 24, 2014 at 16:14 UTC
715f5f4a19fd9250309d1333cf3f0905603bd507
4 files changed
+9
-7
blockstore/blockstore.go
+2
-2
@@ -16,14 +16,14 @@ type Blockstore interface {
16
Put(*blocks.Block) error
17
}
18
19
-func NewBlockstore(d ds.Datastore) Blockstore {
19
+func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore {
20
return &blockstore{
21
datastore: d,
22
}
23
}
24
25
type blockstore struct {
26
- datastore ds.Datastore
26
+ datastore ds.ThreadSafeDatastore
27
}
28
29
func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) {
blockstore/blockstore_test.go
+4
-3
@@ -5,6 +5,7 @@ import (
5
"testing"
6
7
ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
8
+ ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
9
blocks "github.com/jbenet/go-ipfs/blocks"
10
u "github.com/jbenet/go-ipfs/util"
11
)
@@ -12,7 +13,7 @@ import (
13
// TODO(brian): TestGetReturnsNil
14
15
func TestGetWhenKeyNotPresent(t *testing.T) {
15
- bs := NewBlockstore(ds.NewMapDatastore())
16
+ bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore()))
17
_, err := bs.Get(u.Key("not present"))
18
19
if err != nil {
@@ -23,7 +24,7 @@ func TestGetWhenKeyNotPresent(t *testing.T) {
24
}
25
26
func TestPutThenGetBlock(t *testing.T) {
26
- bs := NewBlockstore(ds.NewMapDatastore())
27
+ bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore()))
28
block := blocks.NewBlock([]byte("some data"))
29
30
err := bs.Put(block)
@@ -46,7 +47,7 @@ func TestValueTypeMismatch(t *testing.T) {
47
datastore := ds.NewMapDatastore()
48
datastore.Put(block.Key().DsKey(), "data that isn't a block!")
49
49
- blockstore := NewBlockstore(datastore)
50
+ blockstore := NewBlockstore(ds_sync.MutexWrap(datastore))
51
52
_, err := blockstore.Get(block.Key())
53
if err != ValueTypeMismatch {
exchange/bitswap/bitswap.go
+1
-1
@@ -22,7 +22,7 @@ var log = u.Logger("bitswap")
22
// provided NetMessage service
23
func NetMessageSession(parent context.Context, p peer.Peer,
24
net inet.Network, srv inet.Service, directory bsnet.Routing,
25
- d ds.Datastore, nice bool) exchange.Interface {
25
+ d ds.ThreadSafeDatastore, nice bool) exchange.Interface {
26
27
networkAdapter := bsnet.NetMessageAdapter(srv, net, nil)
28
bs := &bitswap{
exchange/bitswap/bitswap_test.go
+2
-1
@@ -9,6 +9,7 @@ import (
9
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
10
11
ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
12
+ ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
13
blocks "github.com/jbenet/go-ipfs/blocks"
14
bstore "github.com/jbenet/go-ipfs/blockstore"
15
exchange "github.com/jbenet/go-ipfs/exchange"
@@ -279,7 +280,7 @@ func session(net tn.Network, rs mock.RoutingServer, id peer.ID) instance {
280
adapter := net.Adapter(p)
281
htc := rs.Client(p)
282
282
- blockstore := bstore.NewBlockstore(ds.NewMapDatastore())
283
+ blockstore := bstore.NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore()))
284
const alwaysSendToPeer = true
285
bs := &bitswap{
286
blockstore: blockstore,