syncthing/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/db_util.go

98 lines
2.2 KiB
Go
Raw Normal View History

2014-07-06 14:46:48 +02:00
// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
// All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package leveldb
import (
"errors"
"github.com/syndtr/goleveldb/leveldb/iterator"
"github.com/syndtr/goleveldb/leveldb/opt"
"github.com/syndtr/goleveldb/leveldb/storage"
"github.com/syndtr/goleveldb/leveldb/util"
)
// Reader is the interface that wraps basic Get and NewIterator methods.
// This interface implemented by both DB and Snapshot.
type Reader interface {
Get(key []byte, ro *opt.ReadOptions) (value []byte, err error)
NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator
}
type Sizes []uint64
// Sum returns sum of the sizes.
func (p Sizes) Sum() (n uint64) {
for _, s := range p {
n += s
}
return n
}
2014-07-23 08:31:36 +02:00
// Logging.
func (db *DB) log(v ...interface{}) { db.s.log(v...) }
func (db *DB) logf(format string, v ...interface{}) { db.s.logf(format, v...) }
2014-07-06 14:46:48 +02:00
2014-07-23 08:31:36 +02:00
// Check and clean files.
func (db *DB) checkAndCleanFiles() error {
v := db.s.version_NB()
tablesMap := make(map[uint64]bool)
for _, tables := range v.tables {
for _, t := range tables {
tablesMap[t.file.Num()] = false
2014-07-06 14:46:48 +02:00
}
}
2014-07-23 08:31:36 +02:00
files, err := db.s.getFiles(storage.TypeAll)
2014-07-06 14:46:48 +02:00
if err != nil {
return err
}
var nTables int
var rem []storage.File
2014-07-23 08:31:36 +02:00
for _, f := range files {
2014-07-06 14:46:48 +02:00
keep := true
switch f.Type() {
case storage.TypeManifest:
2014-07-23 08:31:36 +02:00
keep = f.Num() >= db.s.manifestFile.Num()
2014-07-06 14:46:48 +02:00
case storage.TypeJournal:
2014-07-23 08:31:36 +02:00
if db.frozenJournalFile != nil {
keep = f.Num() >= db.frozenJournalFile.Num()
2014-07-06 14:46:48 +02:00
} else {
2014-07-23 08:31:36 +02:00
keep = f.Num() >= db.journalFile.Num()
2014-07-06 14:46:48 +02:00
}
case storage.TypeTable:
2014-07-23 08:31:36 +02:00
_, keep = tablesMap[f.Num()]
2014-07-06 14:46:48 +02:00
if keep {
2014-07-23 08:31:36 +02:00
tablesMap[f.Num()] = true
2014-07-06 14:46:48 +02:00
nTables++
}
}
if !keep {
rem = append(rem, f)
}
}
2014-07-23 08:31:36 +02:00
if nTables != len(tablesMap) {
for num, present := range tablesMap {
2014-07-06 14:46:48 +02:00
if !present {
2014-07-23 08:31:36 +02:00
db.logf("db@janitor table missing @%d", num)
2014-07-06 14:46:48 +02:00
}
}
return ErrCorrupted{Type: MissingFiles, Err: errors.New("leveldb: table files missing")}
}
2014-07-23 08:31:36 +02:00
db.logf("db@janitor F·%d G·%d", len(files), len(rem))
2014-07-06 14:46:48 +02:00
for _, f := range rem {
2014-07-23 08:31:36 +02:00
db.logf("db@janitor removing %s-%d", f.Type(), f.Num())
2014-07-06 14:46:48 +02:00
if err := f.Remove(); err != nil {
return err
}
}
return nil
}