44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
import logging
|
|
import socket
|
|
import pika.compat
|
|
|
|
LOGGER = logging.getLogger(__name__)
|
|
|
|
_SUPPORTED_TCP_OPTIONS = {}
|
|
|
|
try:
|
|
_SUPPORTED_TCP_OPTIONS['TCP_USER_TIMEOUT'] = socket.TCP_USER_TIMEOUT
|
|
except AttributeError:
|
|
if pika.compat.LINUX_VERSION and pika.compat.LINUX_VERSION >= (2, 6, 37):
|
|
# NB: this is not the timeout value, but the number corresponding
|
|
# to the constant in tcp.h
|
|
# https://github.com/torvalds/linux/blob/master/include/uapi/linux/tcp.h#
|
|
# #define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */
|
|
_SUPPORTED_TCP_OPTIONS['TCP_USER_TIMEOUT'] = 18
|
|
|
|
try:
|
|
_SUPPORTED_TCP_OPTIONS['TCP_KEEPIDLE'] = socket.TCP_KEEPIDLE
|
|
_SUPPORTED_TCP_OPTIONS['TCP_KEEPCNT'] = socket.TCP_KEEPCNT
|
|
_SUPPORTED_TCP_OPTIONS['TCP_KEEPINTVL'] = socket.TCP_KEEPINTVL
|
|
except AttributeError:
|
|
pass
|
|
|
|
|
|
def socket_requires_keepalive(tcp_options):
|
|
return 'TCP_KEEPIDLE' in tcp_options or 'TCP_KEEPCNT' in tcp_options or 'TCP_KEEPINTVL' in tcp_options
|
|
|
|
|
|
def set_sock_opts(tcp_options, sock):
|
|
if not tcp_options:
|
|
return
|
|
|
|
if socket_requires_keepalive(tcp_options):
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
|
|
|
for key, value in tcp_options.items():
|
|
option = _SUPPORTED_TCP_OPTIONS.get(key)
|
|
if option:
|
|
sock.setsockopt(pika.compat.SOL_TCP, option, value)
|
|
else:
|
|
LOGGER.warning('Unsupported TCP option %s:%s', key, value)
|