Tarantool development patches archive
 help / color / mirror / Atom feed
From: Serge Petrenko <sergepetrenko@tarantool.org>
To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>, gorcunov@gmail.com
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH v3 2/2] replication: append NOP as the last tx row
Date: Fri, 3 Jul 2020 14:24:08 +0300	[thread overview]
Message-ID: <5959aee5-762d-a2bf-bac2-a7aff2c4a75f@tarantool.org> (raw)
In-Reply-To: <112b0dfc-017d-f3ac-f1eb-cf6291f3d585@tarantool.org>


02.07.2020 23:30, Vladislav Shpilevoy пишет:
> Hi! Thanks for the patch!
>
> See 3 comments below.

Thanks  for  the review!

Please find my answers and diff below.

>
>> diff --git a/src/box/txn.c b/src/box/txn.c
>> index 123520166..9793109f3 100644
>> --- a/src/box/txn.c
>> +++ b/src/box/txn.c
>> @@ -517,6 +519,25 @@ txn_journal_entry_new(struct txn *txn)
>>   	assert(remote_row == req->rows + txn->n_applier_rows);
>>   	assert(local_row == remote_row + txn->n_new_rows);
>>   
>> +	/*
>> +	 * Append a dummy NOP statement to preserve replication tx
>> +	 * boundaries when the last tx row is a local one.
>> +	 */
>> +	if (txn->n_local_rows > 0 && txn->n_local_rows != txn->n_new_rows &&
> 1. Why do you need 'txn->n_local_rows != txn->n_new_rows' check?
> Looks like local rows are always in the end. So if their count > 0,
> you can look at *(local_row - 1) without any other checks, no?

There are n_applier_rows, n_new_rows, and n_local_rows.
A txn has a total of n_applier_rows + n_new_rows rows.
First come the n_applier_rows of remote rows, if any, then
n_new_rows "local" rows. Here local means that they're not
from a remote instance.
So, there are two things we need to check: that the last row
is related to a local space, and that the transaction isn't fully local.

I've just found out I made a mistake.

Looks like that's a correct check:


if (txn->n_local_rows > 0 &&
(txn->n_local_rows != txn->n_new_rows || txn->n_applier_rows > 0) &&
(*(local_row - 1))->group_id == GROUP_LOCAL) {

>
> Btw, I just noticed, that we already reorder rows - regardless of
> what was the order of their appliance, txn_journal_entry_new()
> anyway moves all remote rows first, and local rows second. This looks
> like the same problem as I was talking about, when we discussed the
> local reorder, and gave a FOREIGN KEY example.
>
> It means it is already broken, in theory. And perhaps that should be
> changed.
>
> If we consider it not broken, then why can't we put local rows first,
> and remote rows second? Then we don't need NOP here.

We need a NOP when there are no remote rows anyway, since we decided
to not reorder local and global rows.

>
>> +	    (*(local_row - 1))->group_id == GROUP_LOCAL) {
>> +		size_t size;
>> +		*local_row = region_alloc_object(&txn->region,
>> +						 typeof(**local_row), &size);
>> +		if (*local_row == NULL) {
>> +			diag_set(OutOfMemory, size, "region_alloc_object", "row");
> 2. Out of 80.
Fixed.
>
>> +			return NULL;
>> +		}
>> +		memset(*local_row, 0, sizeof(**local_row));
>> +		(*local_row)->type = IPROTO_NOP;
>> +		(*local_row)->group_id = GROUP_DEFAULT;
>> +	} else
>> +		--req->n_rows;
> 3. Lets add {} to the 'else' branch. To be consistent with the 'if'
> branch.
Ok.
diff --git a/src/box/txn.c b/src/box/txn.c
index 9793109f3..765dbd2ce 100644
--- a/src/box/txn.c
+++ b/src/box/txn.c
@@ -521,22 +521,26 @@ txn_journal_entry_new(struct txn *txn)

      /*
       * Append a dummy NOP statement to preserve replication tx
-     * boundaries when the last tx row is a local one.
+     * boundaries when the last tx row is a local one, and the
+     * transaction has at least one global row.
       */
-    if (txn->n_local_rows > 0 && txn->n_local_rows != txn->n_new_rows &&
+    if (txn->n_local_rows > 0 &&
+        (txn->n_local_rows != txn->n_new_rows || txn->n_applier_rows > 
0) &&
          (*(local_row - 1))->group_id == GROUP_LOCAL) {
          size_t size;
          *local_row = region_alloc_object(&txn->region,
                           typeof(**local_row), &size);
          if (*local_row == NULL) {
-            diag_set(OutOfMemory, size, "region_alloc_object", "row");
+            diag_set(OutOfMemory, size, "region_alloc_object",
+                 "row");
              return NULL;
          }
          memset(*local_row, 0, sizeof(**local_row));
          (*local_row)->type = IPROTO_NOP;
          (*local_row)->group_id = GROUP_DEFAULT;
-    } else
+    } else {
          --req->n_rows;
+    }

      return req;
  }


-- Serge Petrenko

  reply	other threads:[~2020-07-03 11:24 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-02 13:39 [Tarantool-patches] [PATCH v3 0/2] fix replication tx boundaries after local space rework Serge Petrenko
2020-07-02 13:39 ` [Tarantool-patches] [PATCH v3 1/2] wal: fix tx boundaries Serge Petrenko
2020-07-02 13:39 ` [Tarantool-patches] [PATCH v3 2/2] replication: append NOP as the last tx row Serge Petrenko
2020-07-02 14:35   ` Cyrill Gorcunov
2020-07-02 14:49     ` Cyrill Gorcunov
2020-07-02 15:37   ` Cyrill Gorcunov
2020-07-02 20:30   ` Vladislav Shpilevoy
2020-07-03 11:24     ` Serge Petrenko [this message]
2020-07-03 21:29       ` Vladislav Shpilevoy
2020-07-04 17:25         ` Serge Petrenko
2020-07-06  6:48           ` Vladislav Shpilevoy
2020-07-06  7:47 ` [Tarantool-patches] [PATCH v3 0/2] fix replication tx boundaries after local space rework Kirill Yukhin

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=5959aee5-762d-a2bf-bac2-a7aff2c4a75f@tarantool.org \
    --to=sergepetrenko@tarantool.org \
    --cc=gorcunov@gmail.com \
    --cc=tarantool-patches@dev.tarantool.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH v3 2/2] replication: append NOP as the last tx row' \
    /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