diff --git a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/db.go b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/db.go index eb6abd0fb1..47bbff51bc 100644 --- a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/db.go +++ b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/db.go @@ -1017,6 +1017,10 @@ func (db *DB) SizeOf(ranges []util.Range) (Sizes, error) { return sizes, nil } +func (db *DB) ReturnBuffer(b []byte) { + db.s.tops.bpool.Put(b) +} + // Close closes the DB. This will also releases any outstanding snapshot, // abort any in-flight compaction and discard open transaction. // diff --git a/ethdb/database.go b/ethdb/database.go index 479c54b607..80d77b4f0b 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -142,6 +142,10 @@ func (self *LDBDatabase) Get(key []byte) ([]byte, error) { //return rle.Decompress(dat) } +func (self *LDBDatabase) ReturnBuffer(b []byte) { + self.db.ReturnBuffer(b) +} + // Delete deletes the key from the queue and database func (self *LDBDatabase) Delete(key []byte) error { // Measure the database delete latency, if requested diff --git a/ethdb/interface.go b/ethdb/interface.go index f4b787a52a..cb39ecd959 100644 --- a/ethdb/interface.go +++ b/ethdb/interface.go @@ -22,6 +22,8 @@ type Database interface { Delete(key []byte) error Close() NewBatch() Batch + + ReturnBuffer([]byte) } type Batch interface { diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index a729f52332..27680ef0e4 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -62,6 +62,9 @@ func (db *MemDatabase) Get(key []byte) ([]byte, error) { return nil, errors.New("not found") } +func (db *MemDatabase) ReturnBuffer(b []byte) { +} + func (db *MemDatabase) Keys() [][]byte { db.lock.RLock() defer db.lock.RUnlock() diff --git a/trie/trie.go b/trie/trie.go index 035a80e74c..e637674e65 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -23,6 +23,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto/sha3" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/rcrowley/go-metrics" @@ -453,6 +454,9 @@ func (t *Trie) resolveHash(n hashNode, prefix, suffix []byte) (node, error) { } } dec := mustDecodeNode(n, enc, t.cachegen) + if edb, ok := t.db.(*ethdb.LDBDatabase); ok { + edb.ReturnBuffer(enc) + } return dec, nil }