From: Ilya Kosarev <i.kosarev@tarantool.org> To: tarantool-patches@freelists.org Cc: georgy@tarantool.org, alexander.turenko@tarantool.org, avtikhon@tarantool.org, Ilya Kosarev <i.kosarev@tarantool.org> Subject: [tarantool-patches] [PATCH] test: fix flaky socket test Date: Fri, 30 Aug 2019 18:28:37 +0300 [thread overview] Message-ID: <20190830152837.10171-1-i.kosarev@tarantool.org> (raw) socket.test had a number of problems: - racing condition on closing socket around line 640 - racing condition on waiting around line 42 - racing conditions on "receiving_socket:recv" around line 777 Now they are solved. Closes #4451, #4426 --- Branch: https://github.com/tarantool/tarantool/tree/i.kosarev/gh-4426-4451-fix-socket-test Issues: https://github.com/tarantool/tarantool/issues/4426 https://github.com/tarantool/tarantool/issues/4451 test/app/socket.result | 43 +++++++++++++++++++++++++++++++++------- test/app/socket.test.lua | 22 ++++++++++++++++---- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/test/app/socket.result b/test/app/socket.result index fd299424c..811f6b4e9 100644 --- a/test/app/socket.result +++ b/test/app/socket.result @@ -107,11 +107,11 @@ s:nonblock(true) --- - true ... -s:readable(.1) +s:readable(.5) --- - true ... -s:wait(.1) +s:wait(.5) --- - RW ... @@ -1822,8 +1822,14 @@ test_run:cmd("setopt delimiter ';'") --- - true ... +socket_opened = true cfiber = fiber.create(function(sc, rch, wch) - while sc:send(wch:get()) and rch:put(sc:receive("*l")) do end + while socket_opened do + sc:send(wch:get()) + local data = sc:receive("*l") + if not socket_opened then sc:close() end + rch:put(data) + end end, sc, rch, wch); --- ... @@ -1936,6 +1942,9 @@ c:receive("*l") --- - ... +socket_opened = false +--- +... wch:put("Fu") --- - true @@ -1944,10 +1953,6 @@ c:send("354 Please type your message\n") --- - 29 ... -sc:close() ---- -- 1 -... c:receive("*l", "Line: ") --- - null @@ -2292,6 +2297,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message = receiving_socket:recv() --- ... @@ -2315,6 +2323,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom() --- ... @@ -2392,6 +2403,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message = receiving_socket:recv(512) --- ... @@ -2415,6 +2429,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom(512) --- ... @@ -2452,6 +2469,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message = receiving_socket:recv() --- ... @@ -2484,6 +2504,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom() --- ... @@ -2523,6 +2546,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message = receiving_socket:recv(512) --- ... @@ -2566,6 +2592,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom(512) --- ... diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua index c72d41763..8cb693735 100644 --- a/test/app/socket.test.lua +++ b/test/app/socket.test.lua @@ -39,8 +39,8 @@ s:nonblock(false) s:nonblock() s:nonblock(true) -s:readable(.1) -s:wait(.1) +s:readable(.5) +s:wait(.5) socket.iowait(s:fd(), 'RW') socket.iowait(s:fd(), 3) socket.iowait(s:fd(), 'R') @@ -619,8 +619,14 @@ s:settimeout(100500) rch, wch = fiber.channel(1), fiber.channel(1) sc = socket.connect(host, port) test_run:cmd("setopt delimiter ';'") +socket_opened = true cfiber = fiber.create(function(sc, rch, wch) - while sc:send(wch:get()) and rch:put(sc:receive("*l")) do end + while socket_opened do + sc:send(wch:get()) + local data = sc:receive("*l") + if not socket_opened then sc:close() end + rch:put(data) + end end, sc, rch, wch); test_run:cmd("setopt delimiter ''"); @@ -651,9 +657,9 @@ rch:get() wch:put("DATA\n") c:receive(4) c:receive("*l") +socket_opened = false wch:put("Fu") c:send("354 Please type your message\n") -sc:close() c:receive("*l", "Line: ") c:receive() c:receive(10) @@ -778,6 +784,7 @@ e == errno.EAGAIN -- expected true -- case: recv, zero datagram sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message = receiving_socket:recv() e = receiving_socket:errno() received_message == '' -- expected true @@ -786,6 +793,7 @@ e == 0 -- expected true -- case: recvfrom, zero datagram sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message, from = receiving_socket:recvfrom() e = receiving_socket:errno() received_message == '' -- expected true @@ -812,6 +820,7 @@ e == errno.EAGAIN -- expected true -- case: recv, zero datagram, explicit size sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message = receiving_socket:recv(512) e = receiving_socket:errno() received_message == '' -- expected true @@ -820,6 +829,7 @@ e == 0 -- expected true -- case: recvfrom, zero datagram, explicit size sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message, from = receiving_socket:recvfrom(512) e = receiving_socket:errno() received_message == '' -- expected true @@ -833,6 +843,7 @@ message = string.rep('x', message_len) -- case: recv, non-zero length datagram, the buffer size should be evaluated sending_socket:sendto('127.0.0.1', receiving_socket_port, message) +fiber.yield() received_message = receiving_socket:recv() e = receiving_socket:errno() received_message == message -- expected true @@ -844,6 +855,7 @@ e -- case: recvfrom, non-zero length datagram, the buffer size should be -- evaluated sending_socket:sendto('127.0.0.1', receiving_socket_port, message) +fiber.yield() received_message, from = receiving_socket:recvfrom() e = receiving_socket:errno() received_message == message -- expected true @@ -856,6 +868,7 @@ e -- case: recv truncates a datagram larger then the buffer of an explicit size sending_socket:sendto('127.0.0.1', receiving_socket_port, message) +fiber.yield() received_message = receiving_socket:recv(512) e = receiving_socket:errno() received_message == message:sub(1, 512) -- expected true @@ -872,6 +885,7 @@ message = string.rep('y', message_len) -- case: recvfrom truncates a datagram larger then the buffer of an explicit size sending_socket:sendto('127.0.0.1', receiving_socket_port, message) +fiber.yield() received_message, from = receiving_socket:recvfrom(512) e = receiving_socket:errno() received_message == message:sub(1, 512) -- expected true -- 2.17.1
next reply other threads:[~2019-08-30 15:28 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-30 15:28 Ilya Kosarev [this message] 2019-11-26 1:19 [Tarantool-patches] " Ilya Kosarev 2019-11-26 21:45 Ilya Kosarev 2019-12-04 13:43 Ilya Kosarev 2019-12-05 21:31 ` Vladislav Shpilevoy 2019-12-06 16:01 ` Ilya Kosarev 2019-12-08 15:52 ` Vladislav Shpilevoy 2019-12-10 14:36 ` Ilya Kosarev 2019-12-17 0:03 ` Vladislav Shpilevoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190830152837.10171-1-i.kosarev@tarantool.org \ --to=i.kosarev@tarantool.org \ --cc=alexander.turenko@tarantool.org \ --cc=avtikhon@tarantool.org \ --cc=georgy@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [tarantool-patches] [PATCH] test: fix flaky socket test' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox