diff --git a/asyncsearcher/async_searcher.go b/asyncsearcher/async_searcher.go index fc897f11..155ae4f3 100644 --- a/asyncsearcher/async_searcher.go +++ b/asyncsearcher/async_searcher.go @@ -396,7 +396,13 @@ func compressQPR(qpr *seq.QPR, cb func(compressed []byte) error) error { return nil } -func (as *AsyncSearcher) processFrac(f frac.Fraction, info asyncSearchInfo) error { +func (as *AsyncSearcher) processFrac(f frac.Fraction, info asyncSearchInfo) (err error) { + defer func() { + if panicData := util.RecoverToError(recover(), asyncSearchPanics); panicData != nil { + err = fmt.Errorf("async search panic during processFrac: %w", panicData) + } + }() + qpr, err := f.Search(info.ctx, info.Request.Params) if err != nil { return err diff --git a/asyncsearcher/metrics.go b/asyncsearcher/metrics.go index 97786b54..d1b122f3 100644 --- a/asyncsearcher/metrics.go +++ b/asyncsearcher/metrics.go @@ -42,4 +42,10 @@ var ( Name: "read_only", Help: "Indicates if store is in async search read-only mode (can not start a new async search) due to disk usage limits", }) + asyncSearchPanics = promauto.NewCounter(prometheus.CounterOpts{ + Namespace: "seq_db_store", + Subsystem: "async_search", + Name: "panics_total", + Help: "Number of panics in async search", + }) )