@@ -84,7 +84,7 @@ func (f *FilterMaps) renderMapsBefore(renderBefore uint32) (*mapRenderer, error)
84
84
if err != nil {
85
85
return nil , err
86
86
}
87
- if snapshot := f .lastCanonicalSnapshotBefore ( renderBefore ); snapshot != nil && snapshot . mapIndex >= nextMap {
87
+ if snapshot := f .lastCanonicalSnapshotOfMap ( nextMap ); snapshot != nil {
88
88
return f .renderMapsFromSnapshot (snapshot )
89
89
}
90
90
if nextMap >= renderBefore {
@@ -97,14 +97,14 @@ func (f *FilterMaps) renderMapsBefore(renderBefore uint32) (*mapRenderer, error)
97
97
// snapshot made at a block boundary.
98
98
func (f * FilterMaps ) renderMapsFromSnapshot (cp * renderedMap ) (* mapRenderer , error ) {
99
99
f .testSnapshotUsed = true
100
- iter , err := f .newLogIteratorFromBlockDelimiter (cp .lastBlock )
100
+ iter , err := f .newLogIteratorFromBlockDelimiter (cp .lastBlock , cp . headDelimiter )
101
101
if err != nil {
102
102
return nil , fmt .Errorf ("failed to create log iterator from block delimiter %d: %v" , cp .lastBlock , err )
103
103
}
104
104
return & mapRenderer {
105
105
f : f ,
106
106
currentMap : & renderedMap {
107
- filterMap : cp .filterMap .copy (),
107
+ filterMap : cp .filterMap .fullCopy (),
108
108
mapIndex : cp .mapIndex ,
109
109
lastBlock : cp .lastBlock ,
110
110
blockLvPtrs : cp .blockLvPtrs ,
@@ -137,14 +137,14 @@ func (f *FilterMaps) renderMapsFromMapBoundary(firstMap, renderBefore uint32, st
137
137
}, nil
138
138
}
139
139
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 {
143
143
var best * renderedMap
144
144
for _ , blockNumber := range f .renderSnapshots .Keys () {
145
145
if cp , _ := f .renderSnapshots .Get (blockNumber ); cp != nil && blockNumber < f .indexedRange .blocks .AfterLast () &&
146
146
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 ) {
148
148
best = cp
149
149
}
150
150
}
@@ -171,10 +171,9 @@ func (f *FilterMaps) lastCanonicalMapBoundaryBefore(renderBefore uint32) (nextMa
171
171
if err != nil {
172
172
return 0 , 0 , 0 , fmt .Errorf ("failed to retrieve last block of reverse iterated map %d: %v" , mapIndex , err )
173
173
}
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
178
177
}
179
178
lvPtr , err := f .getBlockLvPointer (lastBlock )
180
179
if err != nil {
@@ -257,11 +256,14 @@ func (f *FilterMaps) loadHeadSnapshot() error {
257
256
258
257
// makeSnapshot creates a snapshot of the current state of the rendered map.
259
258
func (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 (),
262
264
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 ),
265
267
blockLvPtrs : r .currentMap .blockLvPtrs ,
266
268
finished : true ,
267
269
headDelimiter : r .iterator .lvIndex ,
@@ -661,24 +663,13 @@ var errUnindexedRange = errors.New("unindexed range")
661
663
// newLogIteratorFromBlockDelimiter creates a logIterator starting at the
662
664
// given block's first log value entry (the block delimiter), according to the
663
665
// current targetView.
664
- func (f * FilterMaps ) newLogIteratorFromBlockDelimiter (blockNumber uint64 ) (* logIterator , error ) {
666
+ func (f * FilterMaps ) newLogIteratorFromBlockDelimiter (blockNumber , lvIndex uint64 ) (* logIterator , error ) {
665
667
if blockNumber > f .targetView .headNumber {
666
668
return nil , fmt .Errorf ("iterator entry point %d after target chain head block %d" , blockNumber , f .targetView .headNumber )
667
669
}
668
670
if ! f .indexedRange .blocks .Includes (blockNumber ) {
669
671
return nil , errUnindexedRange
670
672
}
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
- }
682
673
finished := blockNumber == f .targetView .headNumber
683
674
l := & logIterator {
684
675
chainView : f .targetView ,
0 commit comments