github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/leveldb/db_util.go (about)

     1  // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
     2  // All rights reserved.
     3  //
     4  // Use of this source code is governed by a BSD-style license that can be
     5  // found in the LICENSE file.
     6  
     7  package leveldb
     8  
     9  import (
    10  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/errors"
    11  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/iterator"
    12  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/opt"
    13  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/storage"
    14  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/util"
    15  )
    16  
    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
    22  }
    23  
    24  // Sizes is list of size.
    25  type Sizes []int64
    26  
    27  // Sum returns sum of the sizes.
    28  func (sizes Sizes) Sum() int64 {
    29  	var sum int64
    30  	for _, size := range sizes {
    31  		sum += size
    32  	}
    33  	return sum
    34  }
    35  
    36  // Logging.
    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...) }
    39  
    40  // Check and clean files.
    41  func (db *DB) checkAndCleanFiles() error {
    42  	v := db.s.version()
    43  	defer v.release()
    44  
    45  	tmap := make(map[int64]bool)
    46  	for _, tables := range v.levels {
    47  		for _, t := range tables {
    48  			tmap[t.fd.Num] = false
    49  		}
    50  	}
    51  
    52  	fds, err := db.s.stor.List(storage.TypeAll)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	var nt int
    58  	var rem []storage.FileDesc
    59  	for _, fd := range fds {
    60  		keep := true
    61  		switch fd.Type {
    62  		case storage.TypeManifest:
    63  			keep = fd.Num >= db.s.manifestFd.Num
    64  		case storage.TypeJournal:
    65  			if !db.frozenJournalFd.Nil() {
    66  				keep = fd.Num >= db.frozenJournalFd.Num
    67  			} else {
    68  				keep = fd.Num >= db.journalFd.Num
    69  			}
    70  		case storage.TypeTable:
    71  			_, keep = tmap[fd.Num]
    72  			if keep {
    73  				tmap[fd.Num] = true
    74  				nt++
    75  			}
    76  		}
    77  
    78  		if !keep {
    79  			rem = append(rem, fd)
    80  		}
    81  	}
    82  
    83  	if nt != len(tmap) {
    84  		var mfds []storage.FileDesc
    85  		for num, present := range tmap {
    86  			if !present {
    87  				mfds = append(mfds, storage.FileDesc{storage.TypeTable, num})
    88  				db.logf("db@janitor table missing @%d", num)
    89  			}
    90  		}
    91  		return errors.NewErrCorrupted(storage.FileDesc{}, &errors.ErrMissingFiles{Fds: mfds})
    92  	}
    93  
    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 {
    98  			return err
    99  		}
   100  	}
   101  	return nil
   102  }