diff options
author | Martin Holst Swende <martin@swende.se> | 2019-03-26 22:48:31 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2019-03-26 22:48:31 +0800 |
commit | 59e195324643e8f3a18396b529e3350e550fdecc (patch) | |
tree | 80850abf25e40b1e3a5bd359dacc654b651d8c73 /ethdb/leveldb/leveldb.go | |
parent | df717abc999add34c5725ab86dce1fcee968ca10 (diff) | |
download | go-tangerine-59e195324643e8f3a18396b529e3350e550fdecc.tar go-tangerine-59e195324643e8f3a18396b529e3350e550fdecc.tar.gz go-tangerine-59e195324643e8f3a18396b529e3350e550fdecc.tar.bz2 go-tangerine-59e195324643e8f3a18396b529e3350e550fdecc.tar.lz go-tangerine-59e195324643e8f3a18396b529e3350e550fdecc.tar.xz go-tangerine-59e195324643e8f3a18396b529e3350e550fdecc.tar.zst go-tangerine-59e195324643e8f3a18396b529e3350e550fdecc.zip |
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.
Diffstat (limited to 'ethdb/leveldb/leveldb.go')
-rw-r--r-- | ethdb/leveldb/leveldb.go | 29 |
1 files changed, 29 insertions, 0 deletions
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) +} |