From e451b0534a317825cdafdea035f5a709ab7d177d Mon Sep 17 00:00:00 2001 From: qinglin89 <316032931@qq.com> Date: Tue, 19 Jul 2022 15:42:25 +0800 Subject: [PATCH 1/2] get prefetcher before use to avoid been modified bwteen access and not-nil condition --- core/state/state_object.go | 6 ++++-- core/state/statedb.go | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/core/state/state_object.go b/core/state/state_object.go index 780cd6d255..a526d3ab24 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -455,9 +455,11 @@ func (s *StateObject) updateTrie(db Database) Trie { } wg.Wait() - if s.db.prefetcher != nil { - s.db.prefetcher.used(s.data.Root, usedStorage) + prefetcher := s.db.prefetcher + if prefetcher != nil { + prefetcher.used(s.data.Root, usedStorage) } + if len(s.pendingStorage) > 0 { s.pendingStorage = make(Storage) } diff --git a/core/state/statedb.go b/core/state/statedb.go index 2edeb379e5..48b366b353 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -857,8 +857,9 @@ func (s *StateDB) Copy() *StateDB { // If there's a prefetcher running, make an inactive copy of it that can // only access data but does not actively preload (since the user will not // know that they need to explicitly terminate an active copy). - if s.prefetcher != nil { - state.prefetcher = s.prefetcher.copy() + prefetcher := s.prefetcher + if prefetcher != nil { + state.prefetcher = prefetcher.copy() } if s.snaps != nil { // In order for the miner to be able to use and make additions @@ -970,8 +971,9 @@ func (s *StateDB) Finalise(deleteEmptyObjects bool) { addressesToPrefetch = append(addressesToPrefetch, common.CopyBytes(addr[:])) // Copy needed for closure } } - if s.prefetcher != nil && len(addressesToPrefetch) > 0 { - s.prefetcher.prefetch(s.originalRoot, addressesToPrefetch, emptyAddr) + prefetcher := s.prefetcher + if prefetcher != nil && len(addressesToPrefetch) > 0 { + prefetcher.prefetch(s.originalRoot, addressesToPrefetch, emptyAddr) } // Invalidate journal because reverting across transactions is not allowed. s.clearJournalAndRefund() From 4d92fd7aef8531bd74e5fec96dedd7d923f91cbe Mon Sep 17 00:00:00 2001 From: qinglin89 <316032931@qq.com> Date: Wed, 20 Jul 2022 10:51:37 +0800 Subject: [PATCH 2/2] some missed s.prefetcher value copy --- core/state/state_object.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/state/state_object.go b/core/state/state_object.go index a526d3ab24..df6c03e769 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -169,10 +169,11 @@ func (s *StateObject) getTrie(db Database) Trie { if s.trie == nil { // Try fetching from prefetcher first // We don't prefetch empty tries - if s.data.Root != emptyRoot && s.db.prefetcher != nil { + prefetcher := s.db.prefetcher + if s.data.Root != emptyRoot && prefetcher != nil { // When the miner is creating the pending state, there is no // prefetcher - s.trie = s.db.prefetcher.trie(s.data.Root) + s.trie = prefetcher.trie(s.data.Root) } if s.trie == nil { var err error @@ -375,8 +376,9 @@ func (s *StateObject) finalise(prefetch bool) { } } - if s.db.prefetcher != nil && prefetch && len(slotsToPrefetch) > 0 && s.data.Root != emptyRoot && s.data.Root != dummyRoot { - s.db.prefetcher.prefetch(s.data.Root, slotsToPrefetch, s.addrHash) + prefetcher := s.db.prefetcher + if prefetcher != nil && prefetch && len(slotsToPrefetch) > 0 && s.data.Root != emptyRoot && s.data.Root != dummyRoot { + prefetcher.prefetch(s.data.Root, slotsToPrefetch, s.addrHash) } if len(s.dirtyStorage) > 0 { s.dirtyStorage = make(Storage)