[Python-checkins] cpython (3.5): Issue #28174: Handle when SO_REUSEPORT isn't properly supported (asyncio)
yury.selivanov
python-checkins at python.org
Thu Sep 15 15:46:46 EDT 2016
https://hg.python.org/cpython/rev/c1c247cf3488
changeset: 103833:c1c247cf3488
branch: 3.5
parent: 103830:1dcfafed3cb0
user: Yury Selivanov <yury at magic.io>
date: Thu Sep 15 15:45:07 2016 -0400
summary:
Issue #28174: Handle when SO_REUSEPORT isn't properly supported (asyncio)
Patch by Seth Michael Larson.
files:
Lib/asyncio/base_events.py | 25 +++++-----
Lib/test/test_asyncio/test_base_events.py | 11 ++++
Misc/NEWS | 3 +
3 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -76,6 +76,17 @@
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.
_SOCKET_TYPE_MASK = 0
if hasattr(socket, 'SOCK_NONBLOCK'):
@@ -873,12 +884,7 @@
sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if reuse_port:
- if not hasattr(socket, 'SO_REUSEPORT'):
- raise ValueError(
- 'reuse_port not supported by socket module')
- else:
- sock.setsockopt(
- socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
+ _set_reuseport(sock)
if allow_broadcast:
sock.setsockopt(
socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
@@ -1001,12 +1007,7 @@
sock.setsockopt(
socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
if reuse_port:
- if not hasattr(socket, 'SO_REUSEPORT'):
- raise ValueError(
- 'reuse_port not supported by socket module')
- else:
- sock.setsockopt(
- socket.SOL_SOCKET, socket.SO_REUSEPORT, True)
+ _set_reuseport(sock)
# Disable IPv4/IPv6 dual stack support (enabled by
# default on Linux) which makes a single socket
# listen on both address families.
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -1371,6 +1371,17 @@
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
def test_create_server_cant_bind(self, m_socket):
class Err(OSError):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -266,6 +266,9 @@
- Issue #27906: Fix socket accept exhaustion during high TCP traffic.
Patch by Kevin Conway.
+- Issue #28174: Handle when SO_REUSEPORT isn't properly supported.
+ Patch by Seth Michael Larson.
+
IDLE
----
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list