Added hook into trie.Database.Commit() in the trie package.

The hook enables a pre and post commit plugin to report on the status of the commit and expose this information to plugins.
This commit is contained in:
philip-morlier 2023-03-08 09:59:47 -08:00
parent 50a295b789
commit 27810f60ad
2 changed files with 55 additions and 0 deletions

View File

@ -637,6 +637,11 @@ func (db *Database) Commit(node common.Hash, report bool) error {
// outside code doesn't see an inconsistent state (referenced data removed from // outside code doesn't see an inconsistent state (referenced data removed from
// memory cache during commit but not yet in persistent storage). This is ensured // memory cache during commit but not yet in persistent storage). This is ensured
// by only uncaching existing data when the database write finalizes. // by only uncaching existing data when the database write finalizes.
// begin PluGeth injection
pluginPreTrieCommit(node)
// end PluGeth injection
start := time.Now() start := time.Now()
batch := db.diskdb.NewBatch() batch := db.diskdb.NewBatch()
@ -683,6 +688,10 @@ func (db *Database) Commit(node common.Hash, report bool) error {
db.gcnodes, db.gcsize, db.gctime = 0, 0, 0 db.gcnodes, db.gcsize, db.gctime = 0, 0, 0
db.flushnodes, db.flushsize, db.flushtime = 0, 0, 0 db.flushnodes, db.flushsize, db.flushtime = 0, 0, 0
// begin PluGeth injection
pluginPostTrieCommit(node)
// end PluGeth injection
return nil return nil
} }

46
trie/plugin_hooks.go Normal file
View File

@ -0,0 +1,46 @@
package trie
import (
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/plugins"
)
func PluginPreTrieCommit(pl *plugins.PluginLoader, node common.Hash) {
fnList := pl.Lookup("PreTrieCommit", func(item interface{}) bool {
_, ok := item.(func(common.Hash))
return ok
})
for _, fni := range fnList {
if fn, ok := fni.(func(common.Hash)); ok {
fn(node)
}
}
}
func pluginPreTrieCommit(node common.Hash,) {
if plugins.DefaultPluginLoader == nil {
log.Warn("Attempting PreTrieCommit, but default PluginLoader has not been initialized")
return
}
PluginPreTrieCommit(plugins.DefaultPluginLoader, node)
}
func PluginPostTrieCommit(pl *plugins.PluginLoader, node common.Hash) {
fnList := pl.Lookup("PostTrieCommit", func(item interface{}) bool {
_, ok := item.(func(common.Hash))
return ok
})
for _, fni := range fnList {
if fn, ok := fni.(func(common.Hash)); ok {
fn(node)
}
}
}
func pluginPostTrieCommit(node common.Hash,) {
if plugins.DefaultPluginLoader == nil {
log.Warn("Attempting PostTrieCommit, but default PluginLoader has not been initialized")
return
}
PluginPostTrieCommit(plugins.DefaultPluginLoader, node)
}