From 76c9c8d653ae49e347598f1bbd34c821354c9567 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 3 Nov 2014 00:31:15 +0100 Subject: [PATCH] Compress data on db level. Closes #174 --- ethdb/database.go | 51 ++++++++++++++++++++++++++++-------------- ethdb/database_test.go | 26 +++++++++++++++++++-- state/state_object.go | 16 ++----------- 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/ethdb/database.go b/ethdb/database.go index de3afd74b..a59782047 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -4,12 +4,15 @@ import ( "fmt" "path" + "github.com/ethereum/go-ethereum/compression/rle" "github.com/ethereum/go-ethereum/ethutil" "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/iterator" ) type LDBDatabase struct { - db *leveldb.DB + db *leveldb.DB + comp bool } func NewLDBDatabase(name string) (*LDBDatabase, error) { @@ -21,32 +24,42 @@ func NewLDBDatabase(name string) (*LDBDatabase, error) { return nil, err } - database := &LDBDatabase{db: db} + database := &LDBDatabase{db: db, comp: true} return database, nil } -func (db *LDBDatabase) Put(key []byte, value []byte) { - err := db.db.Put(key, value, nil) +func (self *LDBDatabase) Put(key []byte, value []byte) { + if self.comp { + value = rle.Compress(value) + } + + err := self.db.Put(key, value, nil) if err != nil { fmt.Println("Error put", err) } } -func (db *LDBDatabase) Get(key []byte) ([]byte, error) { - return db.db.Get(key, nil) -} +func (self *LDBDatabase) Get(key []byte) ([]byte, error) { + dat, err := self.db.Get(key, nil) + if err != nil { + return nil, err + } + + if self.comp { + //fmt.Println("get", dat) + return rle.Decompress(dat) + } -func (db *LDBDatabase) Delete(key []byte) error { - return db.db.Delete(key, nil) + return dat, nil } -func (db *LDBDatabase) Db() *leveldb.DB { - return db.db +func (self *LDBDatabase) Delete(key []byte) error { + return self.db.Delete(key, nil) } -func (db *LDBDatabase) LastKnownTD() []byte { - data, _ := db.db.Get([]byte("LTD"), nil) +func (self *LDBDatabase) LastKnownTD() []byte { + data, _ := self.Get([]byte("LTD")) if len(data) == 0 { data = []byte{0x0} @@ -55,13 +68,17 @@ func (db *LDBDatabase) LastKnownTD() []byte { return data } -func (db *LDBDatabase) Close() { +func (self *LDBDatabase) NewIterator() iterator.Iterator { + return self.db.NewIterator(nil, nil) +} + +func (self *LDBDatabase) Close() { // Close the leveldb database - db.db.Close() + self.db.Close() } -func (db *LDBDatabase) Print() { - iter := db.db.NewIterator(nil, nil) +func (self *LDBDatabase) Print() { + iter := self.db.NewIterator(nil, nil) for iter.Next() { key := iter.Key() value := iter.Value() diff --git a/ethdb/database_test.go b/ethdb/database_test.go index bb1b4de2a..2cbaf58e0 100644 --- a/ethdb/database_test.go +++ b/ethdb/database_test.go @@ -1,6 +1,28 @@ package ethdb +/* import ( - _ "fmt" - _ "testing" + "bytes" + "testing" ) + +func TestCompression(t *testing.T) { + ethutil.ReadConfig("", "/tmp", "") + + db, err := NewLDBDatabase("testdb") + if err != nil { + t.Fatal(err) + } + + in := make([]byte, 10) + db.Put([]byte("test1"), in) + out, err := db.Get([]byte("test1")) + if err != nil { + t.Fatal(err) + } + + if bytes.Compare(out, in) != 0 { + t.Error("put get", in, out) + } +} +*/ diff --git a/state/state_object.go b/state/state_object.go index aa5c13678..472aa8389 100644 --- a/state/state_object.go +++ b/state/state_object.go @@ -297,23 +297,11 @@ func (self *StateObject) CreateOutputForDiff() { // State object encoding methods func (c *StateObject) RlpEncode() []byte { - var root interface{} - if c.State != nil { - root = c.State.Trie.Root - } else { - root = "" - } - - return ethutil.Encode([]interface{}{c.Nonce, c.balance, root, c.CodeHash()}) + return ethutil.Encode([]interface{}{c.Nonce, c.balance, c.State.Trie.Root, c.CodeHash()}) } func (c *StateObject) CodeHash() ethutil.Bytes { - var codeHash []byte - if len(c.Code) > 0 { - codeHash = crypto.Sha3(c.Code) - } - - return codeHash + return crypto.Sha3(c.Code) } func (c *StateObject) RlpDecode(data []byte) {