Skip to content

Commit 441afbd

Browse files
bpo-33353: test_asyncio use set_write_buffer_limits() (GH-7200)
Use transport.set_write_buffer_limits() in sendfile tests of test_asyncio to make sure that the protocol is paused after sending 4 KiB. Previously, test_sendfile_fallback_close_peer_in_the_middle_of_receiving() failed on FreeBSD if the DATA was smaller than the default limit of 64 KiB. (cherry picked from commit 9551f77) Co-authored-by: Victor Stinner <[email protected]>
1 parent be5d616 commit 441afbd

File tree

2 files changed

+30
-18
lines changed

2 files changed

+30
-18
lines changed

Lib/asyncio/streams.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from .tasks import sleep
1717

1818

19-
_DEFAULT_LIMIT = 2 ** 16
19+
_DEFAULT_LIMIT = 2 ** 16 # 64 KiB
2020

2121

2222
class IncompleteReadError(EOFError):

Lib/test/test_asyncio/test_events.py

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,10 @@ async def connect(cmd=None, **kwds):
21132113

21142114
class SendfileBase:
21152115

2116-
DATA = b"12345abcde" * 64 * 1024 # 64 KiB (don't use smaller sizes)
2116+
DATA = b"SendfileBaseData" * (1024 * 8) # 128 KiB
2117+
2118+
# Reduce socket buffer size to test on relative small data sets.
2119+
BUF_SIZE = 4 * 1024 # 4 KiB
21172120

21182121
@classmethod
21192122
def setUpClass(cls):
@@ -2171,30 +2174,40 @@ def tearDownClass(cls):
21712174
constants.SENDFILE_FALLBACK_READBUFFER_SIZE = cls.__old_bufsize
21722175
super().tearDownClass()
21732176

2174-
def set_socket_opts(self, sock):
2175-
# On macOS, SO_SNDBUF is reset by connect(). So this method
2176-
# should be called after the socket is connected.
2177-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
2178-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024)
2179-
21802177
def make_socket(self, cleanup=True):
21812178
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21822179
sock.setblocking(False)
21832180
if cleanup:
21842181
self.addCleanup(sock.close)
21852182
return sock
21862183

2184+
def reduce_receive_buffer_size(self, sock):
2185+
# Reduce receive socket buffer size to test on relative
2186+
# small data sets.
2187+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, self.BUF_SIZE)
2188+
2189+
def reduce_send_buffer_size(self, sock, transport=None):
2190+
# Reduce send socket buffer size to test on relative small data sets.
2191+
2192+
# On macOS, SO_SNDBUF is reset by connect(). So this method
2193+
# should be called after the socket is connected.
2194+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, self.BUF_SIZE)
2195+
2196+
if transport is not None:
2197+
transport.set_write_buffer_limits(high=self.BUF_SIZE)
2198+
21872199
def prepare_socksendfile(self):
2188-
sock = self.make_socket()
21892200
proto = self.MyProto(self.loop)
21902201
port = support.find_unused_port()
21912202
srv_sock = self.make_socket(cleanup=False)
21922203
srv_sock.bind((support.HOST, port))
21932204
server = self.run_loop(self.loop.create_server(
21942205
lambda: proto, sock=srv_sock))
2195-
self.set_socket_opts(srv_sock)
2206+
self.reduce_receive_buffer_size(srv_sock)
2207+
2208+
sock = self.make_socket()
21962209
self.run_loop(self.loop.sock_connect(sock, ('127.0.0.1', port)))
2197-
self.set_socket_opts(sock)
2210+
self.reduce_send_buffer_size(sock)
21982211

21992212
def cleanup():
22002213
if proto.transport is not None:
@@ -2243,7 +2256,7 @@ def test_sock_sendfile_zero_size(self):
22432256
self.assertEqual(self.file.tell(), 0)
22442257

22452258
def test_sock_sendfile_mix_with_regular_send(self):
2246-
buf = b"X" * 160 * 1024 # 160 KiB
2259+
buf = b"mix_regular_send" * (4 * 1024) # 64 KiB
22472260
sock, proto = self.prepare_socksendfile()
22482261
self.run_loop(self.loop.sock_sendall(sock, buf))
22492262
ret = self.run_loop(self.loop.sock_sendfile(sock, self.file))
@@ -2288,24 +2301,23 @@ def prepare_sendfile(self, *, is_ssl=False, close_after=0):
22882301
srv_ctx = None
22892302
cli_ctx = None
22902303
srv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2291-
# reduce recv socket buffer size to test on relative small data sets
2292-
srv_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024)
22932304
srv_sock.bind((support.HOST, port))
22942305
server = self.run_loop(self.loop.create_server(
22952306
lambda: srv_proto, sock=srv_sock, ssl=srv_ctx))
2307+
self.reduce_receive_buffer_size(srv_sock)
22962308

22972309
if is_ssl:
22982310
server_hostname = support.HOST
22992311
else:
23002312
server_hostname = None
23012313
cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
23022314
cli_sock.connect((support.HOST, port))
2303-
# reduce send socket buffer size to test on relative small data sets
2304-
cli_sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
2315+
23052316
cli_proto = self.MySendfileProto(loop=self.loop)
23062317
tr, pr = self.run_loop(self.loop.create_connection(
23072318
lambda: cli_proto, sock=cli_sock,
23082319
ssl=cli_ctx, server_hostname=server_hostname))
2320+
self.reduce_send_buffer_size(cli_sock, transport=tr)
23092321

23102322
def cleanup():
23112323
srv_proto.transport.close()
@@ -2410,8 +2422,8 @@ def test_sendfile_for_closing_transp(self):
24102422

24112423
def test_sendfile_pre_and_post_data(self):
24122424
srv_proto, cli_proto = self.prepare_sendfile()
2413-
PREFIX = b'zxcvbnm' * 1024
2414-
SUFFIX = b'0987654321' * 1024
2425+
PREFIX = b'PREFIX__' * 1024 # 8 KiB
2426+
SUFFIX = b'--SUFFIX' * 1024 # 8 KiB
24152427
cli_proto.transport.write(PREFIX)
24162428
ret = self.run_loop(
24172429
self.loop.sendfile(cli_proto.transport, self.file))

0 commit comments

Comments
 (0)