mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 21:04:37 +03:00
Add write mutex and max connection lifetime (#1211)
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user