@@ -69,6 +69,10 @@ type Database struct {
6969
7070 // Pending changes to be written to the DB
7171 pendingChanges chan VersionedChangesets
72+
73+ // Cache for last range hashed
74+ lastRangeHashedCache int64
75+ lastRangeHashedMu sync.RWMutex
7276}
7377
7478type VersionedChangesets struct {
@@ -126,6 +130,14 @@ func New(dataDir string, config config.StateStoreConfig) (*Database, error) {
126130 earliestVersion : earliestVersion ,
127131 pendingChanges : make (chan VersionedChangesets , config .AsyncWriteBuffer ),
128132 }
133+
134+ // Initialize the lastRangeHashed cache
135+ lastHashed , err := retrieveLastRangeHashed (db )
136+ if err != nil {
137+ return nil , fmt .Errorf ("failed to retrieve last range hashed: %w" , err )
138+ }
139+ database .lastRangeHashedCache = lastHashed
140+
129141 if config .DedicatedChangelog {
130142 streamHandler , _ := changelog .NewStream (
131143 logger .NewNopLogger (),
@@ -206,25 +218,23 @@ func (db *Database) GetEarliestVersion() (int64, error) {
206218func (db * Database ) SetLastRangeHashed (latestHashed int64 ) error {
207219 var ts [VersionSize ]byte
208220 binary .LittleEndian .PutUint64 (ts [:], uint64 (latestHashed ))
221+
222+ // Update the cache first
223+ db .lastRangeHashedMu .Lock ()
224+ db .lastRangeHashedCache = latestHashed
225+ db .lastRangeHashedMu .Unlock ()
226+
209227 return db .storage .Set ([]byte (lastRangeHashKey ), ts [:], defaultWriteOpts )
210228}
211229
212230// GetLastRangeHashed returns the highest block that has been fully hashed in ranges.
213231func (db * Database ) GetLastRangeHashed () (int64 , error ) {
214- bz , closer , err := db .storage .Get ([]byte (lastRangeHashKey ))
215- if err != nil {
216- if errors .Is (err , pebble .ErrNotFound ) {
217- // means we haven't hashed anything yet
218- return 0 , nil
219- }
220- return 0 , err
221- }
222- defer closer .Close ()
232+ // Return the cached value
233+ db .lastRangeHashedMu .RLock ()
234+ cachedValue := db .lastRangeHashedCache
235+ db .lastRangeHashedMu .RUnlock ()
223236
224- if len (bz ) == 0 {
225- return 0 , nil
226- }
227- return int64 (binary .LittleEndian .Uint64 (bz )), nil
237+ return cachedValue , nil
228238}
229239
230240// Retrieves earliest version from db
@@ -1025,3 +1035,20 @@ func (db *Database) WriteBlockRangeHash(storeKey string, beginBlockRange, endBlo
10251035 }
10261036 return nil
10271037}
1038+
1039+ func retrieveLastRangeHashed (db * pebble.DB ) (int64 , error ) {
1040+ bz , closer , err := db .Get ([]byte (lastRangeHashKey ))
1041+ if err != nil {
1042+ if errors .Is (err , pebble .ErrNotFound ) {
1043+ // means we haven't hashed anything yet
1044+ return 0 , nil
1045+ }
1046+ return 0 , err
1047+ }
1048+ defer closer .Close ()
1049+
1050+ if len (bz ) == 0 {
1051+ return 0 , nil
1052+ }
1053+ return int64 (binary .LittleEndian .Uint64 (bz )), nil
1054+ }
0 commit comments