Commit 5c2d22bc authored by Juan Batiz-Benet's avatar Juan Batiz-Benet

race fix: pinner loads with a threadsafe datastore

All the datastores used by pinners and so on should be mutex
wrapped. One issue with changing all of them from
ds.Datastore -> ds.ThreadSafeDatastore is that we wrap the
incoming ds.ThreadSafeDatastore with other datastores, which
do not implement the interface. Re-wrapping again causes
double locking. (which may be ok..., but...) any ideas?
parent ab9ce81f
......@@ -53,11 +53,11 @@ type pinner struct {
directPin set.BlockSet
indirPin *indirectPin
dserv mdag.DAGService
dstore ds.Datastore
dstore ds.ThreadSafeDatastore
}
// NewPinner creates a new pinner using the given datastore as a backend
func NewPinner(dstore ds.Datastore, serv mdag.DAGService) Pinner {
func NewPinner(dstore ds.ThreadSafeDatastore, serv mdag.DAGService) Pinner {
// Load set from given datastore...
rcds := nsds.Wrap(dstore, recursePinDatastoreKey)
......@@ -176,7 +176,7 @@ func (p *pinner) IsPinned(key util.Key) bool {
}
// LoadPinner loads a pinner and its keysets from the given datastore
func LoadPinner(d ds.Datastore, dserv mdag.DAGService) (Pinner, error) {
func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) {
p := new(pinner)
{ // load recursive set
......
......@@ -21,8 +21,8 @@ func randNode() (*mdag.Node, util.Key) {
}
func TestPinnerBasic(t *testing.T) {
dstore := ds.NewMapDatastore()
bstore := blockstore.NewBlockstore(dssync.MutexWrap(dstore))
dstore := dssync.MutexWrap(ds.NewMapDatastore())
bstore := blockstore.NewBlockstore(dstore)
bserv, err := bs.New(bstore, offline.Exchange(bstore))
if err != nil {
t.Fatal(err)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment