From 715f5f4a19fd9250309d1333cf3f0905603bd507 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 24 Oct 2014 16:14:12 -0700 Subject: [PATCH] fix(blockstore, bitswap) enforce threadsafety in blockstore fixes data race detected in a testnet test --- blockstore/blockstore.go | 4 ++-- blockstore/blockstore_test.go | 7 ++++--- exchange/bitswap/bitswap.go | 2 +- exchange/bitswap/bitswap_test.go | 3 ++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/blockstore/blockstore.go b/blockstore/blockstore.go index 99892b24b..cadd20802 100644 --- a/blockstore/blockstore.go +++ b/blockstore/blockstore.go @@ -16,14 +16,14 @@ type Blockstore interface { Put(*blocks.Block) error } -func NewBlockstore(d ds.Datastore) Blockstore { +func NewBlockstore(d ds.ThreadSafeDatastore) Blockstore { return &blockstore{ datastore: d, } } type blockstore struct { - datastore ds.Datastore + datastore ds.ThreadSafeDatastore } func (bs *blockstore) Get(k u.Key) (*blocks.Block, error) { diff --git a/blockstore/blockstore_test.go b/blockstore/blockstore_test.go index 8daed5f3d..00edf61ab 100644 --- a/blockstore/blockstore_test.go +++ b/blockstore/blockstore_test.go @@ -5,6 +5,7 @@ import ( "testing" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" blocks "github.com/jbenet/go-ipfs/blocks" u "github.com/jbenet/go-ipfs/util" ) @@ -12,7 +13,7 @@ import ( // TODO(brian): TestGetReturnsNil func TestGetWhenKeyNotPresent(t *testing.T) { - bs := NewBlockstore(ds.NewMapDatastore()) + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) _, err := bs.Get(u.Key("not present")) if err != nil { @@ -23,7 +24,7 @@ func TestGetWhenKeyNotPresent(t *testing.T) { } func TestPutThenGetBlock(t *testing.T) { - bs := NewBlockstore(ds.NewMapDatastore()) + bs := NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) block := blocks.NewBlock([]byte("some data")) err := bs.Put(block) @@ -46,7 +47,7 @@ func TestValueTypeMismatch(t *testing.T) { datastore := ds.NewMapDatastore() datastore.Put(block.Key().DsKey(), "data that isn't a block!") - blockstore := NewBlockstore(datastore) + blockstore := NewBlockstore(ds_sync.MutexWrap(datastore)) _, err := blockstore.Get(block.Key()) if err != ValueTypeMismatch { diff --git a/exchange/bitswap/bitswap.go b/exchange/bitswap/bitswap.go index 19ee6e2fc..89ddbc821 100644 --- a/exchange/bitswap/bitswap.go +++ b/exchange/bitswap/bitswap.go @@ -22,7 +22,7 @@ var log = u.Logger("bitswap") // provided NetMessage service func NetMessageSession(parent context.Context, p peer.Peer, net inet.Network, srv inet.Service, directory bsnet.Routing, - d ds.Datastore, nice bool) exchange.Interface { + d ds.ThreadSafeDatastore, nice bool) exchange.Interface { networkAdapter := bsnet.NetMessageAdapter(srv, net, nil) bs := &bitswap{ diff --git a/exchange/bitswap/bitswap_test.go b/exchange/bitswap/bitswap_test.go index 4c881a04e..f34ea3c84 100644 --- a/exchange/bitswap/bitswap_test.go +++ b/exchange/bitswap/bitswap_test.go @@ -9,6 +9,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + ds_sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" blocks "github.com/jbenet/go-ipfs/blocks" bstore "github.com/jbenet/go-ipfs/blockstore" exchange "github.com/jbenet/go-ipfs/exchange" @@ -279,7 +280,7 @@ func session(net tn.Network, rs mock.RoutingServer, id peer.ID) instance { adapter := net.Adapter(p) htc := rs.Client(p) - blockstore := bstore.NewBlockstore(ds.NewMapDatastore()) + blockstore := bstore.NewBlockstore(ds_sync.MutexWrap(ds.NewMapDatastore())) const alwaysSendToPeer = true bs := &bitswap{ blockstore: blockstore,