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