From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: tarantool-patches@freelists.org Cc: vdavydov.dev@gmail.com Subject: [PATCH v2 2/4] iproto: fix error with unstoppable batching Date: Mon, 23 Apr 2018 20:05:02 +0300 [thread overview] Message-ID: <23176a3824d858233ee557528659694d60c0de17.1524502856.git.v.shpilevoy@tarantool.org> (raw) In-Reply-To: <cover.1524502856.git.v.shpilevoy@tarantool.org> In-Reply-To: <cover.1524502856.git.v.shpilevoy@tarantool.org> IProto connection stops input reading, when active request count is reached. But when multiple requests are in a batch, the IProto does not check the limit, so it can be violated. Lets check the limit during batch parsing after each message too, not only once before parsing. --- src/box/iproto.cc | 29 +++++++++++++++++++---------- test/box/request_limit.result | 20 ++++++++++++++++++++ test/box/request_limit.test.lua | 10 ++++++++++ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/box/iproto.cc b/src/box/iproto.cc index a88226a9f..be3c5a1a6 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -582,7 +582,8 @@ iproto_enqueue_batch(struct iproto_connection *con, struct ibuf *in) { int n_requests = 0; bool stop_input = false; - while (con->parse_size && stop_input == false) { + while (con->parse_size != 0 && stop_input == false && + !iproto_must_stop_input()) { const char *reqstart = in->wpos - con->parse_size; const char *pos = reqstart; /* Read request length. */ @@ -691,18 +692,26 @@ iproto_connection_on_input(ev_loop *loop, struct ev_io *watcher, int nrd = sio_read(fd, in->wpos, ibuf_unused(in)); if (nrd < 0) { /* Socket is not ready. */ ev_io_start(loop, &con->input); - return; - } - if (nrd == 0) { /* EOF */ + /* + * Socket has no data, but there can be + * non-parsed requests, stopped by + * requests limit. Try to enqueue them, if + * exist. + */ + if (con->parse_size == 0) + return; + } else if (nrd == 0) { + /* EOF */ iproto_connection_close(con); return; - } - /* Count statistics */ - rmean_collect(rmean_net, IPROTO_RECEIVED, nrd); + } else { + /* Count statistics */ + rmean_collect(rmean_net, IPROTO_RECEIVED, nrd); - /* Update the read position and connection state. */ - in->wpos += nrd; - con->parse_size += nrd; + /* Update the read position and connection state. */ + in->wpos += nrd; + con->parse_size += nrd; + } /* Enqueue all requests which are fully read up. */ iproto_enqueue_batch(con, in); } catch (Exception *e) { diff --git a/test/box/request_limit.result b/test/box/request_limit.result index bef998b91..2691aa329 100644 --- a/test/box/request_limit.result +++ b/test/box/request_limit.result @@ -108,6 +108,26 @@ active == run_max * 2 or active wait_finished(active) --- ... +-- +-- Test that each message in a batch is checked. When a limit is +-- reached, other messages must be processed later. +-- +run_max = limit * 5 +--- +... +run_workers(conn) +--- +... +wait_block() +--- +... +active +--- +- 769 +... +wait_finished(run_max) +--- +... conn2:close() --- ... diff --git a/test/box/request_limit.test.lua b/test/box/request_limit.test.lua index 2bc35d8fa..bff7b5282 100644 --- a/test/box/request_limit.test.lua +++ b/test/box/request_limit.test.lua @@ -63,6 +63,16 @@ wait_block() active == run_max * 2 or active wait_finished(active) +-- +-- Test that each message in a batch is checked. When a limit is +-- reached, other messages must be processed later. +-- +run_max = limit * 5 +run_workers(conn) +wait_block() +active +wait_finished(run_max) + conn2:close() conn:close() -- 2.15.1 (Apple Git-101)
next prev parent reply other threads:[~2018-04-23 17:05 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-04-23 17:05 [PATCH v2 0/4] IProto fixes and iproto_msg_max option Vladislav Shpilevoy 2018-04-23 17:05 ` [PATCH v2 1/4] iproto: fix error with input discarding Vladislav Shpilevoy 2018-04-24 15:35 ` Vladimir Davydov 2018-04-23 17:05 ` Vladislav Shpilevoy [this message] 2018-04-24 15:36 ` [PATCH v2 2/4] iproto: fix error with unstoppable batching Vladimir Davydov 2018-04-23 17:05 ` [PATCH v2 3/4] iproto: allow to configure IPROTO_MSG_MAX Vladislav Shpilevoy 2018-04-23 17:05 ` [PATCH v2 4/4] Allow to configure TX fiber pool size Vladislav Shpilevoy 2018-04-24 15:43 ` Vladimir Davydov 2018-04-24 17:33 ` [tarantool-patches] " 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=23176a3824d858233ee557528659694d60c0de17.1524502856.git.v.shpilevoy@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=vdavydov.dev@gmail.com \ --subject='Re: [PATCH v2 2/4] iproto: fix error with unstoppable batching' \ /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