@cryptotaxi247 / kubo / commits / 543adf91f

Move fsrepo lockfile from global map to struct field

Tommi Virtanen committed Mar 13, 2015 at 15:04 UTC 543adf91f1ea92515132bdc871ae7d32d9d3de7a
1 file changed +6 -13
repo/fsrepo/fsrepo.go
+6 -13
@@ -1,7 +1,6 @@
1 package fsrepo
2
3 import (
4 - "errors"
4 "fmt"
5 "io"
6 "os"
@@ -34,10 +33,7 @@ var (
33
34 // packageLock must be held to while performing any operation that modifies an
35 // FSRepo's state field. This includes Init, Open, Close, and Remove.
37 - packageLock sync.Mutex // protects openersCounter and lockfiles
38 - // lockfiles holds references to the Closers that ensure that repos are
39 - // only accessed by one process at a time.
40 - lockfiles map[string]io.Closer
36 + packageLock sync.Mutex // protects openersCounter
37 // openersCounter ensures that the Init is atomic.
38 //
39 // packageLock also protects numOpenedRepos
@@ -63,7 +59,6 @@ var (
59
60 func init() {
61 openersCounter = counter.NewOpenersCounter()
66 - lockfiles = make(map[string]io.Closer)
62 }
63
64 // FSRepo represents an IPFS FileSystem Repo. It is safe for use by multiple
@@ -73,6 +68,9 @@ type FSRepo struct {
68 state state
69 // path is the file-system path
70 path string
71 + // lockfile is the file system lock to prevent others from opening
72 + // the same fsrepo path concurrently
73 + lockfile io.Closer
74 // config is set on Open, guarded by packageLock
75 config *config.Config
76 // ds is set on Open
@@ -451,7 +449,7 @@ func (r *FSRepo) transitionToOpened() error {
449 if err != nil {
450 return err
451 }
454 - lockfiles[r.path] = closer
452 + r.lockfile = closer
453 }
454 return openersCounter.AddOpener(r.path)
455 }
@@ -464,14 +462,9 @@ func (r *FSRepo) transitionToClosed() error {
462 return err
463 }
464 if countAfter := openersCounter.NumOpeners(r.path); countAfter == 0 {
467 - closer, ok := lockfiles[r.path]
468 - if !ok {
469 - return errors.New("package error: lockfile is not held")
470 - }
471 - if err := closer.Close(); err != nil {
465 + if err := r.lockfile.Close(); err != nil {
466 return err
467 }
474 - delete(lockfiles, r.path)
468 }
469 return nil
470 }