summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-02-02 01:04:55 +0000
committerGerrit Code Review <review@openstack.org>2015-02-02 01:04:55 +0000
commit010f6630afc1370979c5d9153b6359a4f7799aaf (patch)
treee878f294e648de01107f082b59ed7d72a69076d3
parent5ba59fa9b6f7718fc129bc47750bc977c95ea6bd (diff)
parentfe9692ea6be848b4f2d99daffd598a9fbfe79f42 (diff)
downloadpython-keystoneclient-010f6630afc1370979c5d9153b6359a4f7799aaf.tar.gz
Merge "Configure TCP Keep-Alive for certain Sessions"
-rw-r--r--keystoneclient/session.py15
-rw-r--r--keystoneclient/tests/test_session.py13
2 files changed, 28 insertions, 0 deletions
diff --git a/keystoneclient/session.py b/keystoneclient/session.py
index 0c3edbb..4509528 100644
--- a/keystoneclient/session.py
+++ b/keystoneclient/session.py
@@ -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)
diff --git a/keystoneclient/tests/test_session.py b/keystoneclient/tests/test_session.py
index d3d964c..94a1026 100644
--- a/keystoneclient/tests/test_session.py
+++ b/keystoneclient/tests/test_session.py
@@ -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):