From 59e195324643e8f3a18396b529e3350e550fdecc Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Tue, 26 Mar 2019 15:48:31 +0100 Subject: core, ethdb, trie: mode dirty data to clean cache on flush (#19307) This PR is a more advanced form of the dirty-to-clean cacher (#18995), where we reuse previous database write batches as datasets to uncache, saving a dirty-trie-iteration and a dirty-trie-rlp-reencoding per block. --- ethdb/leveldb/leveldb.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'ethdb/leveldb') diff --git a/ethdb/leveldb/leveldb.go b/ethdb/leveldb/leveldb.go index f730887d2..f437cb974 100644 --- a/ethdb/leveldb/leveldb.go +++ b/ethdb/leveldb/leveldb.go @@ -416,3 +416,32 @@ func (b *batch) Reset() { b.b.Reset() b.size = 0 } + +// Replay replays the batch contents. +func (b *batch) Replay(w ethdb.Writer) error { + return b.b.Replay(&replayer{writer: w}) +} + +// replayer is a small wrapper to implement the correct replay methods. +type replayer struct { + writer ethdb.Writer + failure error +} + +// Put inserts the given value into the key-value data store. +func (r *replayer) Put(key, value []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Put(key, value) +} + +// Delete removes the key from the key-value data store. +func (r *replayer) Delete(key []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Delete(key) +} -- cgit v1.2.3