[PATCH 1/1] iproto: get iproto obuf only right before usage
Vladimir Davydov
vdavydov.dev at gmail.com
Tue Mar 20 16:07:35 MSK 2018
On Fri, Mar 16, 2018 at 05:41:42PM +0300, Vladislav Shpilevoy wrote:
> --- Branch: https://github.com/tarantool/tarantool/tree/fix-iproto-buffers
> --- There is no issue, since the fix is simple, and does not
> --- affect external behavior.
Please open a Github ticket. Just describe the problem there. A test
case is not necessary. This will be useful for release changelog.
(FYI I asked both Kostja and Kirill - they both agree).
>
> --- Changes: do not rely on buffers number and rotation. Just
> --- send multiple fast read/write requests with a small delay.
> --- With no patch the test hangs or crashes since some responses
> --- are corrupted or discarded.
When I talked about extra info you don't want to be included into the
commit message, I meant the '---' generated by git-format-patch, as
everything following '---' is ignored by git-am.
Also, please don't forget to add the version to the subject line
(--subject-prefix='PATCH v2').
>
> It is possible to discard non-sent responses using a special
> sequence of requests and yields. In details: if DML requests
> yield on commit too long, there are fast read requests, and a
> network is saturated, then some non-sent DML responses are
> discarded.
>
> Signed-off-by: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
We don't sign patches, not yet. Please fix your git config.
> @@ -1175,8 +1175,15 @@ tx_process1(struct cmsg *m)
>
> struct tuple *tuple;
> struct obuf_svp svp;
> - if (box_process1(&msg->dml, &tuple) ||
> - iproto_prepare_select(out, &svp))
> + ERROR_INJECT(ERRINJ_IPROTO_TX_DELAY, {
> + if (rand() % 100 < 10)
> + fiber_sleep(0.001);
> + });
> + struct obuf *out;
> + if (box_process1(&msg->dml, &tuple) != 0)
> + goto error;
> + out = msg->connection->tx.p_obuf;
> + if (iproto_prepare_select(out, &svp) != 0)
> goto error;
> if (tuple && tuple_to_obuf(tuple, out))
> goto error;
> @@ -1192,7 +1199,7 @@ static void
> tx_process_select(struct cmsg *m)
> {
> struct iproto_msg *msg = tx_accept_msg(m);
> - struct obuf *out = msg->connection->tx.p_obuf;
> + struct obuf *out;
> struct obuf_svp svp;
> struct port port;
> int count;
> @@ -1204,11 +1211,18 @@ tx_process_select(struct cmsg *m)
> if (tx_check_schema(msg->header.schema_version))
> goto error;
>
> + ERROR_INJECT(ERRINJ_IPROTO_TX_DELAY, {
> + /* Select can yield, for example, on vinyl. */
> + if (rand() % 100 < 10)
> + fiber_sleep(0.001);
> + });
There are quite a few constants in this error injection so
copying-and-pasting doesn't look good. I'd wrap it into an inline
function (tx_inject_delay or something, think of the name pls).
> diff --git a/test/box/errinj.test.lua b/test/box/errinj.test.lua
> index 9bcf53847..a24b357e6 100644
> --- a/test/box/errinj.test.lua
> +++ b/test/box/errinj.test.lua
> @@ -348,3 +348,19 @@ box.error.injection.set('ERRINJ_BUILD_SECONDARY', sk.id)
> sk:alter({parts = {2, 'number'}})
> box.error.injection.set('ERRINJ_BUILD_SECONDARY', -1)
> s:drop()
Please add a brief comment explaining what and why we are testing here.
> +
> +box.schema.user.grant('guest', 'read,write,execute', 'universe')
> +s = box.schema.space.create('test')
> +_ = s:create_index('pk')
> +
> +c = net_box.connect(box.cfg.listen)
> +
> +ch = fiber.channel(200)
> +errinj.set("ERRINJ_IPROTO_TX_DELAY", true)
> +for i = 1, 100 do fiber.create(function() for j = 1, 10 do c.space.test:replace{1} end ch:put(true) end) end
> +for i = 1, 100 do fiber.create(function() for j = 1, 10 do c.space.test:select() end ch:put(true) end) end
> +for i = 1, 200 do ch:get() end
> +errinj.set("ERRINJ_IPROTO_TX_DELAY", false)
> +
> +s:drop()
> +box.schema.user.revoke('guest', 'read,write,execute','universe')
More information about the Tarantool-patches
mailing list