mirror of
https://github.com/ipfs/kubo.git
synced 2026-03-02 14:58:03 +08:00
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?
This commit is contained in:
parent
4af5d85fac
commit
16690d4af2
@ -137,8 +137,8 @@ type dagservAndPinner struct {
|
||||
}
|
||||
|
||||
func getDagservAndPinner(t *testing.T) dagservAndPinner {
|
||||
db := ds.NewMapDatastore()
|
||||
bs := bstore.NewBlockstore(dssync.MutexWrap(db))
|
||||
db := dssync.MutexWrap(ds.NewMapDatastore())
|
||||
bs := bstore.NewBlockstore(db)
|
||||
blockserv, err := bserv.New(bs, offline.Exchange(bs))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@ -28,8 +28,8 @@ type dagservAndPinner struct {
|
||||
}
|
||||
|
||||
func getDagservAndPinner(t *testing.T) dagservAndPinner {
|
||||
db := ds.NewMapDatastore()
|
||||
bs := bstore.NewBlockstore(dssync.MutexWrap(db))
|
||||
db := dssync.MutexWrap(ds.NewMapDatastore())
|
||||
bs := bstore.NewBlockstore(db)
|
||||
blockserv, err := bserv.New(bs, offline.Exchange(bs))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user