From: Maria K <marianneliash@gmail.com> To: tarantool-patches@freelists.org Cc: g.kirichenko@corp.mail.ru Subject: [tarantool-patches] [PATCH] lua: lsocket_tcp_receive behavior fixed Date: Wed, 19 Jun 2019 15:54:57 +0300 [thread overview] Message-ID: <CA+JJC5s41yrk_B9eKVqio4VSVw2Zh+aYvForHOFgLMCK1sz2rQ@mail.gmail.com> (raw) [-- Attachment #1: Type: text/plain, Size: 3279 bytes --] Receive function behaved inconsistently for the cases where first we use an integer as a pattern as to tell the function a specific number of elements we want to read, and then perform another receive call using '*a' as a pattern. The latter should have denoted that we want to get all there is to get, but instead it was possible to get only a part of data and also in non-sequential order. Closes #4118 --- Branch: https://github.com/tarantool/tarantool/tree/eljashm/gh-4118-socket_tcp_now_consistent Issue: https://github.com/tarantool/tarantool/issues/4118 src/lua/socket.lua | 15 ++++++++++++- test/app/socket.result | 48 ++++++++++++++++++++++++++++++++++++++++ test/app/socket.test.lua | 16 ++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/lua/socket.lua b/src/lua/socket.lua index 2dba0a8d2..a334ad45b 100644 --- a/src/lua/socket.lua +++ b/src/lua/socket.lua @@ -637,6 +637,19 @@ local function check_limit(self, limit) return nil end +local function check_infinity(self, limit) + if limit == 0 then + return 0 + end + + local rbuf = self.rbuf + if rbuf:size() == 0 then + return nil + end + + return rbuf:size() +end + local function check_delimiter(self, limit, eols) if limit == 0 then return 0 @@ -1454,7 +1467,7 @@ local function lsocket_tcp_receive(self, pattern, prefix) local result = { prefix } local deadline = fiber.clock() + (self.timeout or TIMEOUT_INFINITY) repeat - local data = socket_sysread(self) + local data = read(self, LIMIT_INFINITY, timeout, check_infinity) if data == nil then if not errno_is_transient[self._errno] then return nil, socket_error(self) diff --git a/test/app/socket.result b/test/app/socket.result index 0d029039a..77eff7370 100644 --- a/test/app/socket.result +++ b/test/app/socket.result @@ -2874,3 +2874,51 @@ test_run:cmd("clear filter") --- - true ... +-- case: sicket receive inconsistent behavior +chan = fiber.channel() +--- +... +counter = 0 +--- +... +fn = function(s) counter = 0; while true do s:write((tostring(counter)):rep(chan:get())); counter = counter + 1 end end +--- +... +srv = socket.tcp_server('0.0.0.0', 8888, fn) +--- +... +s = socket.connect('localhost', 8888) +--- +... +chan:put(5) +--- +- true +... +chan:put(5) +--- +- true +... +s:receive(5) +--- +- '00000' +... +chan:put(5) +--- +- true +... +s:settimeout(1) +--- +- 1 +... +s:receive('*a') +--- +- '1111122222' +... +s:close() +--- +- 1 +... +srv:close() +--- +- true +... diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua index dab168f90..7ae9a98aa 100644 --- a/test/app/socket.test.lua +++ b/test/app/socket.test.lua @@ -983,3 +983,19 @@ client:read(1, 5) == '' server:close() test_run:cmd("clear filter") + +-- case: sicket receive inconsistent behavior +chan = fiber.channel() +counter = 0 +fn = function(s) counter = 0; while true do s:write((tostring(counter)):rep(chan:get())); counter = counter + 1 end end +srv = socket.tcp_server('0.0.0.0', 8888, fn) +s = socket.connect('localhost', 8888) +chan:put(5) +chan:put(5) +s:receive(5) +chan:put(5) +s:settimeout(1) +s:receive('*a') +s:close() +srv:close() + -- 2.20.1 [-- Attachment #2: Type: text/html, Size: 4081 bytes --]
next reply other threads:[~2019-06-19 12:55 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-06-19 12:54 Maria K [this message] 2019-06-19 20:15 ` [tarantool-patches] " georgy
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=CA+JJC5s41yrk_B9eKVqio4VSVw2Zh+aYvForHOFgLMCK1sz2rQ@mail.gmail.com \ --to=marianneliash@gmail.com \ --cc=g.kirichenko@corp.mail.ru \ --cc=tarantool-patches@freelists.org \ --subject='Re: [tarantool-patches] [PATCH] lua: lsocket_tcp_receive behavior fixed' \ /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