mirror of https://github.com/python/cpython
Merge 3.6 (issue #28174)
This commit is contained in:
commit
01683d86f2
|
@ -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.
|
||||||
|
|
|
@ -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):
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue