summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsk Solem <ask@celeryproject.org>2016-12-14 13:53:46 -0800
committerAsk Solem <ask@celeryproject.org>2016-12-14 13:53:46 -0800
commitb14962c2dc8eb38f7312ea1a4377e825cbe3834d (patch)
tree30cae31b2c32f620a5ffcb495a44303eea240cea
parent479a119e97f2c97987814bb89019e803cc8f95cc (diff)
downloadpy-amqp-b14962c2dc8eb38f7312ea1a4377e825cbe3834d.tar.gz
Set default KEEPIDLE/KEEPCNT/KEEPINTVL and TCP_USER_TIMEOUT
-rw-r--r--amqp/transport.py36
1 files changed, 21 insertions, 15 deletions
diff --git a/amqp/transport.py b/amqp/transport.py
index ef9177f..e4c7977 100644
--- a/amqp/transport.py
+++ b/amqp/transport.py
@@ -61,9 +61,27 @@ KNOWN_TCP_OPTS = (
TCP_OPTS = {
getattr(socket, opt) for opt in KNOWN_TCP_OPTS if hasattr(socket, opt)
}
+DEFAULT_SOCKET_SETTINGS = {
+ socket.TCP_NODELAY: 1,
+}
+
if HAS_TCP_USER_TIMEOUT:
KNOWN_TCP_OPTS += ('TCP_USER_TIMEOUT',)
TCP_OPTS.add(TCP_USER_TIMEOUT)
+ DEFAULT_SOCKET_SETTINGS[TCP_USER_TIMEOUT] = 1000
+
+
+try:
+ from socket import TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT # noqa
+except ImportError:
+ pass
+else:
+ DEFAULT_SOCKET_SETTINGS.update({
+ TCP_KEEPIDLE: 60,
+ TCP_KEEPINTVL: 10,
+ TCP_KEEPCNT: 9,
+ })
+
def to_host_port(host, default=AMQP_PORT):
@@ -178,22 +196,10 @@ class _AbstractTransport(object):
}
def _set_socket_options(self, socket_settings):
- user_timeout = 0
- if self.connect_timeout is not None:
- user_timeout = int(math.ceil(self.connect_timeout * 1000.0))
-
- if not socket_settings:
- self.sock.setsockopt(SOL_TCP, socket.TCP_NODELAY, 1)
- if HAS_TCP_USER_TIMEOUT:
- self.sock.setsockopt(SOL_TCP, TCP_USER_TIMEOUT, user_timeout)
- return
-
tcp_opts = self._get_tcp_socket_defaults(self.sock)
- tcp_opts.setdefault(socket.TCP_NODELAY, 1)
- if HAS_TCP_USER_TIMEOUT:
- tcp_opts.setdefault(TCP_USER_TIMEOUT, user_timeout)
- tcp_opts.update(socket_settings)
-
+ final_socket_settings = dict(DEFAULT_SOCKET_SETTINGS)
+ final_socket_settings.update(socket_settings)
+ tcp_opts.update(final_socket_settings)
for opt, val in items(tcp_opts):
self.sock.setsockopt(SOL_TCP, opt, val)