Merge "Configure TCP Keep-Alive for certain Sessions"

This commit is contained in:
Jenkins 2015-02-02 01:04:55 +00:00 committed by Gerrit Code Review
commit 010f6630af
2 changed files with 28 additions and 0 deletions
keystoneclient

@ -15,6 +15,7 @@ import functools
import hashlib
import logging
import os
import socket
import time
from oslo.config import cfg
@ -123,6 +124,9 @@ class Session(object):
redirect=_DEFAULT_REDIRECT_LIMIT):
if not session:
session = requests.Session()
# Use TCPKeepAliveAdapter to fix bug 1323862
for scheme in session.adapters.keys():
session.mount(scheme, TCPKeepAliveAdapter())
self.auth = auth
self.session = session
@ -805,3 +809,14 @@ class Session(object):
kwargs['timeout'] = args.timeout
return cls._make(**kwargs)
class TCPKeepAliveAdapter(requests.adapters.HTTPAdapter):
"""The custom adapter used to set TCP Keep-Alive on all connections."""
def init_poolmanager(self, *args, **kwargs):
if requests.__version__ >= '2.4.1':
kwargs.setdefault('socket_options', [
(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
])
super(TCPKeepAliveAdapter, self).init_poolmanager(*args, **kwargs)

@ -205,6 +205,19 @@ class SessionTests(utils.TestCase):
self.assertThat(self.requests.request_history,
matchers.HasLength(retries + 1))
def test_uses_tcp_keepalive_by_default(self):
session = client_session.Session()
requests_session = session.session
self.assertIsInstance(requests_session.adapters['http://'],
client_session.TCPKeepAliveAdapter)
self.assertIsInstance(requests_session.adapters['https://'],
client_session.TCPKeepAliveAdapter)
def test_does_not_set_tcp_keepalive_on_custom_sessions(self):
mock_session = mock.Mock()
client_session.Session(session=mock_session)
self.assertFalse(mock_session.mount.called)
class RedirectTests(utils.TestCase):