diff --git a/pin.go b/pin.go index 1792020084727472ad76466cf603430b694505ac..7e73b33f2518480a434234bc8b015c4574f4b348 100644 --- a/pin.go +++ b/pin.go @@ -3,6 +3,8 @@ package pin import ( //ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + "sync" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" nsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/namespace" "github.com/jbenet/go-ipfs/blocks/set" @@ -22,6 +24,7 @@ type Pinner interface { } type pinner struct { + lock sync.RWMutex recursePin set.BlockSet directPin set.BlockSet indirPin *indirectPin @@ -49,6 +52,8 @@ func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { } func (p *pinner) Pin(node *mdag.Node, recurse bool) error { + p.lock.Lock() + defer p.lock.Unlock() k, err := node.Key() if err != nil { return err @@ -72,6 +77,8 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error { } func (p *pinner) Unpin(k util.Key, recurse bool) error { + p.lock.Lock() + defer p.lock.Unlock() if recurse { p.recursePin.RemoveBlock(k) node, err := p.dserv.Get(k) @@ -134,6 +141,8 @@ func (p *pinner) pinLinks(node *mdag.Node) error { } func (p *pinner) IsPinned(key util.Key) bool { + p.lock.RLock() + defer p.lock.RUnlock() return p.recursePin.HasKey(key) || p.directPin.HasKey(key) || p.indirPin.HasKey(key) @@ -164,6 +173,8 @@ func LoadPinner(d ds.Datastore, dserv *mdag.DAGService) (Pinner, error) { } func (p *pinner) Flush() error { + p.lock.RLock() + defer p.lock.RUnlock() recurse := p.recursePin.GetKeys() err := p.dstore.Put(recursePinDatastoreKey, recurse) if err != nil {