44package collector
55
66import (
7+ "context"
78 "database/sql"
89 "fmt"
910 "github.com/godror/godror"
@@ -64,7 +65,6 @@ func (d *Database) constLabels() map[string]string {
6465
6566func NewDatabase (logger * slog.Logger , dbname string , dbconfig DatabaseConfig ) * Database {
6667 db , dbtype := connect (logger , dbname , dbconfig )
67-
6868 return & Database {
6969 Name : dbname ,
7070 Up : 0 ,
@@ -74,6 +74,42 @@ func NewDatabase(logger *slog.Logger, dbname string, dbconfig DatabaseConfig) *D
7474 }
7575}
7676
77+ // WarmupConnectionPool serially acquires connections to "warm up" the connection pool.
78+ // This is a workaround for a perceived bug in ODPI_C where rapid acquisition of connections
79+ // results in a SIGABRT.
80+ func (d * Database ) WarmupConnectionPool (logger * slog.Logger ) {
81+ var connections []* sql.Conn
82+ poolSize := d .Config .GetMaxOpenConns ()
83+ if poolSize < 1 {
84+ poolSize = d .Config .GetPoolMaxConnections ()
85+ }
86+ if poolSize > 100 { // defensively cap poolsize
87+ poolSize = 100
88+ }
89+ warmup := func (i int ) {
90+ time .Sleep (100 * time .Millisecond )
91+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
92+ defer cancel ()
93+
94+ conn , err := d .Session .Conn (ctx )
95+ if err != nil {
96+ logger .Debug ("Failed to open database connection on warmup" , "conn" , i , "error" , err , "database" , d .Name )
97+ return
98+ }
99+ connections = append (connections , conn )
100+ }
101+ for i := 0 ; i < poolSize ; i ++ {
102+ warmup (i + 1 )
103+ }
104+
105+ logger .Debug ("Warmed connection pool" , "total" , len (connections ), "database" , d .Name )
106+ for i , conn := range connections {
107+ if err := conn .Close (); err != nil {
108+ logger .Debug ("Failed to return database connection to pool on warmup" , "conn" , i + 1 , "error" , err , "database" , d .Name )
109+ }
110+ }
111+ }
112+
77113func connect (logger * slog.Logger , dbname string , dbconfig DatabaseConfig ) (* sql.DB , float64 ) {
78114 logger .Debug ("Launching connection to " + maskDsn (dbconfig .URL ), "database" , dbname )
79115
0 commit comments