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
}