@@ -71,6 +71,9 @@ pub struct General {
7171 /// Shutdown timeout.
7272 #[ serde( default = "General::default_shutdown_timeout" ) ]
7373 pub shutdown_timeout : u64 ,
74+ /// Shutdown termination timeout (after shutdown_timeout expires, forcibly terminate).
75+ #[ serde( default = "General::default_shutdown_termination_timeout" ) ]
76+ pub shutdown_termination_timeout : Option < u64 > ,
7477 /// Broadcast IP.
7578 pub broadcast_address : Option < Ipv4Addr > ,
7679 /// Broadcast port.
@@ -179,6 +182,7 @@ impl Default for General {
179182 tls_verify : Self :: default_tls_verify ( ) ,
180183 tls_server_ca_certificate : Self :: tls_server_ca_certificate ( ) ,
181184 shutdown_timeout : Self :: default_shutdown_timeout ( ) ,
185+ shutdown_termination_timeout : Self :: default_shutdown_termination_timeout ( ) ,
182186 broadcast_address : Self :: broadcast_address ( ) ,
183187 broadcast_port : Self :: broadcast_port ( ) ,
184188 query_log : Self :: query_log ( ) ,
@@ -353,6 +357,10 @@ impl General {
353357 Self :: env_or_default ( "PGDOG_SHUTDOWN_TIMEOUT" , 60_000 )
354358 }
355359
360+ fn default_shutdown_termination_timeout ( ) -> Option < u64 > {
361+ Self :: env_option ( "PGDOG_SHUTDOWN_TERMINATION_TIMEOUT" )
362+ }
363+
356364 fn default_connect_timeout ( ) -> u64 {
357365 Self :: env_or_default ( "PGDOG_CONNECT_TIMEOUT" , 5_000 )
358366 }
@@ -497,6 +505,10 @@ impl General {
497505 Duration :: from_millis ( self . shutdown_timeout )
498506 }
499507
508+ pub fn shutdown_termination_timeout ( & self ) -> Option < Duration > {
509+ self . shutdown_termination_timeout . map ( Duration :: from_millis)
510+ }
511+
500512 /// Get TLS config, if any.
501513 pub fn tls ( & self ) -> Option < ( & PathBuf , & PathBuf ) > {
502514 if let Some ( cert) = & self . tls_certificate {
@@ -665,6 +677,7 @@ mod tests {
665677 env:: set_var ( "PGDOG_BAN_TIMEOUT" , "600000" ) ;
666678 env:: set_var ( "PGDOG_ROLLBACK_TIMEOUT" , "10000" ) ;
667679 env:: set_var ( "PGDOG_SHUTDOWN_TIMEOUT" , "120000" ) ;
680+ env:: set_var ( "PGDOG_SHUTDOWN_TERMINATION_TIMEOUT" , "15000" ) ;
668681 env:: set_var ( "PGDOG_CONNECT_ATTEMPT_DELAY" , "1000" ) ;
669682 env:: set_var ( "PGDOG_QUERY_TIMEOUT" , "30000" ) ;
670683 env:: set_var ( "PGDOG_CLIENT_IDLE_TIMEOUT" , "3600000" ) ;
@@ -674,6 +687,10 @@ mod tests {
674687 assert_eq ! ( General :: ban_timeout( ) , 600000 ) ;
675688 assert_eq ! ( General :: rollback_timeout( ) , 10000 ) ;
676689 assert_eq ! ( General :: default_shutdown_timeout( ) , 120000 ) ;
690+ assert_eq ! (
691+ General :: default_shutdown_termination_timeout( ) ,
692+ Some ( 15_000 )
693+ ) ;
677694 assert_eq ! ( General :: default_connect_attempt_delay( ) , 1000 ) ;
678695 assert_eq ! ( General :: default_query_timeout( ) , 30000 ) ;
679696 assert_eq ! ( General :: default_client_idle_timeout( ) , 3600000 ) ;
@@ -683,6 +700,7 @@ mod tests {
683700 env:: remove_var ( "PGDOG_BAN_TIMEOUT" ) ;
684701 env:: remove_var ( "PGDOG_ROLLBACK_TIMEOUT" ) ;
685702 env:: remove_var ( "PGDOG_SHUTDOWN_TIMEOUT" ) ;
703+ env:: remove_var ( "PGDOG_SHUTDOWN_TERMINATION_TIMEOUT" ) ;
686704 env:: remove_var ( "PGDOG_CONNECT_ATTEMPT_DELAY" ) ;
687705 env:: remove_var ( "PGDOG_QUERY_TIMEOUT" ) ;
688706 env:: remove_var ( "PGDOG_CLIENT_IDLE_TIMEOUT" ) ;
@@ -692,6 +710,7 @@ mod tests {
692710 assert_eq ! ( General :: ban_timeout( ) , 300000 ) ;
693711 assert_eq ! ( General :: rollback_timeout( ) , 5000 ) ;
694712 assert_eq ! ( General :: default_shutdown_timeout( ) , 60000 ) ;
713+ assert_eq ! ( General :: default_shutdown_termination_timeout( ) , None ) ;
695714 assert_eq ! ( General :: default_connect_attempt_delay( ) , 0 ) ;
696715 }
697716
0 commit comments