ソースを参照

ethdb: documentation and corruption recovery

obscuren 10 年 前
コミット
84cd618585
1 ファイル変更13 行追加8 行削除
  1. 13 8
      ethdb/database.go

+ 13 - 8
ethdb/database.go

@@ -7,6 +7,7 @@ import (
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/syndtr/goleveldb/leveldb"
+	"github.com/syndtr/goleveldb/leveldb/errors"
 	"github.com/syndtr/goleveldb/leveldb/iterator"
 	"github.com/syndtr/goleveldb/leveldb/opt"
 )
@@ -24,9 +25,17 @@ type LDBDatabase struct {
 	quit chan struct{}
 }
 
+// NewLDBDatabase returns a LevelDB wrapped object. LDBDatabase does not persist data by
+// it self but requires a background poller which syncs every X. `Flush` should be called
+// when data needs to be stored and written to disk.
 func NewLDBDatabase(file string) (*LDBDatabase, error) {
 	// Open the db
 	db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: OpenFileLimit})
+	// check for curruption and attempt to recover
+	if _, iscorrupted := err.(*errors.ErrCorrupted); iscorrupted {
+		db, err = leveldb.RecoverFile(file, nil)
+	}
+	// (re) check for errors and abort if opening of the db failed
 	if err != nil {
 		return nil, err
 	}
@@ -44,21 +53,15 @@ func (self *LDBDatabase) makeQueue() {
 	self.queue = make(map[string][]byte)
 }
 
+// Put puts the given key / value to the queue
 func (self *LDBDatabase) Put(key []byte, value []byte) {
 	self.mu.Lock()
 	defer self.mu.Unlock()
 
 	self.queue[string(key)] = value
-	/*
-		value = rle.Compress(value)
-
-		err := self.db.Put(key, value, nil)
-		if err != nil {
-			fmt.Println("Error put", err)
-		}
-	*/
 }
 
+// Get returns the given key if it's present.
 func (self *LDBDatabase) Get(key []byte) ([]byte, error) {
 	self.mu.Lock()
 	defer self.mu.Unlock()
@@ -76,6 +79,7 @@ func (self *LDBDatabase) Get(key []byte) ([]byte, error) {
 	return rle.Decompress(dat)
 }
 
+// Delete deletes the key from the queue and database
 func (self *LDBDatabase) Delete(key []byte) error {
 	self.mu.Lock()
 	defer self.mu.Unlock()
@@ -100,6 +104,7 @@ func (self *LDBDatabase) NewIterator() iterator.Iterator {
 	return self.db.NewIterator(nil, nil)
 }
 
+// Flush flushes out the queue to leveldb
 func (self *LDBDatabase) Flush() error {
 	self.mu.Lock()
 	defer self.mu.Unlock()