8000 Handle when SO_REUSEPORT isn't properly supported · python/asyncio@610c03f · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.

Commit 610c03f

Browse files
SethMichaelLarson1st1
authored andcommitted
Handle when SO_REUSEPORT isn't properly supported
1 parent 2130ad2 commit 610c03f

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

asyncio/base_events.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -877,8 +877,13 @@ def create_datagram_endpoint(self, protocol_factory,
877877
raise ValueError(
878878
'reuse_port not supported by socket module')
879879
else:
880-
sock.setsockopt(
881-
socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
880+
try:
881+
sock.setsockopt(
882+
socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
883+
except OSError:
884+
raise ValueError((
885+
'reuse_port not supported by socket module, '
886+
'SO_REUSEPORT defined but not implemented.'))
882887
if allow_broadcast:
883888
sock.setsockopt(
884889
socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
@@ -1005,8 +1010,13 @@ def create_server(self, protocol_factory, host=None, port=None,
10051010
raise ValueError(
10061011
'reuse_port not supported by socket module')
10071012
else:
1008-
sock.setsockopt(
1009-
socket.SOL_SOCKET, socket.SO_REUSEPORT, True)
1013+
try:
1014+
sock.setsockopt(
1015+
socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
1016+
except OSError:
1017+
raise ValueError((
1018+
'reuse_port not supported by socket module, '
1019+
'SO_REUSEPORT defined but not implemented.'))
10101020
# Disable IPv4/IPv6 dual stack support (enabled by
10111021
# default on Linux) which makes a single socket
10121022
# listen on both address families.

tests/test_base_events.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,17 @@ def test_create_server_nosoreuseport(self, m_socket):
13701370

13711371
self.assertRaises(ValueError, self.loop.run_until_complete, f)
13721372

1373+
@patch_socket
1374+
def test_create_server_soreuseport_only_defined(self, m_socket):
1375+
m_socket.getaddrinfo = socket.getaddrinfo
1376+
m_socket.socket.return_value = mock.Mock()
1377+
m_socket.SO_REUSEPORT = -1
1378+
1379+
f = self.loop.create_server(
1380+
MyProto, '0.0.0.0', 0, reuse_port=True)
1381+
1382+
self.assertRaises(ValueError, self.loop.run_until_complete, f)
1383+
13731384
@patch_socket
13741385
def test_create_server_cant_bind(self, m_socket):
13751386

0 commit comments

Comments
 (0)
0