Skip to content

Commit 827e802

Browse files
committed
Enable TCP_NODELAY for all TCP transports
1 parent eee6984 commit 827e802

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

tests/test_tcp.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ async def handle_client(reader, writer):
7272
writer.write(bytearray(b'A'))
7373
writer.write(memoryview(b'M'))
7474

75+
if self.implementation == 'uvloop':
76+
tr = writer.transport
77+
sock = tr.get_extra_info('socket')
78+
self.assertTrue(
79+
sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY))
80+
7581
await writer.drain()
7682
writer.close()
7783

@@ -340,6 +346,12 @@ async def client(addr):
340346
writer.write(b'BBBB')
341347
self.assertEqual(await reader.readexactly(4), b'SPAM')
342348

349+
if self.implementation == 'uvloop':
350+
tr = writer.transport
351+
sock = tr.get_extra_info('socket')
352+
self.assertTrue(
353+
sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY))
354+
343355
nonlocal CNT
344356
CNT += 1
345357

uvloop/handles/tcp.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
cdef class TCPServer(UVStreamServer):
22
cdef bind(self, system.sockaddr* addr, unsigned int flags=*)
3+
cdef _set_nodelay(self)
34

45
@staticmethod
56
cdef TCPServer new(Loop loop, object protocol_factory, Server server,
@@ -15,6 +16,7 @@ cdef class TCPTransport(UVStream):
1516

1617
cdef bind(self, system.sockaddr* addr, unsigned int flags=*)
1718
cdef connect(self, system.sockaddr* addr)
19+
cdef _set_nodelay(self)
1820

1921
@staticmethod
2022
cdef TCPTransport new(Loop loop, object protocol, Server server,

uvloop/handles/tcp.pyx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ cdef class TCPServer(UVStreamServer):
6666
__tcp_init_uv_handle(<UVStream>handle, loop, flags)
6767
return handle
6868

69+
cdef _set_nodelay(self):
70+
cdef int err
71+
self._ensure_alive()
72+
err = uv.uv_tcp_nodelay(<uv.uv_tcp_t*>self._handle, 1);
73+
if err < 0:
74+
raise convert_error(err)
75+
6976
cdef _new_socket(self):
7077
return __tcp_get_socket(<UVSocketHandle>self)
7178

@@ -77,6 +84,7 @@ cdef class TCPServer(UVStreamServer):
7784
self._fatal_error(exc, True)
7885
else:
7986
self._mark_as_open()
87+
self._set_nodelay()
8088

8189
cdef bind(self, system.sockaddr* addr, unsigned int flags=0):
8290
self._ensure_alive()
@@ -86,6 +94,7 @@ cdef class TCPServer(UVStreamServer):
8694
self._fatal_error(exc, True)
8795
else:
8896
self._mark_as_open()
97+
self._set_nodelay()
8998

9099
cdef UVStream _make_new_transport(self, object protocol, object waiter):
91100
cdef TCPTransport tr
@@ -106,8 +115,16 @@ cdef class TCPTransport(UVStream):
106115
__tcp_init_uv_handle(<UVStream>handle, loop, uv.AF_UNSPEC)
107116
handle.__peername_set = 0
108117
handle.__sockname_set = 0
118+
handle._set_nodelay()
109119
return handle
110120

121+
cdef _set_nodelay(self):
122+
cdef int err
123+
self._ensure_alive()
124+
err = uv.uv_tcp_nodelay(<uv.uv_tcp_t*>self._handle, 1);
125+
if err < 0:
126+
raise convert_error(err)
127+
111128
cdef _call_connection_made(self):
112129
# asyncio saves peername & sockname when transports are instantiated,
113130
# so that they're accessible even after the transport is closed.

0 commit comments

Comments
 (0)