@@ -32,17 +32,19 @@ type RecordingKV struct {
3232 inner * triedb.Database
3333 diskDb ethdb.KeyValueStore
3434 readDbEntries map [common.Hash ][]byte
35+ mutex sync.Mutex
3536 enableBypass bool
3637}
3738
3839func newRecordingKV (inner * triedb.Database , diskDb ethdb.KeyValueStore ) * RecordingKV {
39- return & RecordingKV {inner , diskDb , make (map [common.Hash ][]byte ), false }
40+ return & RecordingKV {inner , diskDb , make (map [common.Hash ][]byte ), sync. Mutex {}, false }
4041}
4142
4243func (db * RecordingKV ) Has (key []byte ) (bool , error ) {
4344 return false , errors .New ("recording KV doesn't support Has" )
4445}
4546
47+ // Get may be called concurrently with other Get calls
4648func (db * RecordingKV ) Get (key []byte ) ([]byte , error ) {
4749 var hash common.Hash
4850 var res []byte
@@ -66,6 +68,8 @@ func (db *RecordingKV) Get(key []byte) ([]byte, error) {
6668 if crypto .Keccak256Hash (res ) != hash {
6769 return nil , fmt .Errorf ("recording KV attempted to access non-hash key %v" , hash )
6870 }
71+ db .mutex .Lock ()
72+ defer db .mutex .Unlock ()
6973 db .readDbEntries [hash ] = res
7074 return res , nil
7175}
@@ -190,7 +194,7 @@ func (r *RecordingDatabase) StateFor(header *types.Header) (*state.StateDB, erro
190194 r .mutex .Lock ()
191195 defer r .mutex .Unlock ()
192196
193- sdb , err := state .NewDeterministic (header .Root , r .db )
197+ sdb , err := state .NewRecording (header .Root , r .db )
194198 if err == nil {
195199 r .referenceRootLockHeld (header .Root )
196200 }
@@ -263,7 +267,7 @@ func (r *RecordingDatabase) PrepareRecording(ctx context.Context, lastBlockHeade
263267 if lastBlockHeader != nil {
264268 prevRoot = lastBlockHeader .Root
265269 }
266- recordingStateDb , err := state .NewDeterministic (prevRoot , recordingStateDatabase )
270+ recordingStateDb , err := state .NewRecording (prevRoot , recordingStateDatabase )
267271 if err != nil {
268272 return nil , nil , nil , fmt .Errorf ("failed to create recordingStateDb: %w" , err )
269273 }
0 commit comments