core/state: use atomic value to reduce the lock time

Signed-off-by: jsvisa <delweng@gmail.com>
This commit is contained in:
jsvisa 2025-04-08 12:08:38 +08:00
parent 77dc1acafa
commit 7c5fc085b0

View file

@ -1117,10 +1117,10 @@ func (s *StateDB) commit(deleteEmptyObjects bool, noStorageWiping bool) (*stateU
} }
// Commit objects to the trie, measuring the elapsed time // Commit objects to the trie, measuring the elapsed time
var ( var (
accountTrieNodesUpdated int accountTrieNodesUpdated atomic.Int32
accountTrieNodesDeleted int accountTrieNodesDeleted atomic.Int32
storageTrieNodesUpdated int storageTrieNodesUpdated atomic.Int32
storageTrieNodesDeleted int storageTrieNodesDeleted atomic.Int32
lock sync.Mutex // protect two maps below lock sync.Mutex // protect two maps below
nodes = trienode.NewMergedNodeSet() // aggregated trie nodes nodes = trienode.NewMergedNodeSet() // aggregated trie nodes
@ -1139,17 +1139,18 @@ func (s *StateDB) commit(deleteEmptyObjects bool, noStorageWiping bool) (*stateU
if set == nil { if set == nil {
return nil return nil
} }
lock.Lock()
defer lock.Unlock()
updates, deletes := set.Size() updates, deletes := set.Size()
if set.Owner == (common.Hash{}) { if set.Owner == (common.Hash{}) {
accountTrieNodesUpdated += updates accountTrieNodesUpdated.Add(int32(updates))
accountTrieNodesDeleted += deletes accountTrieNodesDeleted.Add(int32(deletes))
} else { } else {
storageTrieNodesUpdated += updates storageTrieNodesUpdated.Add(int32(updates))
storageTrieNodesDeleted += deletes storageTrieNodesDeleted.Add(int32(deletes))
} }
lock.Lock()
defer lock.Unlock()
return nodes.Merge(set) return nodes.Merge(set)
} }
) )
@ -1237,10 +1238,10 @@ func (s *StateDB) commit(deleteEmptyObjects bool, noStorageWiping bool) (*stateU
storageUpdatedMeter.Mark(s.StorageUpdated.Load()) storageUpdatedMeter.Mark(s.StorageUpdated.Load())
accountDeletedMeter.Mark(int64(s.AccountDeleted)) accountDeletedMeter.Mark(int64(s.AccountDeleted))
storageDeletedMeter.Mark(s.StorageDeleted.Load()) storageDeletedMeter.Mark(s.StorageDeleted.Load())
accountTrieUpdatedMeter.Mark(int64(accountTrieNodesUpdated)) accountTrieUpdatedMeter.Mark(int64(accountTrieNodesUpdated.Load()))
accountTrieDeletedMeter.Mark(int64(accountTrieNodesDeleted)) accountTrieDeletedMeter.Mark(int64(accountTrieNodesDeleted.Load()))
storageTriesUpdatedMeter.Mark(int64(storageTrieNodesUpdated)) storageTriesUpdatedMeter.Mark(int64(storageTrieNodesUpdated.Load()))
storageTriesDeletedMeter.Mark(int64(storageTrieNodesDeleted)) storageTriesDeletedMeter.Mark(int64(storageTrieNodesDeleted.Load()))
// Clear the metric markers // Clear the metric markers
s.AccountLoaded, s.AccountUpdated, s.AccountDeleted = 0, 0, 0 s.AccountLoaded, s.AccountUpdated, s.AccountDeleted = 0, 0, 0