@@ -84,7 +84,7 @@ func (f *FilterMaps) renderMapsBefore(renderBefore uint32) (*mapRenderer, error)
8484 if err != nil {
8585 return nil , err
8686 }
87- if snapshot := f .lastCanonicalSnapshotBefore ( renderBefore ); snapshot != nil && snapshot . mapIndex >= nextMap {
87+ if snapshot := f .lastCanonicalSnapshotOfMap ( nextMap ); snapshot != nil {
8888 return f .renderMapsFromSnapshot (snapshot )
8989 }
9090 if nextMap >= renderBefore {
@@ -97,14 +97,14 @@ func (f *FilterMaps) renderMapsBefore(renderBefore uint32) (*mapRenderer, error)
9797// snapshot made at a block boundary.
9898func (f * FilterMaps ) renderMapsFromSnapshot (cp * renderedMap ) (* mapRenderer , error ) {
9999 f .testSnapshotUsed = true
100- iter , err := f .newLogIteratorFromBlockDelimiter (cp .lastBlock )
100+ iter , err := f .newLogIteratorFromBlockDelimiter (cp .lastBlock , cp . headDelimiter )
101101 if err != nil {
102102 return nil , fmt .Errorf ("failed to create log iterator from block delimiter %d: %v" , cp .lastBlock , err )
103103 }
104104 return & mapRenderer {
105105 f : f ,
106106 currentMap : & renderedMap {
107- filterMap : cp .filterMap .copy (),
107+ filterMap : cp .filterMap .fullCopy (),
108108 mapIndex : cp .mapIndex ,
109109 lastBlock : cp .lastBlock ,
110110 blockLvPtrs : cp .blockLvPtrs ,
@@ -137,14 +137,14 @@ func (f *FilterMaps) renderMapsFromMapBoundary(firstMap, renderBefore uint32, st
137137 }, nil
138138}
139139
140- // lastCanonicalSnapshotBefore returns the latest cached snapshot that matches
141- // the current targetView.
142- func (f * FilterMaps ) lastCanonicalSnapshotBefore ( renderBefore uint32 ) * renderedMap {
140+ // lastCanonicalSnapshotOfMap returns the latest cached snapshot of the given map
141+ // that is also consistent with the current targetView.
142+ func (f * FilterMaps ) lastCanonicalSnapshotOfMap ( mapIndex uint32 ) * renderedMap {
143143 var best * renderedMap
144144 for _ , blockNumber := range f .renderSnapshots .Keys () {
145145 if cp , _ := f .renderSnapshots .Get (blockNumber ); cp != nil && blockNumber < f .indexedRange .blocks .AfterLast () &&
146146 blockNumber <= f .targetView .headNumber && f .targetView .getBlockId (blockNumber ) == cp .lastBlockId &&
147- cp .mapIndex < renderBefore && (best == nil || blockNumber > best .lastBlock ) {
147+ cp .mapIndex == mapIndex && (best == nil || blockNumber > best .lastBlock ) {
148148 best = cp
149149 }
150150 }
@@ -171,10 +171,9 @@ func (f *FilterMaps) lastCanonicalMapBoundaryBefore(renderBefore uint32) (nextMa
171171 if err != nil {
172172 return 0 , 0 , 0 , fmt .Errorf ("failed to retrieve last block of reverse iterated map %d: %v" , mapIndex , err )
173173 }
174- if lastBlock >= f .indexedView .headNumber || lastBlock >= f .targetView .headNumber ||
175- lastBlockId != f .targetView .getBlockId (lastBlock ) {
176- // map is not full or inconsistent with targetView; roll back
177- continue
174+ if (f .indexedRange .headIndexed && mapIndex >= f .indexedRange .maps .Last ()) ||
175+ lastBlock >= f .targetView .headNumber || lastBlockId != f .targetView .getBlockId (lastBlock ) {
176+ continue // map is not full or inconsistent with targetView; roll back
178177 }
179178 lvPtr , err := f .getBlockLvPointer (lastBlock )
180179 if err != nil {
@@ -257,11 +256,14 @@ func (f *FilterMaps) loadHeadSnapshot() error {
257256
258257// makeSnapshot creates a snapshot of the current state of the rendered map.
259258func (r * mapRenderer ) makeSnapshot () {
260- r .f .renderSnapshots .Add (r .iterator .blockNumber , & renderedMap {
261- filterMap : r .currentMap .filterMap .copy (),
259+ if r .iterator .blockNumber != r .currentMap .lastBlock || r .iterator .chainView != r .f .targetView {
260+ panic ("iterator state inconsistent with current rendered map" )
261+ }
262+ r .f .renderSnapshots .Add (r .currentMap .lastBlock , & renderedMap {
263+ filterMap : r .currentMap .filterMap .fastCopy (),
262264 mapIndex : r .currentMap .mapIndex ,
263- lastBlock : r .iterator . blockNumber ,
264- lastBlockId : r .f . targetView .getBlockId (r .currentMap .lastBlock ),
265+ lastBlock : r .currentMap . lastBlock ,
266+ lastBlockId : r .iterator . chainView .getBlockId (r .currentMap .lastBlock ),
265267 blockLvPtrs : r .currentMap .blockLvPtrs ,
266268 finished : true ,
267269 headDelimiter : r .iterator .lvIndex ,
@@ -661,24 +663,13 @@ var errUnindexedRange = errors.New("unindexed range")
661663// newLogIteratorFromBlockDelimiter creates a logIterator starting at the
662664// given block's first log value entry (the block delimiter), according to the
663665// current targetView.
664- func (f * FilterMaps ) newLogIteratorFromBlockDelimiter (blockNumber uint64 ) (* logIterator , error ) {
666+ func (f * FilterMaps ) newLogIteratorFromBlockDelimiter (blockNumber , lvIndex uint64 ) (* logIterator , error ) {
665667 if blockNumber > f .targetView .headNumber {
666668 return nil , fmt .Errorf ("iterator entry point %d after target chain head block %d" , blockNumber , f .targetView .headNumber )
667669 }
668670 if ! f .indexedRange .blocks .Includes (blockNumber ) {
669671 return nil , errUnindexedRange
670672 }
671- var lvIndex uint64
672- if f .indexedRange .headIndexed && blockNumber + 1 == f .indexedRange .blocks .AfterLast () {
673- lvIndex = f .indexedRange .headDelimiter
674- } else {
675- var err error
676- lvIndex , err = f .getBlockLvPointer (blockNumber + 1 )
677- if err != nil {
678- return nil , fmt .Errorf ("failed to retrieve log value pointer of block %d after delimiter: %v" , blockNumber + 1 , err )
679- }
680- lvIndex --
681- }
682673 finished := blockNumber == f .targetView .headNumber
683674 l := & logIterator {
684675 chainView : f .targetView ,
0 commit comments