aboutsummaryrefslogtreecommitdiffstats
path: root/ethdb/leveldb
diff options
context:
space:
mode:
authorMartin Holst Swende <martin@swende.se>2019-03-26 22:48:31 +0800
committerFelix Lange <fjl@users.noreply.github.com>2019-03-26 22:48:31 +0800
commit59e195324643e8f3a18396b529e3350e550fdecc (patch)
tree80850abf25e40b1e3a5bd359dacc654b651d8c73 /ethdb/leveldb
parentdf717abc999add34c5725ab86dce1fcee968ca10 (diff)
downloadgo-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')
-rw-r--r--ethdb/leveldb/leveldb.go29
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)
+}