Added check for attempting to acquire global lock

This commit is contained in:
2025-02-18 10:37:57 +11:00
parent c2de8d254a
commit 38d47cdf63

View File

@@ -13,10 +13,11 @@ import (
) )
type SafeConn struct { type SafeConn struct {
db *sql.DB db *sql.DB
readLockCount uint32 readLockCount uint32
globalLockStatus uint32 globalLockStatus uint32
logger *zerolog.Logger globalLockRequested uint32
logger *zerolog.Logger
} }
func MakeSafe(db *sql.DB, logger *zerolog.Logger) *SafeConn { func MakeSafe(db *sql.DB, logger *zerolog.Logger) *SafeConn {
@@ -46,7 +47,7 @@ func (conn *SafeConn) releaseGlobalLock() {
} }
func (conn *SafeConn) acquireReadLock() bool { func (conn *SafeConn) acquireReadLock() bool {
if conn.globalLockStatus == 1 { if conn.globalLockStatus == 1 || conn.globalLockRequested == 1 {
return false return false
} }
conn.readLockCount += 1 conn.readLockCount += 1
@@ -142,6 +143,7 @@ func (stx *SafeTX) Rollback() error {
// Pause blocks new transactions for a backup. // Pause blocks new transactions for a backup.
func (conn *SafeConn) Pause() { func (conn *SafeConn) Pause() {
conn.globalLockRequested = 1
for !conn.acquireGlobalLock() { for !conn.acquireGlobalLock() {
// TODO: add a timeout? // TODO: add a timeout?
// TODO: failed to acquire lock: print info with readLockCount // TODO: failed to acquire lock: print info with readLockCount
@@ -150,6 +152,7 @@ func (conn *SafeConn) Pause() {
// force logger to log to Stdout // force logger to log to Stdout
log := conn.logger.With().Logger().Output(os.Stdout) log := conn.logger.With().Logger().Output(os.Stdout)
log.Info().Msg("Global database lock acquired") log.Info().Msg("Global database lock acquired")
conn.globalLockRequested = 0
} }
// Resume allows transactions to proceed. // Resume allows transactions to proceed.