提交 543adf91 作者: Tommi Virtanen

Move fsrepo lockfile from global map to struct field

上级 d5ce5da5
package fsrepo package fsrepo
import ( import (
"errors"
"fmt" "fmt"
"io" "io"
"os" "os"
...@@ -34,10 +33,7 @@ var ( ...@@ -34,10 +33,7 @@ var (
// packageLock must be held to while performing any operation that modifies an // packageLock must be held to while performing any operation that modifies an
// FSRepo's state field. This includes Init, Open, Close, and Remove. // FSRepo's state field. This includes Init, Open, Close, and Remove.
packageLock sync.Mutex // protects openersCounter and lockfiles packageLock sync.Mutex // protects openersCounter
// lockfiles holds references to the Closers that ensure that repos are
// only accessed by one process at a time.
lockfiles map[string]io.Closer
// openersCounter ensures that the Init is atomic. // openersCounter ensures that the Init is atomic.
// //
// packageLock also protects numOpenedRepos // packageLock also protects numOpenedRepos
...@@ -63,7 +59,6 @@ var ( ...@@ -63,7 +59,6 @@ var (
func init() { func init() {
openersCounter = counter.NewOpenersCounter() openersCounter = counter.NewOpenersCounter()
lockfiles = make(map[string]io.Closer)
} }
// FSRepo represents an IPFS FileSystem Repo. It is safe for use by multiple // FSRepo represents an IPFS FileSystem Repo. It is safe for use by multiple
...@@ -73,6 +68,9 @@ type FSRepo struct { ...@@ -73,6 +68,9 @@ type FSRepo struct {
state state state state
// path is the file-system path // path is the file-system path
path string path string
// lockfile is the file system lock to prevent others from opening
// the same fsrepo path concurrently
lockfile io.Closer
// config is set on Open, guarded by packageLock // config is set on Open, guarded by packageLock
config *config.Config config *config.Config
// ds is set on Open // ds is set on Open
...@@ -451,7 +449,7 @@ func (r *FSRepo) transitionToOpened() error { ...@@ -451,7 +449,7 @@ func (r *FSRepo) transitionToOpened() error {
if err != nil { if err != nil {
return err return err
} }
lockfiles[r.path] = closer r.lockfile = closer
} }
return openersCounter.AddOpener(r.path) return openersCounter.AddOpener(r.path)
} }
...@@ -464,14 +462,9 @@ func (r *FSRepo) transitionToClosed() error { ...@@ -464,14 +462,9 @@ func (r *FSRepo) transitionToClosed() error {
return err return err
} }
if countAfter := openersCounter.NumOpeners(r.path); countAfter == 0 { if countAfter := openersCounter.NumOpeners(r.path); countAfter == 0 {
closer, ok := lockfiles[r.path] if err := r.lockfile.Close(); err != nil {
if !ok {
return errors.New("package error: lockfile is not held")
}
if err := closer.Close(); err != nil {
return err return err
} }
delete(lockfiles, r.path)
} }
return nil return nil
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论