X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9828e9218084856240fdeafa2d388d8bf322e655..09cbdc3074b3f1e69c9c537875146f6da0a6ed8f:/lib/ctrlctx/db.go diff --git a/lib/ctrlctx/db.go b/lib/ctrlctx/db.go index a764208606..2a05096ce1 100644 --- a/lib/ctrlctx/db.go +++ b/lib/ctrlctx/db.go @@ -10,6 +10,7 @@ import ( "sync" "git.arvados.org/arvados.git/lib/controller/api" + "git.arvados.org/arvados.git/sdk/go/arvados" "git.arvados.org/arvados.git/sdk/go/ctxlog" "github.com/jmoiron/sqlx" @@ -142,3 +143,33 @@ func CurrentTx(ctx context.Context) (*sqlx.Tx, error) { }) return txn.tx, txn.err } + +var errDBConnection = errors.New("database connection error") + +type DBConnector struct { + PostgreSQL arvados.PostgreSQL + pgdb *sqlx.DB + mtx sync.Mutex +} + +func (dbc *DBConnector) GetDB(ctx context.Context) (*sqlx.DB, error) { + dbc.mtx.Lock() + defer dbc.mtx.Unlock() + if dbc.pgdb != nil { + return dbc.pgdb, nil + } + db, err := sqlx.Open("postgres", dbc.PostgreSQL.Connection.String()) + if err != nil { + ctxlog.FromContext(ctx).WithError(err).Error("postgresql connect failed") + return nil, errDBConnection + } + if p := dbc.PostgreSQL.ConnectionPool; p > 0 { + db.SetMaxOpenConns(p) + } + if err := db.Ping(); err != nil { + ctxlog.FromContext(ctx).WithError(err).Error("postgresql connect succeeded but ping failed") + return nil, errDBConnection + } + dbc.pgdb = db + return db, nil +}