From 416eff4e52f72169c3ebf49a8ffca36086692b7a Mon Sep 17 00:00:00 2001 From: Phil Sphicas Date: Mon, 14 Mar 2022 00:29:03 -0700 Subject: [PATCH] Armada client: Enable TCP keepalives This change enables TCP keepalives in the transport adapter used by the Armada client. Change-Id: I44d9fe0f29dfb1c00250a76452f4db610ea377ad --- armada/common/session.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/armada/common/session.py b/armada/common/session.py index 1538384e..f4c3de8f 100644 --- a/armada/common/session.py +++ b/armada/common/session.py @@ -12,9 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import socket + from oslo_config import cfg from oslo_log import log as logging import requests +from urllib3.poolmanager import PoolManager +from urllib3.connection import HTTPConnection LOG = logging.getLogger(__name__) CONF = cfg.CONF @@ -60,6 +64,7 @@ class ArmadaSession(object): self.scheme, self.host, self.port) else: self.base_url = "{}://{}/api/".format(self.scheme, self.host) + self._session.mount(self.base_url, TcpKeepaliveAdapter()) self.default_timeout = ArmadaSession._calc_timeout_tuple( (20, 3600), timeout) @@ -177,3 +182,19 @@ class ArmadaSession(object): " integer. Proceeding with values of (%s, %s)", connect_timeout, read_timeout) return (connect_timeout, read_timeout) + + +class TcpKeepaliveAdapter(requests.adapters.HTTPAdapter): + """"Transport adapter" that enables TCP keepalives.""" + + def init_poolmanager(self, connections, maxsize, block=False): + options = HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + (socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 120), + (socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 30), + ] + self.poolmanager = PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + socket_options=options)