// RecoverMiddleware helps the server recover from panics. It ensures that // no request can fully bring down the horizon server, and it also logs the // panics to the logging subsystem. func RecoverMiddleware(c *web.C, h http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { ctx := gctx.FromC(*c) defer func() { if rec := recover(); rec != nil { err := errors.FromPanic(rec) errors.ReportToSentry(err, r) problem.Render(ctx, w, err) } }() h.ServeHTTP(w, r) } return http.HandlerFunc(fn) }
// run causes the importer to check stellar-core to see if we can import new // data. func (i *System) runOnce() { defer func() { if rec := recover(); rec != nil { err := errors.FromPanic(rec) log.Errorf("import session panicked: %s", err) errors.ReportToSentry(err, nil) } }() // 1. find the latest ledger // 2. if any available, import until none available // 3. if any were imported, go to 1 for { // 1. err := i.updateLedgerState() if err != nil { log.Errorf("could not load ledger state: %s", err) return } // 2. if i.historySequence >= i.coreSequence { return } is := NewSession( i.historySequence+1, i.coreSequence, i, ) is.Run() if is.Err != nil { log.Errorf("import session failed: %s", is.Err) return } // 3. if is.Ingested == 0 { return } } }