diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-07-27 23:06:26 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-07-27 23:06:26 +0000 |
commit | e4ff102644831c58633d16b5f2b0dafd666c30c5 (patch) | |
tree | 72e44f2fd8f423915cb8ad84f208e3f3ed6f0b8e | |
parent | a303cbc0ece4a423e58a2fc704c4062b25ede29f (diff) | |
parent | c6b14f94c5021452796d7bd151c2c98ae983afdd (diff) | |
download | python-keystoneclient-e4ff102644831c58633d16b5f2b0dafd666c30c5.tar.gz |
Merge "Set reasonable defaults for TCP Keep-Alive"
-rw-r--r-- | keystoneclient/session.py | 31 |
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) |