From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 1CC8230CA2 for ; Wed, 19 Jun 2019 16:16:04 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Pl0-uqkDo0W1 for ; Wed, 19 Jun 2019 16:16:03 -0400 (EDT) Received: from smtp3.mail.ru (smtp3.mail.ru [94.100.179.58]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 5DFDA30CA0 for ; Wed, 19 Jun 2019 16:16:03 -0400 (EDT) From: georgy@tarantool.org Subject: [tarantool-patches] Re: [PATCH] lua: lsocket_tcp_receive behavior fixed Date: Wed, 19 Jun 2019 23:15:54 +0300 Message-ID: <2965336.smCu91DlTx@home.lan> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1668637.3A6NDIb0Zt"; micalg="pgp-sha256"; protocol="application/pgp-signature" Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org Cc: Maria K --nextPart1668637.3A6NDIb0Zt Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" LGTM On Wednesday, June 19, 2019 3:54:57 PM MSK Maria K wrote: > 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_c > onsistent > > 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() > + --nextPart1668637.3A6NDIb0Zt Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part. Content-Transfer-Encoding: 7Bit -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEG2/Kn1BJkT4nfMGrp+tV93PC0Y8FAl0Kl/oACgkQp+tV93PC 0Y/QUgf/Yuj0lrT1BWXQL/VlyGNYX3twOUhJ17RIVy98//shcGtp425ZoG7Q9kAS Zpo73StBlVdaLr9Jm0QsengwjCKqYlTp82LBLW6Lt0ok0KyshePq2fO2lWUpBSaA G/b6nF7VoxRRfujq0GSs16oTyklv1Bg5ixu2EIoRSuzcoIRHzUA3HYb6Ls092N4G mcWPBkexm8hQf4qai31opePtPTO6eoT3TfMTVqiADNQYdx5fKtGngRULGPPfl0OY K7jFXQchomgWbpcha11e+ZlHBMnvxOjqpxlvne9NOlrGSPC8MmGi6dCYm+yHKzXV TO/uyjsMxCxGJHcgkC9+pP5eyRjRUw== =FEPV -----END PGP SIGNATURE----- --nextPart1668637.3A6NDIb0Zt--