diff --git a/core/filtermaps/indexer.go b/core/filtermaps/indexer.go index addda03df4..835e84cc0a 100644 --- a/core/filtermaps/indexer.go +++ b/core/filtermaps/indexer.go @@ -346,6 +346,9 @@ func (f *FilterMaps) needTailEpoch(epoch uint32) bool { if epoch > firstEpoch { return true } + if (epoch+1)<= f.indexedRange.maps.AfterLast() { + return true + } if epoch+1 < firstEpoch { return false } diff --git a/core/filtermaps/map_renderer.go b/core/filtermaps/map_renderer.go index 4f45a7f2b2..ba2d399e88 100644 --- a/core/filtermaps/map_renderer.go +++ b/core/filtermaps/map_renderer.go @@ -185,27 +185,30 @@ func (f *FilterMaps) lastCanonicalMapBoundaryBefore(renderBefore uint32) (nextMa // lastMapBoundaryBefore returns the latest map boundary before the specified // map index. -func (f *FilterMaps) lastMapBoundaryBefore(mapIndex uint32) (uint32, bool) { - if !f.indexedRange.initialized || f.indexedRange.maps.AfterLast() == 0 { +func (f *FilterMaps) lastMapBoundaryBefore(renderBefore uint32) (uint32, bool) { + if !f.indexedRange.initialized || f.indexedRange.maps.AfterLast() == 0 || renderBefore == 0 { return 0, false } - if mapIndex > f.indexedRange.maps.AfterLast() { - mapIndex = f.indexedRange.maps.AfterLast() + afterLastFullMap := f.indexedRange.maps.AfterLast() + if afterLastFullMap > 0 && f.indexedRange.headIndexed { + afterLastFullMap-- // last map is not full } - if mapIndex > f.indexedRange.maps.First() { - return mapIndex - 1, true + firstRendered := min(renderBefore-1, afterLastFullMap) + if firstRendered == 0 { + return 0, false } - if mapIndex+f.mapsPerEpoch > f.indexedRange.maps.First() { - if mapIndex > f.indexedRange.maps.First()-f.mapsPerEpoch+f.indexedRange.tailPartialEpoch { - mapIndex = f.indexedRange.maps.First() - f.mapsPerEpoch + f.indexedRange.tailPartialEpoch - } + if firstRendered >= f.indexedRange.maps.First() { + return firstRendered - 1, true + } + if firstRendered+f.mapsPerEpoch > f.indexedRange.maps.First() { + firstRendered = min(firstRendered, f.indexedRange.maps.First()-f.mapsPerEpoch+f.indexedRange.tailPartialEpoch) } else { - mapIndex = (mapIndex >> f.logMapsPerEpoch) << f.logMapsPerEpoch + firstRendered = (firstRendered >> f.logMapsPerEpoch) << f.logMapsPerEpoch } - if mapIndex == 0 { + if firstRendered == 0 { return 0, false } - return mapIndex - 1, true + return firstRendered - 1, true } // emptyFilterMap returns an empty filter map.