From 016923b4dc0575c92eb0507a5c527f3183ec52f1 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Thu, 7 Mar 2024 13:56:33 +0000 Subject: [PATCH] [bugfix] add workaround for Xsqlite_interrupt() permanently breaking connection (#2731) --- internal/db/bundb/errors.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/internal/db/bundb/errors.go b/internal/db/bundb/errors.go index c8f39aebd..ddbb302f8 100644 --- a/internal/db/bundb/errors.go +++ b/internal/db/bundb/errors.go @@ -18,6 +18,7 @@ package bundb import ( + "database/sql/driver" "errors" "github.com/jackc/pgx/v5/pgconn" @@ -75,6 +76,27 @@ func processSQLiteError(err error) error { return errBusy case sqlite3.SQLITE_BUSY_TIMEOUT: return db.ErrBusyTimeout + + // WORKAROUND: + // text copied from matrix dev chat: + // + // okay i've found a workaround for now. so between + // v1.29.0 and v1.29.2 (modernc.org/sqlite) is that + // slightly tweaked interruptOnDone() behaviour, which + // causes interrupt to (imo, correctly) get called when + // a context is cancelled to cancel the running query. the + // issue is that every single query after that point seems + // to still then return interrupted. so as you thought, + // maybe that query count isn't being decremented. i don't + // think it's our code, but i haven't ruled it out yet. + // + // the workaround for now is adding to our sqlite error + // processor to replace an SQLITE_INTERRUPTED code with + // driver.ErrBadConn, which hints to the golang sql package + // that the conn needs to be closed and a new one opened + // + case sqlite3.SQLITE_INTERRUPT: + return driver.ErrBadConn } return err