summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-07-27 23:06:26 +0000
committerGerrit Code Review <review@openstack.org>2015-07-27 23:06:26 +0000
commite4ff102644831c58633d16b5f2b0dafd666c30c5 (patch)
tree72e44f2fd8f423915cb8ad84f208e3f3ed6f0b8e
parenta303cbc0ece4a423e58a2fc704c4062b25ede29f (diff)
parentc6b14f94c5021452796d7bd151c2c98ae983afdd (diff)
downloadpython-keystoneclient-e4ff102644831c58633d16b5f2b0dafd666c30c5.tar.gz
Merge "Set reasonable defaults for TCP Keep-Alive"
-rw-r--r--keystoneclient/session.py31
1 files changed, 28 insertions, 3 deletions
diff --git a/keystoneclient/session.py b/keystoneclient/session.py
index 14edf46..d353c98 100644
--- a/keystoneclient/session.py
+++ b/keystoneclient/session.py
@@ -899,11 +899,36 @@ class Session(object):
class TCPKeepAliveAdapter(requests.adapters.HTTPAdapter):
- """The custom adapter used to set TCP Keep-Alive on all connections."""
+ """The custom adapter used to set TCP Keep-Alive on all connections.
+
+ This Adapter also preserves the default behaviour of Requests which
+ disables Nagle's Algorithm. See also:
+ http://blogs.msdn.com/b/windowsazurestorage/archive/2010/06/25/nagle-s-algorithm-is-not-friendly-towards-small-requests.aspx
+ """
def init_poolmanager(self, *args, **kwargs):
if requests.__version__ >= '2.4.1':
- kwargs.setdefault('socket_options', [
+ socket_options = [
+ # Keep Nagle's algorithm off
(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),
+ # Turn on TCP Keep-Alive
(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),
- ])
+ # Set the maximum number of keep-alive probes
+ (socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 4),
+ # Send keep-alive probes every 15 seconds
+ (socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15),
+ ]
+
+ # Some operating systems (e.g., OSX) do not support setting
+ # keepidle
+ if hasattr(socket, 'TCP_KEEPIDLE'):
+ socket_options += [
+ # Wait 60 seconds before sending keep-alive probes
+ (socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60)
+ ]
+
+ # After waiting 60 seconds, and then sending a probe once every 15
+ # seconds 4 times, these options should ensure that a connection
+ # hands for no longer than 2 minutes before a ConnectionError is
+ # raised.
+ kwargs.setdefault('socket_options', socket_options)
super(TCPKeepAliveAdapter, self).init_poolmanager(*args, **kwargs)