Let FSRepo Close know explicitly about LevelDB
This allows replacing the datastore without needing to write Close through to every wrapped datastore.
Tommi Virtanen committed
Mar 16, 2015 at 13:55 UTC
59aa209164fefbdfd2f6a50608a30da68c0d0b4a
1 file changed
+8
-4
repo/fsrepo/fsrepo.go
+8
-4
@@ -60,7 +60,9 @@ type FSRepo struct {
60
// the same fsrepo path concurrently
61
lockfile io.Closer
62
config *config.Config
63
- ds ds2.ThreadSafeDatastoreCloser
63
+ ds ds.ThreadSafeDatastore
64
+ // tracked separately for use in Close; do not use directly.
65
+ leveldbDS levelds.Datastore
66
}
67
68
var _ repo.Repo = (*FSRepo)(nil)
@@ -236,13 +238,15 @@ func (r *FSRepo) openConfig() error {
238
// openDatastore returns an error if the config file is not present.
239
func (r *FSRepo) openDatastore() error {
240
leveldbPath := path.Join(r.path, leveldbDirectory)
239
- ds, err := levelds.NewDatastore(leveldbPath, &levelds.Options{
241
+ var err error
242
+ // save leveldb reference so it can be neatly closed afterward
243
+ r.leveldbDS, err = levelds.NewDatastore(leveldbPath, &levelds.Options{
244
Compression: ldbopts.NoCompression,
245
})
246
if err != nil {
247
return errors.New("unable to open leveldb datastore")
248
}
245
- r.ds = ds
249
+ r.ds = r.leveldbDS
250
return nil
251
}
252
@@ -267,7 +271,7 @@ func (r *FSRepo) Close() error {
271
return errors.New("repo is closed")
272
}
273
270
- if err := r.ds.Close(); err != nil {
274
+ if err := r.leveldbDS.Close(); err != nil {
275
return err
276
}
277