mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-03-06 10:22:08 +01:00
In this commit, we remove the global application level lock from the postgres backend. This lock prevents multiple write transactions from happening at the same time, and will also block a writer if a read is on going. Since this lock was added, we know always open DB connections with the strongest level of concurrency control available: `LevelSerializable`. In concert with the new auto retry logic, we ensure that if db transactions conflict (writing the same key/row in this case), then the tx is retried automatically. Removing this lock should increase perf for the postgres backend, as now concurrent write transactions can proceed, being serialized as needed. Rather then trying to handle concurrency at the application level, we'll set postgres do its job, with the application only needing to retry as necessary.
34 lines
972 B
Go
34 lines
972 B
Go
//go:build kvdb_postgres
|
|
|
|
package postgres
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/btcsuite/btcwallet/walletdb"
|
|
"github.com/lightningnetwork/lnd/kvdb/sqlbase"
|
|
)
|
|
|
|
// sqliteCmdReplacements defines a mapping from some SQLite keywords and phrases
|
|
// to their postgres counterparts.
|
|
var sqliteCmdReplacements = sqlbase.SQLiteCmdReplacements{
|
|
"BLOB": "BYTEA",
|
|
"INTEGER PRIMARY KEY": "BIGSERIAL PRIMARY KEY",
|
|
}
|
|
|
|
// newPostgresBackend returns a db object initialized with the passed backend
|
|
// config. If postgres connection cannot be established, then returns error.
|
|
func newPostgresBackend(ctx context.Context, config *Config, prefix string) (
|
|
walletdb.DB, error) {
|
|
|
|
cfg := &sqlbase.Config{
|
|
DriverName: "pgx",
|
|
Dsn: config.Dsn,
|
|
Timeout: config.Timeout,
|
|
Schema: "public",
|
|
TableNamePrefix: prefix,
|
|
SQLiteCmdReplacements: sqliteCmdReplacements,
|
|
}
|
|
|
|
return sqlbase.NewSqlBackend(ctx, cfg)
|
|
}
|