Skip to content

Commit 7d1b74c

Browse files
zsfelfoldihowjmay
authored andcommitted
core/filtermaps: fixed indexer checkpoint initialization (ethereum#31419)
This PR fixes a bug in the `lastMapBoundaryBefore` logic that resulted in incorrect checkpoint initialization (started rendering from the previous epoch boundary which caused the `needTailEpoch` check to fail). Apparently the bug was present before but went unnoticed because `needTailEpoch` behaved differently. Fixes ethereum#31413
1 parent 5166d08 commit 7d1b74c

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

core/filtermaps/indexer.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,9 @@ func (f *FilterMaps) needTailEpoch(epoch uint32) bool {
346346
if epoch > firstEpoch {
347347
return true
348348
}
349+
if (epoch+1)<<f.logMapsPerEpoch >= f.indexedRange.maps.AfterLast() {
350+
return true
351+
}
349352
if epoch+1 < firstEpoch {
350353
return false
351354
}

core/filtermaps/map_renderer.go

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -185,27 +185,30 @@ func (f *FilterMaps) lastCanonicalMapBoundaryBefore(renderBefore uint32) (nextMa
185185

186186
// lastMapBoundaryBefore returns the latest map boundary before the specified
187187
// map index.
188-
func (f *FilterMaps) lastMapBoundaryBefore(mapIndex uint32) (uint32, bool) {
189-
if !f.indexedRange.initialized || f.indexedRange.maps.AfterLast() == 0 {
188+
func (f *FilterMaps) lastMapBoundaryBefore(renderBefore uint32) (uint32, bool) {
189+
if !f.indexedRange.initialized || f.indexedRange.maps.AfterLast() == 0 || renderBefore == 0 {
190190
return 0, false
191191
}
192-
if mapIndex > f.indexedRange.maps.AfterLast() {
193-
mapIndex = f.indexedRange.maps.AfterLast()
192+
afterLastFullMap := f.indexedRange.maps.AfterLast()
193+
if afterLastFullMap > 0 && f.indexedRange.headIndexed {
194+
afterLastFullMap-- // last map is not full
194195
}
195-
if mapIndex > f.indexedRange.maps.First() {
196-
return mapIndex - 1, true
196+
firstRendered := min(renderBefore-1, afterLastFullMap)
197+
if firstRendered == 0 {
198+
return 0, false
197199
}
198-
if mapIndex+f.mapsPerEpoch > f.indexedRange.maps.First() {
199-
if mapIndex > f.indexedRange.maps.First()-f.mapsPerEpoch+f.indexedRange.tailPartialEpoch {
200-
mapIndex = f.indexedRange.maps.First() - f.mapsPerEpoch + f.indexedRange.tailPartialEpoch
201-
}
200+
if firstRendered >= f.indexedRange.maps.First() {
201+
return firstRendered - 1, true
202+
}
203+
if firstRendered+f.mapsPerEpoch > f.indexedRange.maps.First() {
204+
firstRendered = min(firstRendered, f.indexedRange.maps.First()-f.mapsPerEpoch+f.indexedRange.tailPartialEpoch)
202205
} else {
203-
mapIndex = (mapIndex >> f.logMapsPerEpoch) << f.logMapsPerEpoch
206+
firstRendered = (firstRendered >> f.logMapsPerEpoch) << f.logMapsPerEpoch
204207
}
205-
if mapIndex == 0 {
208+
if firstRendered == 0 {
206209
return 0, false
207210
}
208-
return mapIndex - 1, true
211+
return firstRendered - 1, true
209212
}
210213

211214
// emptyFilterMap returns an empty filter map.

0 commit comments

Comments
 (0)