@@ -85,10 +85,10 @@ type backend interface {
8585// relevant with trie nodes and node preimages.
8686type Database struct {
8787 disk ethdb.Database
88- config * Config // Configuration for trie database
89- preimages * preimageStore // The store for caching preimages
90- backend backend // The backend for managing trie nodes
91- readBackend atomic.Value // Stores backend interface, lock -free for concurrent reads
88+ config * Config // Configuration for trie database
89+ preimages * preimageStore // The store for caching preimages
90+ backend backend // The backend for managing trie nodes
91+ readBackend atomic.Pointer [ backend ] // Lock -free for concurrent reads, supports nil
9292}
9393
9494// NewDatabase initializes the trie database with default settings, note
@@ -119,14 +119,14 @@ func NewDatabase(diskdb ethdb.Database, config *Config) *Database {
119119}
120120
121121func (db * Database ) SetReadBackend (b backend ) {
122- db .readBackend .Store (b )
122+ db .readBackend .Store (& b )
123123}
124124
125125// Reader returns a reader for accessing all trie nodes with provided state root.
126126// An error will be returned if the requested state is not available.
127127func (db * Database ) NodeReader (blockRoot common.Hash ) (database.NodeReader , error ) {
128- if rb := db .readBackend .Load (); rb != nil {
129- return rb .( backend ).NodeReader (blockRoot )
128+ if rbPtr := db .readBackend .Load (); rbPtr != nil && * rbPtr != nil {
129+ return ( * rbPtr ).NodeReader (blockRoot )
130130 }
131131 return db .backend .NodeReader (blockRoot )
132132}
0 commit comments