From e7278a9df685503feedc8250d9c374725a2c1445 Mon Sep 17 00:00:00 2001 From: gfanton <8671905+gfanton@users.noreply.github.com> Date: Tue, 16 May 2023 09:55:01 +0200 Subject: [PATCH] fix: use SetMaxOpenConns to fix `database is close` issue fixes error "database is locked", caused by concurrent access from deal goroutines to a single sqlite3 db connection see: https://github.com/mattn/go-sqlite3#:~:text=Error%3A%20database%20is%20locked see: https://github.com/filecoin-project/boost/pull/657 Signed-off-by: gfanton <8671905+gfanton@users.noreply.github.com> --- go/internal/accountutils/utils.go | 12 ++++++++---- go/internal/messengerdb/db.go | 2 +- go/internal/messengerdb/db_test_utils.go | 2 ++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/go/internal/accountutils/utils.go b/go/internal/accountutils/utils.go index 3e687f91b9..4162c5efa5 100644 --- a/go/internal/accountutils/utils.go +++ b/go/internal/accountutils/utils.go @@ -332,10 +332,14 @@ func GetGormDBForPath(dbPath string, key []byte, salt []byte, logger *zap.Logger return nil, nil, errcode.TODO.Wrap(err) } + sqlDB, err := db.DB() + if err != nil { + return nil, nil, fmt.Errorf("unable to gorm underlying db: %w", err) + } + + sqlDB.SetMaxOpenConns(1) + return db, func() { - sqlDB, _ := db.DB() - if sqlDB != nil { - sqlDB.Close() - } + _ = sqlDB.Close() }, nil } diff --git a/go/internal/messengerdb/db.go b/go/internal/messengerdb/db.go index 9147a15a02..28664fa950 100644 --- a/go/internal/messengerdb/db.go +++ b/go/internal/messengerdb/db.go @@ -1758,7 +1758,7 @@ func (d *DBWrapper) MarkAccountDirectoryServiceRecordAsRevoked(serverAddr string return d.db.Transaction(func(tx *gorm.DB) error { record := &messengertypes.AccountDirectoryServiceRecord{} - query := d.db.Model(&messengertypes.AccountDirectoryServiceRecord{}).Where(record, &messengertypes.AccountDirectoryServiceRecord{ + query := tx.Model(&messengertypes.AccountDirectoryServiceRecord{}).Where(record, &messengertypes.AccountDirectoryServiceRecord{ ServerAddr: serverAddr, DirectoryRecordToken: token, }, "expiration_date <= ?", removalDate).Update("revoked", true) diff --git a/go/internal/messengerdb/db_test_utils.go b/go/internal/messengerdb/db_test_utils.go index 7d1e21717d..ed1f14bdc0 100644 --- a/go/internal/messengerdb/db_test_utils.go +++ b/go/internal/messengerdb/db_test_utils.go @@ -68,6 +68,8 @@ func GetInMemoryTestDB(t testing.TB, opts ...GetInMemoryTestDBOpts) (*DBWrapper, t.Fatal(err) } + d.SetMaxOpenConns(1) + return wrappedDB, db, func() { _ = d.Close() loggerCleanup()