Add write mutex and max connection lifetime (#1211)

This commit is contained in:
WithoutPants
2021-03-18 21:45:01 +11:00
committed by GitHub
parent 215737d6c5
commit d93011a828
2 changed files with 7 additions and 5 deletions

View File

@@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"os" "os"
"sync"
"time" "time"
"github.com/fvbommel/sortorder" "github.com/fvbommel/sortorder"
@@ -20,6 +21,7 @@ import (
) )
var DB *sqlx.DB var DB *sqlx.DB
var WriteMu *sync.Mutex
var dbPath string var dbPath string
var appSchemaVersion uint = 19 var appSchemaVersion uint = 19
var databaseSchemaVersion uint var databaseSchemaVersion uint
@@ -63,6 +65,7 @@ func Initialize(databasePath string) bool {
const disableForeignKeys = false const disableForeignKeys = false
DB = open(databasePath, disableForeignKeys) DB = open(databasePath, disableForeignKeys)
WriteMu = &sync.Mutex{}
return false return false
} }
@@ -77,6 +80,7 @@ func open(databasePath string, disableForeignKeys bool) *sqlx.DB {
conn, err := sqlx.Open(sqlite3Driver, url) conn, err := sqlx.Open(sqlite3Driver, url)
conn.SetMaxOpenConns(25) conn.SetMaxOpenConns(25)
conn.SetMaxIdleConns(4) conn.SetMaxIdleConns(4)
conn.SetConnMaxLifetime(30 * time.Second)
if err != nil { if err != nil {
logger.Fatalf("db.Open(): %q\n", err) logger.Fatalf("db.Open(): %q\n", err)
} }

View File

@@ -176,17 +176,15 @@ func (t *ReadTransaction) Tag() models.TagReader {
} }
type TransactionManager struct { type TransactionManager struct {
// only allow one write transaction at a time
c chan struct{}
} }
func NewTransactionManager() *TransactionManager { func NewTransactionManager() *TransactionManager {
return &TransactionManager{ return &TransactionManager{}
c: make(chan struct{}, 1),
}
} }
func (t *TransactionManager) WithTxn(ctx context.Context, fn func(r models.Repository) error) error { func (t *TransactionManager) WithTxn(ctx context.Context, fn func(r models.Repository) error) error {
database.WriteMu.Lock()
defer database.WriteMu.Unlock()
return models.WithTxn(&transaction{Ctx: ctx}, fn) return models.WithTxn(&transaction{Ctx: ctx}, fn)
} }