core/filtermaps: add function for disabling

This commit is contained in:
Felix Lange 2025-03-28 12:13:54 +01:00
parent 2d469a4ace
commit f532e4439a

View file

@ -50,20 +50,14 @@ func (f *FilterMaps) indexerLoop() {
continue continue
} }
if err := f.init(); err != nil { if err := f.init(); err != nil {
log.Error("Error initializing log index; reverting to unindexed mode", "error", err) f.disableForError("initialization", err)
f.reset() f.reset() // remove broken index from DB
f.disabled = true
close(f.disabledCh)
return return
} }
} }
if !f.targetHeadIndexed() { if !f.targetHeadIndexed() {
if err := f.tryIndexHead(); err != nil { if err := f.tryIndexHead(); err != nil {
log.Error("Log index head rendering failed; reverting to unindexed mode", "error", err) f.disableForError("head rendering", err)
// disable indexer without resetting database; maybe a client
// update can fix the issue without reindexing
f.disabled = true
close(f.disabledCh)
return return
} }
} else { } else {
@ -74,17 +68,13 @@ func (f *FilterMaps) indexerLoop() {
f.lastFinal = f.finalBlock f.lastFinal = f.finalBlock
} }
if done, err := f.tryIndexTail(); err != nil { if done, err := f.tryIndexTail(); err != nil {
log.Error("Log index tail rendering failed; reverting to unindexed mode", "error", err) f.disableForError("tail rendering", err)
f.disabled = true
close(f.disabledCh)
return return
} else if !done { } else if !done {
continue continue
} }
if done, err := f.tryUnindexTail(); err != nil { if done, err := f.tryUnindexTail(); err != nil {
log.Error("Log index tail unindexing failed; reverting to unindexed mode", "error", err) f.disableForError("tail unindexing", err)
f.disabled = true
close(f.disabledCh)
return return
} else if !done { } else if !done {
continue continue
@ -96,6 +86,17 @@ func (f *FilterMaps) indexerLoop() {
} }
} }
// disableForError is called when the indexer encounters a database error, for example a
// missing receipt. We can't continue operating when the database is broken, so the
// indexer goes into disabled state.
// Note that the partial index is left in disk; maybe a client update can fix the
// issue without reindexing.
func (f *FilterMaps) disableForError(op string, err error) {
log.Error("Log index "+op+" failed, reverting to unindexed mode", "error", err)
f.disabled = true
close(f.disabledCh)
}
type targetUpdate struct { type targetUpdate struct {
targetView *ChainView targetView *ChainView
historyCutoff, finalBlock uint64 historyCutoff, finalBlock uint64