From e92b36e765f891daa60f47fb4561af80f542b074 Mon Sep 17 00:00:00 2001 From: kim Date: Wed, 17 Apr 2024 16:08:47 +0100 Subject: [PATCH] some small tweaks --- internal/db/bundb/bundb.go | 22 ++++++++-------------- internal/db/bundb/drivers.go | 23 +++++++---------------- internal/db/bundb/errors.go | 9 +++------ 3 files changed, 18 insertions(+), 36 deletions(-) diff --git a/internal/db/bundb/bundb.go b/internal/db/bundb/bundb.go index 53f08c019..e394a2d95 100644 --- a/internal/db/bundb/bundb.go +++ b/internal/db/bundb/bundb.go @@ -131,12 +131,12 @@ func NewBunDBService(ctx context.Context, state *state.State) (db.DB, error) { switch t { case "postgres": - db, err = pgConn(ctx, state) + db, err = pgConn(ctx) if err != nil { return nil, err } case "sqlite": - db, err = sqliteConn(ctx, state) + db, err = sqliteConn(ctx) if err != nil { return nil, err } @@ -293,7 +293,7 @@ func NewBunDBService(ctx context.Context, state *state.State) (db.DB, error) { return ps, nil } -func pgConn(ctx context.Context, state *state.State) (*bun.DB, error) { +func pgConn(ctx context.Context) (*bun.DB, error) { opts, err := deriveBunDBPGOptions() //nolint:contextcheck if err != nil { return nil, fmt.Errorf("could not create bundb postgres options: %w", err) @@ -324,7 +324,7 @@ func pgConn(ctx context.Context, state *state.State) (*bun.DB, error) { return db, nil } -func sqliteConn(ctx context.Context, state *state.State) (*bun.DB, error) { +func sqliteConn(ctx context.Context) (*bun.DB, error) { // validate db address has actually been set address := config.GetDbAddress() if address == "" { @@ -352,7 +352,7 @@ func sqliteConn(ctx context.Context, state *state.State) (*bun.DB, error) { // ping to check the db is there and listening if err := db.PingContext(ctx); err != nil { - err = processSQLiteError(err) // this adds error code information + err = processSQLiteError(err) // adds error code return nil, fmt.Errorf("sqlite ping: %w", err) } log.Infof(ctx, "connected to SQLITE database with address %s", address) @@ -515,7 +515,7 @@ func buildSQLiteAddress(addr string) string { // use immediate transaction lock mode to fail quickly if tx can't lock // see https://pkg.go.dev/modernc.org/sqlite#Driver.Open - prefs.Add("_txlock", "immediate") + // prefs.Add("_txlock", "immediate") if addr == ":memory:" { log.Warn(nil, "using sqlite in-memory mode; all data will be deleted when gts shuts down; this mode should only be used for debugging or running tests") @@ -526,14 +526,8 @@ func buildSQLiteAddress(addr string) string { // in-mem-specific preferences // (shared cache so that tests don't fail) - prefs.Add("mode", "memory") - prefs.Add("cache", "shared") - } - - if dur := config.GetDbSqliteBusyTimeout(); dur > 0 { - // Set the user provided SQLite busy timeout - // NOTE: MUST BE SET BEFORE THE JOURNAL MODE. - prefs.Add("_pragma", fmt.Sprintf("busy_timeout(%d)", dur.Milliseconds())) + // prefs.Add("mode", "memory") + // prefs.Add("cache", "shared") } if mode := config.GetDbSqliteJournalMode(); mode != "" { diff --git a/internal/db/bundb/drivers.go b/internal/db/bundb/drivers.go index 5a19109df..91e4fc5df 100644 --- a/internal/db/bundb/drivers.go +++ b/internal/db/bundb/drivers.go @@ -42,18 +42,8 @@ var ( // global SQLite3 driver instance. sqliteDriver = &sqlite.Driver{ Init: func(c *sqlite3.Conn) error { - return c.BusyHandler(func(ctx context.Context, i int) (retry bool) { - backoff := 2 * time.Millisecond * (1 << (2*i + 1)) - if backoff > 5*time.Minute { - return false - } - select { - case <-ctx.Done(): - return false - case <-time.After(backoff): - return true - } - }) + // unset an busy handler. + return c.BusyHandler(nil) }, } @@ -268,9 +258,6 @@ func (c *SQLiteConn) QueryContext(ctx context.Context, query string, args []driv return err }) if err != nil { - if rows != nil { - _ = rows.Close() - } return nil, err } return &SQLiteTmpStmtRows{ @@ -286,7 +273,7 @@ func (c *SQLiteConn) Close() (err error) { // see: https://www.sqlite.org/pragma.html#pragma_optimize const onClose = "PRAGMA analysis_limit=1000; PRAGMA optimize;" if r, ok := c.ConnIface.(sqlite3.DriverConn); ok { - _ = r.Raw().Exec(onClose) // perform ASAP + _ = r.Raw().Exec(onClose) _ = r.Raw().Close() } return @@ -295,6 +282,7 @@ func (c *SQLiteConn) Close() (err error) { type SQLiteTx struct{ driver.Tx } func (tx *SQLiteTx) Commit() (err error) { + // use background ctx as this commit MUST happen. return retryOnBusy(context.Background(), func() error { err = tx.Tx.Commit() err = processSQLiteError(err) @@ -303,6 +291,7 @@ func (tx *SQLiteTx) Commit() (err error) { } func (tx *SQLiteTx) Rollback() (err error) { + // use background ctx as this rollback MUST happen. return retryOnBusy(context.Background(), func() error { err = tx.Tx.Rollback() err = processSQLiteError(err) @@ -345,6 +334,7 @@ func (stmt *SQLiteStmt) QueryContext(ctx context.Context, args []driver.NamedVal } func (stmt *SQLiteStmt) Close() (err error) { + // use background ctx as this stmt MUST be closed. err = retryOnBusy(context.Background(), func() error { err = stmt.StmtIface.Close() err = processSQLiteError(err) @@ -368,6 +358,7 @@ func (r *SQLiteRows) Next(dest []driver.Value) (err error) { } func (r *SQLiteRows) Close() (err error) { + // use background ctx as these rows MUST be closed. err = retryOnBusy(context.Background(), func() error { err = r.RowsIface.Close() err = processSQLiteError(err) diff --git a/internal/db/bundb/errors.go b/internal/db/bundb/errors.go index ecd399a46..60345e05d 100644 --- a/internal/db/bundb/errors.go +++ b/internal/db/bundb/errors.go @@ -32,11 +32,6 @@ var errBusy = errors.New("busy") // processPostgresError processes an error, replacing any postgres specific errors with our own error type func processPostgresError(err error) error { - // Catch nil errs. - if err == nil { - return nil - } - // Attempt to cast as postgres pgErr, ok := err.(*pgconn.PgError) if !ok { @@ -50,7 +45,9 @@ func processPostgresError(err error) error { return db.ErrAlreadyExists } - return err + // Wrap the returned error with the code and + // extended code for easier debugging later. + return fmt.Errorf("%w (code=%s)", err, pgErr.Code) } func processSQLiteError(err error) error {