Merge 3.6 (issue #28174)

This commit is contained in:
Yury Selivanov 2016-09-15 15:46:40 -04:00
commit 01683d86f2
3 changed files with 27 additions and 12 deletions

View File

@ -76,6 +76,17 @@ def _format_pipe(fd):
return repr(fd) return repr(fd)
def _set_reuseport(sock):
if not hasattr(socket, 'SO_REUSEPORT'):
raise ValueError('reuse_port not supported by socket module')
else:
try:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except OSError:
raise ValueError('reuse_port not supported by socket module, '
'SO_REUSEPORT defined but not implemented.')
# Linux's sock.type is a bitmask that can include extra info about socket. # Linux's sock.type is a bitmask that can include extra info about socket.
_SOCKET_TYPE_MASK = 0 _SOCKET_TYPE_MASK = 0
if hasattr(socket, 'SOCK_NONBLOCK'): if hasattr(socket, 'SOCK_NONBLOCK'):
@ -874,12 +885,7 @@ class BaseEventLoop(events.AbstractEventLoop):
sock.setsockopt( sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if reuse_port: if reuse_port:
if not hasattr(socket, 'SO_REUSEPORT'): _set_reuseport(sock)
raise ValueError(
'reuse_port not supported by socket module')
else:
sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
if allow_broadcast: if allow_broadcast:
sock.setsockopt( sock.setsockopt(
socket.SOL_SOCKET, socket.SO_BROADCAST, 1) socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
@ -1002,12 +1008,7 @@ class BaseEventLoop(events.AbstractEventLoop):
sock.setsockopt( sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEADDR, True) socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
if reuse_port: if reuse_port:
if not hasattr(socket, 'SO_REUSEPORT'): _set_reuseport(sock)
raise ValueError(
'reuse_port not supported by socket module')
else:
sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEPORT, True)
# Disable IPv4/IPv6 dual stack support (enabled by # Disable IPv4/IPv6 dual stack support (enabled by
# default on Linux) which makes a single socket # default on Linux) which makes a single socket
# listen on both address families. # listen on both address families.

View File

@ -1370,6 +1370,17 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase):
self.assertRaises(ValueError, self.loop.run_until_complete, f) self.assertRaises(ValueError, self.loop.run_until_complete, f)
@patch_socket
def test_create_server_soreuseport_only_defined(self, m_socket):
m_socket.getaddrinfo = socket.getaddrinfo
m_socket.socket.return_value = mock.Mock()
m_socket.SO_REUSEPORT = -1
f = self.loop.create_server(
MyProto, '0.0.0.0', 0, reuse_port=True)
self.assertRaises(ValueError, self.loop.run_until_complete, f)
@patch_socket @patch_socket
def test_create_server_cant_bind(self, m_socket): def test_create_server_cant_bind(self, m_socket):

View File

@ -432,6 +432,9 @@ Library
- Issue #27906: Fix socket accept exhaustion during high TCP traffic. - Issue #27906: Fix socket accept exhaustion during high TCP traffic.
Patch by Kevin Conway. Patch by Kevin Conway.
- Issue #28174: Handle when SO_REUSEPORT isn't properly supported.
Patch by Seth Michael Larson.
IDLE IDLE
---- ----