@cryptotaxi247 / kubo / commits / 59aa20916

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