remove wait function from trie prefetcher. make close not remove fetchers. Fix stateless blockchain test-runner.

This commit is contained in:
Jared Wasinger 2024-02-14 19:19:17 -08:00
parent 494ba791a1
commit 259f3e2b4e
3 changed files with 7 additions and 17 deletions

View file

@ -921,13 +921,12 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
prefetcher := s.prefetcher prefetcher := s.prefetcher
if s.prefetcher != nil { if s.prefetcher != nil {
defer func() { defer func() {
s.prefetcher.wait() s.prefetcher.close()
if s.witness != nil { if s.witness != nil {
// TODO: move read prefetcher logic into Commit? // TODO: move read prefetcher logic into Commit?
s.collectReadStorageAccessLists() s.collectReadStorageAccessLists()
s.collectReadAccountsAccessLists() s.collectReadAccountsAccessLists()
} }
s.prefetcher.close()
s.prefetcher = nil s.prefetcher = nil
}() }()
} }

View file

@ -72,7 +72,8 @@ func newTriePrefetcher(db Database, root common.Hash, namespace string) *triePre
} }
// close iterates over all the subfetchers, waits on any that were left spinning // close iterates over all the subfetchers, waits on any that were left spinning
// and reports the stats to the metrics subsystem. // and reports the stats to the metrics subsystem. close should not be called
// more than once on a triePrefetcher instance.
func (p *triePrefetcher) close() { func (p *triePrefetcher) close() {
for _, fetcher := range p.fetchers { for _, fetcher := range p.fetchers {
fetcher.wait() // safe to do multiple times fetcher.wait() // safe to do multiple times
@ -99,8 +100,6 @@ func (p *triePrefetcher) close() {
} }
} }
} }
// Clear out all fetchers (will crash on a second call, deliberate)
p.fetchers = nil
} }
// prefetch schedules a batch of trie items to prefetch. // prefetch schedules a batch of trie items to prefetch.
@ -210,14 +209,6 @@ func (sf *subfetcher) schedule(keys [][]byte) {
} }
} }
// wait instructs all subfetchers to finish their tasks
// and stop receiving new requests.
func (p *triePrefetcher) wait() {
for _, fetcher := range p.fetchers {
fetcher.wait()
}
}
// wait waits for the subfetcher to finish it's task. It is safe to call wait multiple // wait waits for the subfetcher to finish it's task. It is safe to call wait multiple
// times but it is not thread safe. // times but it is not thread safe.
func (sf *subfetcher) wait() { func (sf *subfetcher) wait() {

View file

@ -194,21 +194,21 @@ func execBlockTestStateless(t *testing.T, bt *testMatcher, test *BlockTest) {
tracer := logger.NewJSONLogger(logconfig, os.Stdout) tracer := logger.NewJSONLogger(logconfig, os.Stdout)
_ = tracer _ = tracer
if err := bt.checkFailure(t, test.RunStateless(false, rawdb.HashScheme, nil)); err != nil { if err := bt.checkFailure(t, test.RunStateless(false, rawdb.HashScheme, nil, nil)); err != nil {
t.Errorf("test in hash mode without snapshotter failed: %v", err) t.Errorf("test in hash mode without snapshotter failed: %v", err)
return return
} }
if err := bt.checkFailure(t, test.RunStateless(true, rawdb.HashScheme, nil)); err != nil { if err := bt.checkFailure(t, test.RunStateless(true, rawdb.HashScheme, nil, nil)); err != nil {
t.Errorf("test in hash mode with snapshotter failed: %v", err) t.Errorf("test in hash mode with snapshotter failed: %v", err)
return return
} }
if err := bt.checkFailure(t, test.RunStateless(false, rawdb.PathScheme, nil)); err != nil { if err := bt.checkFailure(t, test.RunStateless(false, rawdb.PathScheme, nil, nil)); err != nil {
t.Errorf("test in path mode without snapshotter failed: %v", err) t.Errorf("test in path mode without snapshotter failed: %v", err)
return return
} }
if err := bt.checkFailure(t, test.RunStateless(true, rawdb.PathScheme, nil)); err != nil { if err := bt.checkFailure(t, test.RunStateless(true, rawdb.PathScheme, nil, nil)); err != nil {
t.Errorf("test in path mode with snapshotter failed: %v", err) t.Errorf("test in path mode with snapshotter failed: %v", err)
return return
} }