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 57A21276E0 for ; Tue, 19 Feb 2019 05:34:29 -0500 (EST) 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 j-4_ELtKIHtU for ; Tue, 19 Feb 2019 05:34:29 -0500 (EST) Received: from smtp60.i.mail.ru (smtp60.i.mail.ru [217.69.128.40]) (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 0CE93276DB for ; Tue, 19 Feb 2019 05:34:28 -0500 (EST) From: Georgy Kirichenko Subject: [tarantool-patches] Re: [PATCH] iproto: update readahead in existing connections Date: Tue, 19 Feb 2019 13:34:22 +0300 Message-ID: <14925106.MKni3eZPHJ@localhost> In-Reply-To: <20190218172550.45683-1-sergepetrenko@tarantool.org> References: <20190218172550.45683-1-sergepetrenko@tarantool.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2512652.CvHaviIFK8"; 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: Serge Petrenko Cc: tarantool-patches@freelists.org --nextPart2512652.CvHaviIFK8 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Looks good for me, thank you On Monday, February 18, 2019 8:25:50 PM MSK Serge Petrenko wrote: > Iproto connections keep old readahead values for input buffers even > after box.cfg.readahead reconfiguration. This means that for the changes > to take place for the old clients, they have to reconnect. Otherwise > tarantool log will be spammed with 'readahead limit is reached' errors. > > To fix this, start updating input buffer size for iproto connections > if needed every time the buffer is empty. > > Closes #3958 > --- > https://github.com/tarantool/tarantool/issues/3958 > https://github.com/tarantool/tarantool/tree/sp/gh-3958-iproto-update-readahe > ad > > src/box/iproto.cc | 8 +++- > test/box/iproto_stress.result | 66 +++++++++++++++++++++++++++++++-- > test/box/iproto_stress.test.lua | 40 +++++++++++++++++++- > 3 files changed, 108 insertions(+), 6 deletions(-) > > diff --git a/src/box/iproto.cc b/src/box/iproto.cc > index a08c8c5cb..745221841 100644 > --- a/src/box/iproto.cc > +++ b/src/box/iproto.cc > @@ -145,7 +145,8 @@ iproto_reset_input(struct ibuf *ibuf) > * move the pos to the start of the input buffer. > */ > assert(ibuf_used(ibuf) == 0); > - if (ibuf_capacity(ibuf) < iproto_max_input_size()) { > + if (ibuf_capacity(ibuf) < iproto_max_input_size() && > + ibuf->start_capacity == iproto_readahead) { > ibuf_reset(ibuf); > } else { > struct slab_cache *slabc = ibuf->slabc; > @@ -670,6 +671,11 @@ iproto_connection_input_buffer(struct iproto_connection > *con) */ > return NULL; > } > + /* Update buffer size if readahead has changed. */ > + if (new_ibuf->start_capacity != iproto_readahead) { > + ibuf_destroy(new_ibuf); > + ibuf_create(new_ibuf, cord_slab_cache(), iproto_readahead); > + } > > ibuf_reserve_xc(new_ibuf, to_read + con->parse_size); > /* > diff --git a/test/box/iproto_stress.result b/test/box/iproto_stress.result > index 4239b49b8..6ced92d70 100644 > --- a/test/box/iproto_stress.result > +++ b/test/box/iproto_stress.result > @@ -86,12 +86,72 @@ n_errors -- 0 > --- > - 0 > ... > -box.schema.user.revoke('guest', 'read,write,execute', 'universe') > +s:drop() > --- > ... > -s:drop() > +-- gh-3958 updating box.cfg.readahead doesn't affect existing connections. > +test_run:cmd('restart server default') > +fiber = require('fiber') > +--- > +... > +netbox = require('net.box') > +--- > +... > +readahead = box.cfg.readahead > +--- > +... > +net_msg_max = box.cfg.net_msg_max > +--- > +... > +box.cfg{net_msg_max=1000, readahead = 128} > +--- > +... > +test_run:cmd('setopt delimiter ";"') > +--- > +- true > +... > +function do_call(arg) > + fiber.sleep(0.1) > + return arg > +end; > +--- > +... > +test_run:cmd('setopt delimiter ""'); > +--- > +- true > +... > +-- connection is created with small readahead value, > +-- make sure it is updated if box.cfg.readahead is changed. > +c = netbox.connect(box.cfg.listen) > +--- > +... > +box.cfg{readahead = 100 * 1024} > +--- > +... > +test_run:cmd('setopt delimiter ";"') > +--- > +- true > +... > +for i = 1,500 do > + local pad = string.rep('x', 100) > + fiber.create(function() > + for i = 1,10 do > + c:call('do_call', {pad}) > + end > + end) > +end; > +--- > +... > +test_run:cmd('setopt delimiter ""'); > +--- > +- true > +... > +test_run:wait_log('default', 'readahead limit is reached', nil, 1.0) > +--- > +... > +box.schema.user.revoke('guest', 'read,write,execute', 'universe') > --- > ... > -box.cfg{net_msg_max = net_msg_max} > +box.cfg{net_msg_max = net_msg_max, readahead = readahead} > --- > ... > diff --git a/test/box/iproto_stress.test.lua > b/test/box/iproto_stress.test.lua index 2f3071450..931e66d59 100644 > --- a/test/box/iproto_stress.test.lua > +++ b/test/box/iproto_stress.test.lua > @@ -46,7 +46,43 @@ while n_workers > 0 and attempt < 100 do fiber.sleep(0.1) > attempt = attempt + 1 n_workers -- 0 > n_errors -- 0 > > -box.schema.user.revoke('guest', 'read,write,execute', 'universe') > s:drop() > > -box.cfg{net_msg_max = net_msg_max} > +-- gh-3958 updating box.cfg.readahead doesn't affect existing connections. > +test_run:cmd('restart server default') > +fiber = require('fiber') > +netbox = require('net.box') > + > +readahead = box.cfg.readahead > +net_msg_max = box.cfg.net_msg_max > + > +box.cfg{net_msg_max=1000, readahead = 128} > + > +test_run:cmd('setopt delimiter ";"') > +function do_call(arg) > + fiber.sleep(0.1) > + return arg > +end; > +test_run:cmd('setopt delimiter ""'); > + > +-- connection is created with small readahead value, > +-- make sure it is updated if box.cfg.readahead is changed. > +c = netbox.connect(box.cfg.listen) > + > +box.cfg{readahead = 100 * 1024} > + > +test_run:cmd('setopt delimiter ";"') > +for i = 1,500 do > + local pad = string.rep('x', 100) > + fiber.create(function() > + for i = 1,10 do > + c:call('do_call', {pad}) > + end > + end) > +end; > +test_run:cmd('setopt delimiter ""'); > + > +test_run:wait_log('default', 'readahead limit is reached', nil, 1.0) > + > +box.schema.user.revoke('guest', 'read,write,execute', 'universe') > +box.cfg{net_msg_max = net_msg_max, readahead = readahead} --nextPart2512652.CvHaviIFK8 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part. Content-Transfer-Encoding: 7Bit -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEFZT35EtIMRTDS5hJnoTdFFzh6LUFAlxr264ACgkQnoTdFFzh 6LXSDgf/ZS5r047lfbjEf7bgT3WSZqV180j9z5XGggUOtrX8KWu/XtOUoyX98Tlg yu92dYtZDnenLxbyJpTmg5SnedRJykraGr1tkGmH+LUMWFVEnh9FlGP4f9JolvO6 kfEaWl5FCTlEXF+Tx/3QOBy0d5Ub1MhyHC0aiQPUruG3uZgHLWsiN9PPinp1/B/L NC+t5JgNU/ccCbGjHsasAq17aVM5bIEeYVeOf3OIrY4ziqyNEIiSX8ED6qVW3Dx2 uosJ/S/3HBMnWVU8xe2QbyTGlFIEmPGZtr4wuM16Gdp5VlqQE+IDXWvd8T8R3Lby sw5CLsYKWLX/Ol9L3WXajsxkHw70Zg== =I8el -----END PGP SIGNATURE----- --nextPart2512652.CvHaviIFK8--