@cryptotaxi247 / kubo / commits / 715f5f4a1

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,