@cryptotaxi247 / kubo / commits / 55228dae1

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 -}