Merge pull request #1305 from obscuren/database-error-check

core, ethdb, trie: validate database errors
This commit is contained in:
Jeffrey Wilcke 2015-06-21 16:49:14 -07:00
commit 7633dfdc08
6 changed files with 26 additions and 10 deletions

View File

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

View File

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

View File

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

View File

@ -19,8 +19,10 @@ func NewMemDatabase() (*MemDatabase, error) {
return db, nil 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 db.db[string(key)] = value
return nil
} }
func (db *MemDatabase) Set(key []byte, value []byte) { func (db *MemDatabase) Set(key []byte, value []byte) {

View File

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

View File

@ -12,7 +12,7 @@ import (
type Db map[string][]byte type Db map[string][]byte
func (self Db) Get(k []byte) ([]byte, error) { return self[string(k)], nil } func (self Db) Get(k []byte) ([]byte, error) { return self[string(k)], nil }
func (self Db) Put(k, v []byte) { self[string(k)] = v } func (self Db) Put(k, v []byte) error { self[string(k)] = v; return nil }
// Used for testing // Used for testing
func NewEmpty() *Trie { func NewEmpty() *Trie {