From f2b48984465d49aeaeceed15a1c6d4ff54b3ca16 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Tue, 6 Jun 2023 12:06:03 +0100 Subject: [PATCH] WithTransaction: dump stack if wrapped func panics --- sqlutil/sql.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sqlutil/sql.go b/sqlutil/sql.go index 089e614..5c4a640 100644 --- a/sqlutil/sql.go +++ b/sqlutil/sql.go @@ -1,11 +1,21 @@ package sqlutil import ( + "context" "fmt" + "github.com/matrix-org/sliding-sync/internal" + "github.com/rs/zerolog" + "os" + "runtime/debug" "github.com/jmoiron/sqlx" ) +var logger = zerolog.New(os.Stdout).With().Timestamp().Logger().Output(zerolog.ConsoleWriter{ + Out: os.Stderr, + TimeFormat: "15:04:05", +}) + // WithTransaction runs a block of code passing in an SQL transaction // If the code returns an error or panics then the transactions is rolled back // Otherwise the transaction is committed. @@ -18,6 +28,10 @@ func WithTransaction(db *sqlx.DB, fn func(txn *sqlx.Tx) error) (err error) { defer func() { panicErr := recover() if err == nil && panicErr != nil { + // TODO: thread a context through to here? + ctx := context.Background() + logger.Error().Msg(string(debug.Stack())) + internal.GetSentryHubFromContextOrDefault(ctx).RecoverWithContext(ctx, panicErr) err = fmt.Errorf("panic: %v", panicErr) } var txnErr error