@@ -48,6 +48,12 @@ func (f *FilterMaps) indexerLoop() {
48
48
continue
49
49
}
50
50
if err := f .init (); err != nil {
51
+ if err == errHistoryCutoff {
52
+ log .Warn ("History cutoff point beyond latest checkpoint; log index disabled" )
53
+ f .disabled = true
54
+ f .reset ()
55
+ return
56
+ }
51
57
log .Error ("Error initializing log index" , "error" , err )
52
58
// unexpected error; there is not a lot we can do here, maybe it
53
59
// recovers, maybe not. Calling event processing here ensures
@@ -57,10 +63,16 @@ func (f *FilterMaps) indexerLoop() {
57
63
}
58
64
}
59
65
if ! f .targetHeadIndexed () {
60
- if ! f .tryIndexHead () {
61
- // either shutdown or unexpected error; in the latter case ensure
62
- // that proper shutdown is still possible.
63
- f .processSingleEvent (true )
66
+ if _ , err := f .tryIndexHead (); err != nil {
67
+ switch err {
68
+ case errHistoryCutoff :
69
+ log .Warn ("History cutoff point beyond rendered index head; resetting log index" )
70
+ f .reset () // still attempt re-initializing; maybe there are more recent checkpoints
71
+ default :
72
+ // unexpected error; ensure that we can still properly
73
+ // shutdown in case of an infinite loop.
74
+ f .processSingleEvent (true )
75
+ }
64
76
}
65
77
} else {
66
78
if f .finalBlock != f .lastFinal {
@@ -198,22 +210,22 @@ func (f *FilterMaps) setTarget(target targetUpdate) {
198
210
199
211
// tryIndexHead tries to render head maps according to the current targetView
200
212
// and returns true if successful.
201
- func (f * FilterMaps ) tryIndexHead () bool {
213
+ func (f * FilterMaps ) tryIndexHead () ( bool , error ) {
202
214
headRenderer , err := f .renderMapsBefore (math .MaxUint32 )
203
215
if err != nil {
204
216
log .Error ("Error creating log index head renderer" , "error" , err )
205
- return false
217
+ return false , err
206
218
}
207
219
if headRenderer == nil {
208
- return true
220
+ return true , nil
209
221
}
210
222
if ! f .startedHeadIndex {
211
223
f .lastLogHeadIndex = time .Now ()
212
224
f .startedHeadIndexAt = f .lastLogHeadIndex
213
225
f .startedHeadIndex = true
214
226
f .ptrHeadIndex = f .indexedRange .blocks .AfterLast ()
215
227
}
216
- if _ , err := headRenderer .run (func () bool {
228
+ if done , err := headRenderer .run (func () bool {
217
229
f .processEvents ()
218
230
return f .stop
219
231
}, func () {
@@ -229,9 +241,11 @@ func (f *FilterMaps) tryIndexHead() bool {
229
241
f .loggedHeadIndex = true
230
242
f .lastLogHeadIndex = time .Now ()
231
243
}
232
- }); err != nil {
233
- log .Error ("Log index head rendering failed" , "error" , err )
234
- return false
244
+ }); ! done {
245
+ if err != nil {
246
+ log .Error ("Log index head rendering failed" , "error" , err )
247
+ }
248
+ return false , err
235
249
}
236
250
if f .loggedHeadIndex && f .indexedRange .hasIndexedBlocks () {
237
251
log .Info ("Log index head rendering finished" ,
@@ -240,7 +254,7 @@ func (f *FilterMaps) tryIndexHead() bool {
240
254
"elapsed" , common .PrettyDuration (time .Since (f .startedHeadIndexAt )))
241
255
}
242
256
f .loggedHeadIndex , f .startedHeadIndex = false , false
243
- return true
257
+ return true , nil
244
258
}
245
259
246
260
// tryIndexTail tries to render tail epochs until the tail target block is
0 commit comments