Parcourir la source

core, ethdb, trie: validate database errors

obscuren il y a 10 ans
Parent
commit
c590b505ed
5 fichiers modifiés avec 25 ajouts et 9 suppressions
  1. 1 1
      common/db.go
  2. 13 3
      core/chain_manager.go
  3. 2 2
      ethdb/database.go
  4. 3 1
      ethdb/memory_database.go
  5. 6 2
      trie/cache.go

+ 1 - 1
common/db.go

@@ -2,7 +2,7 @@ package common
 
 // Database interface
 type Database interface {
-	Put(key []byte, value []byte)
+	Put(key []byte, value []byte) error
 	Get(key []byte) ([]byte, error)
 	Delete(key []byte) error
 	Close()

+ 13 - 3
core/chain_manager.go

@@ -377,8 +377,14 @@ func (self *ChainManager) ExportN(w io.Writer, first uint64, last uint64) error
 // assumes that the `mu` mutex is held!
 func (bc *ChainManager) insert(block *types.Block) {
 	key := append(blockNumPre, block.Number().Bytes()...)
-	bc.blockDb.Put(key, block.Hash().Bytes())
-	bc.blockDb.Put([]byte("LastBlock"), block.Hash().Bytes())
+	err := bc.blockDb.Put(key, block.Hash().Bytes())
+	if err != nil {
+		glog.Fatal("db write fail:", err)
+	}
+	err = bc.blockDb.Put([]byte("LastBlock"), block.Hash().Bytes())
+	if err != nil {
+		glog.Fatal("db write fail:", err)
+	}
 
 	bc.currentBlock = block
 	bc.lastBlockHash = block.Hash()
@@ -387,7 +393,11 @@ func (bc *ChainManager) insert(block *types.Block) {
 func (bc *ChainManager) write(block *types.Block) {
 	enc, _ := rlp.EncodeToBytes((*types.StorageBlock)(block))
 	key := append(blockHashPre, block.Hash().Bytes()...)
-	bc.blockDb.Put(key, enc)
+	err := bc.blockDb.Put(key, enc)
+	if err != nil {
+		glog.Fatal("db write fail:", err)
+	}
+
 	// Push block to cache
 	bc.cache.Push(block)
 }

+ 2 - 2
ethdb/database.go

@@ -42,8 +42,8 @@ func NewLDBDatabase(file string) (*LDBDatabase, error) {
 }
 
 // Put puts the given key / value to the queue
-func (self *LDBDatabase) Put(key []byte, value []byte) {
-	self.db.Put(key, rle.Compress(value), nil)
+func (self *LDBDatabase) Put(key []byte, value []byte) error {
+	return self.db.Put(key, rle.Compress(value), nil)
 }
 
 // Get returns the given key if it's present.

+ 3 - 1
ethdb/memory_database.go

@@ -19,8 +19,10 @@ func NewMemDatabase() (*MemDatabase, error) {
 	return db, nil
 }
 
-func (db *MemDatabase) Put(key []byte, value []byte) {
+func (db *MemDatabase) Put(key []byte, value []byte) error {
 	db.db[string(key)] = value
+
+	return nil
 }
 
 func (db *MemDatabase) Set(key []byte, value []byte) {

+ 6 - 2
trie/cache.go

@@ -1,8 +1,10 @@
 package trie
 
+import "github.com/ethereum/go-ethereum/logger/glog"
+
 type Backend interface {
 	Get([]byte) ([]byte, error)
-	Put([]byte, []byte)
+	Put([]byte, []byte) error
 }
 
 type Cache struct {
@@ -29,7 +31,9 @@ func (self *Cache) Put(key []byte, data []byte) {
 
 func (self *Cache) Flush() {
 	for k, v := range self.store {
-		self.backend.Put([]byte(k), v)
+		if err := self.backend.Put([]byte(k), v); err != nil {
+			glog.Fatal("db write err:", err)
+		}
 	}
 
 	// This will eventually grow too large. We'd could