Simplify FSRepo life cycle, it's either open or closed
Tommi Virtanen committed
Mar 13, 2015 at 16:16 UTC
55228dae11a11ac72c7270f02a79f0044f835bde
2 files changed
+19
-59
repo/fsrepo/fsrepo.go
+19
-37
@@ -1,7 +1,6 @@
1
package fsrepo
2
3
import (
4
- "fmt"
4
"io"
5
"os"
6
"path"
@@ -52,15 +51,14 @@ var (
51
// FSRepo represents an IPFS FileSystem Repo. It is safe for use by multiple
52
// callers.
53
type FSRepo struct {
55
- // state is the FSRepo's state (unopened, opened, closed)
56
- state state
54
+ // has Close been called already
55
+ closed bool
56
// path is the file-system path
57
path string
58
// lockfile is the file system lock to prevent others from opening
59
// the same fsrepo path concurrently
60
lockfile io.Closer
62
- // config is set on Open, guarded by packageLock
63
- config *config.Config
61
+ config *config.Config
62
// ds is set on Open
63
ds ds2.ThreadSafeDatastoreCloser
64
}
@@ -110,9 +108,11 @@ func open(repoPath string) (repo.Repo, error) {
108
// log.Debugf("writing eventlogs to ...", c.path)
109
configureEventLoggerAtRepoPath(r.config, r.path)
110
113
- if err := r.transitionToOpened(); err != nil {
111
+ closer, err := lockfile.Lock(r.path)
112
+ if err != nil {
113
return nil, err
114
}
115
+ r.lockfile = closer
116
return r, nil
117
}
118
@@ -255,8 +255,8 @@ func (r *FSRepo) Close() error {
255
packageLock.Lock()
256
defer packageLock.Unlock()
257
258
- if r.state != opened {
259
- return debugerror.Errorf("repo is %s", r.state)
258
+ if r.closed {
259
+ return debugerror.New("repo is closed")
260
}
261
262
if err := r.ds.Close(); err != nil {
@@ -271,7 +271,11 @@ func (r *FSRepo) Close() error {
271
// to disable logging once the component is closed.
272
// eventlog.Configure(eventlog.Output(os.Stderr))
273
274
- return r.transitionToClosed()
274
+ r.closed = true
275
+ if err := r.lockfile.Close(); err != nil {
276
+ return err
277
+ }
278
+ return nil
279
}
280
281
// Config returns the FSRepo's config. This method must not be called if the
@@ -288,8 +292,8 @@ func (r *FSRepo) Config() *config.Config {
292
packageLock.Lock()
293
defer packageLock.Unlock()
294
291
- if r.state != opened {
292
- panic(fmt.Sprintln("repo is", r.state))
295
+ if r.closed {
296
+ panic("repo is closed")
297
}
298
return r.config
299
}
@@ -336,8 +340,8 @@ func (r *FSRepo) GetConfigKey(key string) (interface{}, error) {
340
packageLock.Lock()
341
defer packageLock.Unlock()
342
339
- if r.state != opened {
340
- return nil, debugerror.Errorf("repo is %s", r.state)
343
+ if r.closed {
344
+ return nil, debugerror.New("repo is closed")
345
}
346
347
filename, err := config.Filename(r.path)
@@ -356,8 +360,8 @@ func (r *FSRepo) SetConfigKey(key string, value interface{}) error {
360
packageLock.Lock()
361
defer packageLock.Unlock()
362
359
- if r.state != opened {
360
- return debugerror.Errorf("repo is %s", r.state)
363
+ if r.closed {
364
+ return debugerror.New("repo is closed")
365
}
366
367
filename, err := config.Filename(r.path)
@@ -422,25 +426,3 @@ func isInitializedUnsynced(repoPath string) bool {
426
}
427
return true
428
}
425
-
426
-// transitionToOpened manages the state transition to |opened|. Caller must hold
427
-// the package mutex.
428
-func (r *FSRepo) transitionToOpened() error {
429
- r.state = opened
430
- closer, err := lockfile.Lock(r.path)
431
- if err != nil {
432
- return err
433
- }
434
- r.lockfile = closer
435
- return nil
436
-}
437
-
438
-// transitionToClosed manages the state transition to |closed|. Caller must
439
-// hold the package mutex.
440
-func (r *FSRepo) transitionToClosed() error {
441
- r.state = closed
442
- if err := r.lockfile.Close(); err != nil {
443
- return err
444
- }
445
- return nil
446
-}
repo/fsrepo/state.go
deleted
-22
@@ -1,22 +0,0 @@
1
-package fsrepo
2
-
3
-type state int
4
-
5
-const (
6
- unopened = iota
7
- opened
8
- closed
9
-)
10
-
11
-func (s state) String() string {
12
- switch s {
13
- case unopened:
14
- return "unopened"
15
- case opened:
16
- return "opened"
17
- case closed:
18
- return "closed"
19
- default:
20
- return "invalid"
21
- }
22
-}