1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
2 // All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
10 "github.com/syndtr/goleveldb/leveldb/errors"
11 "github.com/syndtr/goleveldb/leveldb/iterator"
12 "github.com/syndtr/goleveldb/leveldb/opt"
13 "github.com/syndtr/goleveldb/leveldb/storage"
14 "github.com/syndtr/goleveldb/leveldb/util"
17 // Reader is the interface that wraps basic Get and NewIterator methods.
18 // This interface implemented by both DB and Snapshot.
19 type Reader interface {
20 Get(key []byte, ro *opt.ReadOptions) (value []byte, err error)
21 NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator
24 // Sizes is list of size.
27 // Sum returns sum of the sizes.
28 func (sizes Sizes) Sum() int64 {
30 for _, size := range sizes {
37 func (db *DB) log(v ...interface{}) { db.s.log(v...) }
38 func (db *DB) logf(format string, v ...interface{}) { db.s.logf(format, v...) }
40 // Check and clean files.
41 func (db *DB) checkAndCleanFiles() error {
45 tmap := make(map[int64]bool)
46 for _, tables := range v.levels {
47 for _, t := range tables {
48 tmap[t.fd.Num] = false
52 fds, err := db.s.stor.List(storage.TypeAll)
58 var rem []storage.FileDesc
59 for _, fd := range fds {
62 case storage.TypeManifest:
63 keep = fd.Num >= db.s.manifestFd.Num
64 case storage.TypeJournal:
65 if !db.frozenJournalFd.Zero() {
66 keep = fd.Num >= db.frozenJournalFd.Num
68 keep = fd.Num >= db.journalFd.Num
70 case storage.TypeTable:
71 _, keep = tmap[fd.Num]
84 var mfds []storage.FileDesc
85 for num, present := range tmap {
87 mfds = append(mfds, storage.FileDesc{storage.TypeTable, num})
88 db.logf("db@janitor table missing @%d", num)
91 return errors.NewErrCorrupted(storage.FileDesc{}, &errors.ErrMissingFiles{Fds: mfds})
94 db.logf("db@janitor F·%d G·%d", len(fds), len(rem))
95 for _, fd := range rem {
96 db.logf("db@janitor removing %s-%d", fd.Type, fd.Num)
97 if err := db.s.stor.Remove(fd); err != nil {