103103
104104__author__ = "Mathieu Fenniak"
105105
106+ def validate_keepalive_values (idle , interval , count ):
107+ if idle is not None :
108+ if idle <= 0 :
109+ raise ValueError ("tcp_keepalive_idle must be positive" )
110+
111+ if interval is not None :
112+ if interval <= 0 :
113+ raise ValueError ("tcp_keepalive_interval must be positive" )
114+
115+ if count is not None :
116+ if count <= 0 :
117+ raise ValueError ("tcp_keepalive_count must be positive" )
106118
107119def connect (
108120 user : typing .Optional [str ] = None ,
@@ -117,6 +129,9 @@ def connect(
117129 timeout : typing .Optional [int ] = None ,
118130 max_prepared_statements : typing .Optional [int ] = None ,
119131 tcp_keepalive : typing .Optional [bool ] = None ,
132+ tcp_keepalive_idle : typing .Optional [int ] = None ,
133+ tcp_keepalive_interval : typing .Optional [int ] = None ,
134+ tcp_keepalive_count : typing .Optional [int ] = None ,
120135 application_name : typing .Optional [str ] = None ,
121136 replication : typing .Optional [str ] = None ,
122137 idp_host : typing .Optional [str ] = None ,
@@ -193,7 +208,13 @@ def connect(
193208 The number of seconds before the connection to the server will timeout. By default there is no timeout.
194209 max_prepared_statements : Optional[int]
195210 tcp_keepalive : Optional[bool]
196- Is `TCP keepalive <https://en.wikipedia.org/wiki/Keepalive#TCP_keepalive>`_ used. The default value is ``True``.
211+ A boolean specifying whether the driver uses TCP keepalives to prevent connections from timing out. Defaults to ``True``.
212+ tcp_keepalive_idle : Optional[int]
213+ Time (in seconds) before sending keepalive probes. Defaults to None (system default).
214+ tcp_keepalive_interval : Optional[int]
215+ Time (in seconds) between keepalive probes. Defaults to None (system default).
216+ tcp_keepalive_count : Optional[int]
217+ Number of failed probes before connection is considered dead. Defaults to None (system default).
197218 application_name : Optional[str]
198219 Sets the application name. The default value is None.
199220 replication : Optional[str]
@@ -343,6 +364,9 @@ def connect(
343364 info .put ("ssl_insecure" , ssl_insecure )
344365 info .put ("sslmode" , sslmode )
345366 info .put ("tcp_keepalive" , tcp_keepalive )
367+ info .put ("tcp_keepalive_idle" , tcp_keepalive_idle )
368+ info .put ("tcp_keepalive_interval" , tcp_keepalive_interval )
369+ info .put ("tcp_keepalive_count" , tcp_keepalive_count )
346370 info .put ("timeout" , timeout )
347371 info .put ("token" , token )
348372 info .put ("token_type" , token_type )
@@ -385,6 +409,16 @@ def connect(
385409 if not redshift_native_auth :
386410 IamHelper .set_iam_properties (info )
387411
412+ if info .tcp_keepalive :
413+ try :
414+ validate_keepalive_values (
415+ info .tcp_keepalive_idle ,
416+ info .tcp_keepalive_interval ,
417+ info .tcp_keepalive_count
418+ )
419+ except ValueError as e :
420+ raise InterfaceError (str (e ))
421+
388422 _logger .debug (make_divider_block ())
389423 _logger .debug ("Connection arguments following validation and IAM auth (if applicable)" )
390424 _logger .debug (make_divider_block ())
@@ -404,6 +438,9 @@ def connect(
404438 timeout = info .timeout ,
405439 max_prepared_statements = info .max_prepared_statements ,
406440 tcp_keepalive = info .tcp_keepalive ,
441+ tcp_keepalive_idle = info .tcp_keepalive_idle ,
442+ tcp_keepalive_interval = info .tcp_keepalive_interval ,
443+ tcp_keepalive_count = info .tcp_keepalive_count ,
407444 application_name = info .application_name ,
408445 replication = info .replication ,
409446 client_protocol_version = info .client_protocol_version ,
0 commit comments