From 1e39e3758e60cd55f369c708a825049c42681b2a Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Wed, 23 Oct 2024 10:09:27 +0200 Subject: [PATCH 1/6] build: apply log type flags in NewDefaultLogHandlers So that the logging config "Disable" options and log type flags are all handled in one place. Other repo's can then re-use this nicely. --- build/handlers.go | 21 ++++++++++++++++++--- config.go | 25 +++---------------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/build/handlers.go b/build/handlers.go index 9ffbdd70a..00c4e0ace 100644 --- a/build/handlers.go +++ b/build/handlers.go @@ -9,8 +9,10 @@ import ( // NewDefaultLogHandlers returns the standard console logger and rotating log // writer handlers that we generally want to use. It also applies the various // config options to the loggers. -func NewDefaultLogHandlers(cfg *LogConfig, rotator *RotatingLogWriter) ( - btclog.Handler, btclog.Handler) { +func NewDefaultLogHandlers(cfg *LogConfig, + rotator *RotatingLogWriter) []btclog.Handler { + + var handlers []btclog.Handler consoleLogHandler := btclog.NewDefaultHandler( os.Stdout, cfg.Console.HandlerOptions()..., @@ -19,5 +21,18 @@ func NewDefaultLogHandlers(cfg *LogConfig, rotator *RotatingLogWriter) ( rotator, cfg.File.HandlerOptions()..., ) - return consoleLogHandler, logFileHandler + maybeAddLogger := func(cmdOptionDisable bool, handler btclog.Handler) { + if !cmdOptionDisable { + handlers = append(handlers, handler) + } + } + switch LoggingType { + case LogTypeStdOut: + maybeAddLogger(cfg.Console.Disable, consoleLogHandler) + case LogTypeDefault: + maybeAddLogger(cfg.Console.Disable, consoleLogHandler) + maybeAddLogger(cfg.File.Disable, logFileHandler) + } + + return handlers } diff --git a/config.go b/config.go index a427e4c7d..c8991cf60 100644 --- a/config.go +++ b/config.go @@ -21,7 +21,6 @@ import ( "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btclog/v2" flags "github.com/jessevdk/go-flags" "github.com/lightninglabs/neutrino" "github.com/lightningnetwork/lnd/autopilot" @@ -1404,32 +1403,14 @@ func ValidateConfig(cfg Config, interceptor signal.Interceptor, fileParser, lncfg.NormalizeNetwork(cfg.ActiveNetParams.Name), ) - var ( - logCfg = cfg.LogConfig - logHandlers []btclog.Handler - consoleLogHandler, logFileHandler = build.NewDefaultLogHandlers( - logCfg, cfg.LogRotator, - ) - ) - maybeAddLogger := func(cmdOptionDisable bool, handler btclog.Handler) { - if !cmdOptionDisable { - logHandlers = append(logHandlers, handler) - } - } - switch build.LoggingType { - case build.LogTypeStdOut: - maybeAddLogger(logCfg.Console.Disable, consoleLogHandler) - case build.LogTypeDefault: - maybeAddLogger(logCfg.Console.Disable, consoleLogHandler) - maybeAddLogger(logCfg.File.Disable, logFileHandler) - } - if !build.SuportedLogCompressor(cfg.LogCompressor) { return nil, mkErr("invalid log compressor: %v", cfg.LogCompressor) } - cfg.SubLogMgr = build.NewSubLoggerManager(logHandlers...) + cfg.SubLogMgr = build.NewSubLoggerManager(build.NewDefaultLogHandlers( + cfg.LogConfig, cfg.LogRotator, + )...) // Initialize logging at the default logging level. SetupLoggers(cfg.SubLogMgr, interceptor) From de358667f3539e438bc57db5f40fe3478fb70699 Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Wed, 23 Oct 2024 10:11:43 +0200 Subject: [PATCH 2/6] healthcheck: bump btclog dep --- healthcheck/go.mod | 7 ++++--- healthcheck/go.sum | 5 ++++- healthcheck/log.go | 4 +--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/healthcheck/go.mod b/healthcheck/go.mod index 4ccd729bf..d07cc4dc2 100644 --- a/healthcheck/go.mod +++ b/healthcheck/go.mod @@ -1,9 +1,7 @@ module github.com/lightningnetwork/lnd/healthcheck -go 1.19 - require ( - github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f + github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 github.com/lightningnetwork/lnd/ticker v1.1.0 github.com/lightningnetwork/lnd/tor v1.0.0 github.com/stretchr/testify v1.8.2 @@ -13,6 +11,7 @@ require ( require ( github.com/btcsuite/btcd v0.23.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.3.0 // indirect github.com/miekg/dns v1.1.43 // indirect @@ -24,3 +23,5 @@ require ( gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +go 1.21 diff --git a/healthcheck/go.sum b/healthcheck/go.sum index 00ae4f359..d986d3f54 100644 --- a/healthcheck/go.sum +++ b/healthcheck/go.sum @@ -9,8 +9,11 @@ github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9Ur github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c h1:4HxD1lBUGUddhzgaNgrCPsFWd7cGYNpeFUgd9ZIgyM0= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 h1:3Ct3zN3VCEKVm5nceWBBEKczc+jvTfVyOEG71ob2Yuc= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7/go.mod h1:XItGUfVOxotJL8kkuk2Hj3EVow5KCugXl3wWfQ6K0AE= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= diff --git a/healthcheck/log.go b/healthcheck/log.go index 8c8f71c63..18a405c45 100644 --- a/healthcheck/log.go +++ b/healthcheck/log.go @@ -1,8 +1,6 @@ package healthcheck -import ( - "github.com/btcsuite/btclog" -) +import "github.com/btcsuite/btclog/v2" // Subsystem defines the logging code for this subsystem. const Subsystem = "HLCK" From a6e68cb6b8c5758efe2df9be9acd32f230c27b30 Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Wed, 23 Oct 2024 10:12:24 +0200 Subject: [PATCH 3/6] kvdb: update btclog dep --- kvdb/go.mod | 3 ++- kvdb/go.sum | 5 ++++- kvdb/log.go | 2 +- kvdb/sqlbase/log.go | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/kvdb/go.mod b/kvdb/go.mod index c52086a84..3dc428164 100644 --- a/kvdb/go.mod +++ b/kvdb/go.mod @@ -1,7 +1,7 @@ module github.com/lightningnetwork/lnd/kvdb require ( - github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f + github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 github.com/btcsuite/btcwallet/walletdb v1.4.4 github.com/davecgh/go-spew v1.1.1 github.com/fergusstrange/embedded-postgres v1.25.0 @@ -26,6 +26,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd v0.23.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/containerd/continuity v0.3.0 // indirect diff --git a/kvdb/go.sum b/kvdb/go.sum index 71fd6889b..329dd2497 100644 --- a/kvdb/go.sum +++ b/kvdb/go.sum @@ -37,8 +37,11 @@ github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9Ur github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c h1:4HxD1lBUGUddhzgaNgrCPsFWd7cGYNpeFUgd9ZIgyM0= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 h1:3Ct3zN3VCEKVm5nceWBBEKczc+jvTfVyOEG71ob2Yuc= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7/go.mod h1:XItGUfVOxotJL8kkuk2Hj3EVow5KCugXl3wWfQ6K0AE= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcwallet/walletdb v1.4.4 h1:BDel6iT/ltYSIYKs0YbjwnEDi7xR3yzABIsQxN2F1L8= github.com/btcsuite/btcwallet/walletdb v1.4.4/go.mod h1:jk/hvpLFINF0C1kfTn0bfx2GbnFT+Nvnj6eblZALfjs= diff --git a/kvdb/log.go b/kvdb/log.go index 824715432..5722bdade 100644 --- a/kvdb/log.go +++ b/kvdb/log.go @@ -1,7 +1,7 @@ package kvdb import ( - "github.com/btcsuite/btclog" + "github.com/btcsuite/btclog/v2" "github.com/lightningnetwork/lnd/kvdb/sqlbase" ) diff --git a/kvdb/sqlbase/log.go b/kvdb/sqlbase/log.go index c6cbe6577..3f4e99bdd 100644 --- a/kvdb/sqlbase/log.go +++ b/kvdb/sqlbase/log.go @@ -1,6 +1,6 @@ package sqlbase -import "github.com/btcsuite/btclog" +import "github.com/btcsuite/btclog/v2" // log is a logger that is initialized as disabled. This means the package will // not perform any logging by default until a logger is set. From 83751ee20853b48108741e0b8f1ade468be10be1 Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Wed, 23 Oct 2024 10:15:06 +0200 Subject: [PATCH 4/6] sqldb: update btclog dep --- sqldb/go.mod | 7 ++++--- sqldb/go.sum | 6 ++++-- sqldb/log.go | 4 +--- sqldb/migrations.go | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/sqldb/go.mod b/sqldb/go.mod index 8fbfeeeea..203902ecd 100644 --- a/sqldb/go.mod +++ b/sqldb/go.mod @@ -1,9 +1,7 @@ module github.com/lightningnetwork/lnd/sqldb -go 1.21.4 - require ( - github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f + github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 github.com/golang-migrate/migrate/v4 v4.17.0 github.com/jackc/pgconn v1.14.3 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 @@ -18,6 +16,7 @@ require ( github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect + github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -68,3 +67,5 @@ require ( modernc.org/strutil v1.2.0 // indirect modernc.org/token v1.1.0 // indirect ) + +go 1.21.4 diff --git a/sqldb/go.sum b/sqldb/go.sum index ffcf7ac56..8a093dc49 100644 --- a/sqldb/go.sum +++ b/sqldb/go.sum @@ -5,8 +5,10 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c h1:4HxD1lBUGUddhzgaNgrCPsFWd7cGYNpeFUgd9ZIgyM0= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 h1:3Ct3zN3VCEKVm5nceWBBEKczc+jvTfVyOEG71ob2Yuc= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7/go.mod h1:XItGUfVOxotJL8kkuk2Hj3EVow5KCugXl3wWfQ6K0AE= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= diff --git a/sqldb/log.go b/sqldb/log.go index ab985b28d..a374ee29b 100644 --- a/sqldb/log.go +++ b/sqldb/log.go @@ -1,8 +1,6 @@ package sqldb -import ( - "github.com/btcsuite/btclog" -) +import "github.com/btcsuite/btclog/v2" // Subsystem defines the logging code for this subsystem. const Subsystem = "SQLD" diff --git a/sqldb/migrations.go b/sqldb/migrations.go index 31319cec8..9d394ceed 100644 --- a/sqldb/migrations.go +++ b/sqldb/migrations.go @@ -8,7 +8,7 @@ import ( "net/http" "strings" - "github.com/btcsuite/btclog" + "github.com/btcsuite/btclog/v2" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/source/httpfs" From a03d5fcb9e117135cc0a0ae2c352286b9e0a9b8b Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Wed, 23 Oct 2024 10:17:12 +0200 Subject: [PATCH 5/6] tor: update btclog dep --- tor/go.mod | 5 +++-- tor/go.sum | 6 ++++-- tor/log.go | 4 +--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tor/go.mod b/tor/go.mod index c8be6f2af..798e90d68 100644 --- a/tor/go.mod +++ b/tor/go.mod @@ -2,7 +2,7 @@ module github.com/lightningnetwork/lnd/tor require ( github.com/btcsuite/btcd v0.23.3 - github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f + github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 github.com/miekg/dns v1.1.43 github.com/stretchr/testify v1.8.2 golang.org/x/net v0.17.0 @@ -10,6 +10,7 @@ require ( require ( github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/kr/pretty v0.3.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -22,4 +23,4 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -go 1.19 +go 1.21 diff --git a/tor/go.sum b/tor/go.sum index 48c4953c0..cb0b4ffad 100644 --- a/tor/go.sum +++ b/tor/go.sum @@ -2,8 +2,10 @@ github.com/btcsuite/btcd v0.23.3 h1:4KH/JKy9WiCd+iUS9Mu0Zp7Dnj17TGdKrg9xc/FGj24= github.com/btcsuite/btcd v0.23.3/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c h1:4HxD1lBUGUddhzgaNgrCPsFWd7cGYNpeFUgd9ZIgyM0= +github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7 h1:3Ct3zN3VCEKVm5nceWBBEKczc+jvTfVyOEG71ob2Yuc= +github.com/btcsuite/btclog/v2 v2.0.0-20241017175713-3428138b75c7/go.mod h1:XItGUfVOxotJL8kkuk2Hj3EVow5KCugXl3wWfQ6K0AE= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/tor/log.go b/tor/log.go index 9fe5b8aab..b638091be 100644 --- a/tor/log.go +++ b/tor/log.go @@ -1,8 +1,6 @@ package tor -import ( - "github.com/btcsuite/btclog" -) +import "github.com/btcsuite/btclog/v2" // Subsystem defines the logging code for this subsystem. const Subsystem = "TORC" // TORC as in Tor Controller. From 67419a7c0c6410761ee369c1d24aba8641b8e400 Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Mon, 28 Oct 2024 09:35:18 +0200 Subject: [PATCH 6/6] Revert "kvdb/postgres: remove global application level lock" This reverts commit 43a1ca4f3d70876ae7cad57fdb7a09704ae21a3e. --- kvdb/postgres/db.go | 1 + kvdb/sqlbase/db.go | 8 +++++++ kvdb/sqlbase/readwrite_tx.go | 44 ++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/kvdb/postgres/db.go b/kvdb/postgres/db.go index 425ba1622..90ca8324a 100644 --- a/kvdb/postgres/db.go +++ b/kvdb/postgres/db.go @@ -28,6 +28,7 @@ func newPostgresBackend(ctx context.Context, config *Config, prefix string) ( Schema: "public", TableNamePrefix: prefix, SQLiteCmdReplacements: sqliteCmdReplacements, + WithTxLevelLock: true, } return sqlbase.NewSqlBackend(ctx, cfg) diff --git a/kvdb/sqlbase/db.go b/kvdb/sqlbase/db.go index 6ef085712..221a77bfd 100644 --- a/kvdb/sqlbase/db.go +++ b/kvdb/sqlbase/db.go @@ -55,6 +55,10 @@ type Config struct { // commands. Note that the sqlite keywords to be replaced are // case-sensitive. SQLiteCmdReplacements SQLiteCmdReplacements + + // WithTxLevelLock when set will ensure that there is a transaction + // level lock. + WithTxLevelLock bool } // db holds a reference to the sql db connection. @@ -75,6 +79,10 @@ type db struct { // db is the underlying database connection instance. db *sql.DB + // lock is the global write lock that ensures single writer. This is + // only used if cfg.WithTxLevelLock is set. + lock sync.RWMutex + // table is the name of the table that contains the data for all // top-level buckets that have keys that cannot be mapped to a distinct // sql table. diff --git a/kvdb/sqlbase/readwrite_tx.go b/kvdb/sqlbase/readwrite_tx.go index 18a6a682c..ec761931a 100644 --- a/kvdb/sqlbase/readwrite_tx.go +++ b/kvdb/sqlbase/readwrite_tx.go @@ -5,6 +5,7 @@ package sqlbase import ( "context" "database/sql" + "sync" "github.com/btcsuite/btcwallet/walletdb" ) @@ -19,11 +20,28 @@ type readWriteTx struct { // active is true if the transaction hasn't been committed yet. active bool + + // locker is a pointer to the global db lock. + locker sync.Locker } // newReadWriteTx creates an rw transaction using a connection from the // specified pool. func newReadWriteTx(db *db, readOnly bool) (*readWriteTx, error) { + locker := newNoopLocker() + if db.cfg.WithTxLevelLock { + // Obtain the global lock instance. An alternative here is to + // obtain a database lock from Postgres. Unfortunately there is + // no database-level lock in Postgres, meaning that each table + // would need to be locked individually. Perhaps an advisory + // lock could perform this function too. + locker = &db.lock + if readOnly { + locker = db.lock.RLocker() + } + } + locker.Lock() + // Start the transaction. Don't use the timeout context because it would // be applied to the transaction as a whole. If possible, mark the // transaction as read-only to make sure that potential programming @@ -36,6 +54,7 @@ func newReadWriteTx(db *db, readOnly bool) (*readWriteTx, error) { }, ) if err != nil { + locker.Unlock() return nil, err } @@ -43,6 +62,7 @@ func newReadWriteTx(db *db, readOnly bool) (*readWriteTx, error) { db: db, tx: tx, active: true, + locker: locker, }, nil } @@ -74,6 +94,7 @@ func (tx *readWriteTx) Rollback() error { // Unlock the transaction regardless of the error result. tx.active = false + tx.locker.Unlock() return err } @@ -141,6 +162,7 @@ func (tx *readWriteTx) Commit() error { // Unlock the transaction regardless of the error result. tx.active = false + tx.locker.Unlock() return err } @@ -182,3 +204,25 @@ func (tx *readWriteTx) Exec(query string, args ...interface{}) (sql.Result, return tx.tx.ExecContext(ctx, query, args...) } + +// noopLocker is an implementation of a no-op sync.Locker. +type noopLocker struct{} + +// newNoopLocker creates a new noopLocker. +func newNoopLocker() sync.Locker { + return &noopLocker{} +} + +// Lock is a noop. +// +// NOTE: this is part of the sync.Locker interface. +func (n *noopLocker) Lock() { +} + +// Unlock is a noop. +// +// NOTE: this is part of the sync.Locker interface. +func (n *noopLocker) Unlock() { +} + +var _ sync.Locker = (*noopLocker)(nil)