Tarantool development patches archive
 help / color / mirror / Atom feed
* [Tarantool-patches] [PATCH v2] replication: the truncate method called from within a transaction
@ 2021-10-06  8:39 Yan Shtunder via Tarantool-patches
  0 siblings, 0 replies; only message in thread
From: Yan Shtunder via Tarantool-patches @ 2021-10-06  8:39 UTC (permalink / raw)
  To: tarantool-patches; +Cc: Yan Shtunder

The truncate method could be called from within a transaction. The flag
of GROUP_LOCAL was set in truncate method after statement row had been
being checked on the GROUP_LOCAL. Accordingly, after a local transaction
NOP row was not appended.

Closes #6123
---
Issue: https://github.com/tarantool/tarantool/issues/6123
Patch: https://github.com/tarantool/tarantool/tree/yshtunder/gh-6123-truncate-is-local-transaction

 src/box/alter.cc                              | 10 +--
 test/replication-luatest/gh_6123_test.lua     |  2 -
 ...-6123-truncate-is-local-transaction.result | 90 -------------------
 ...123-truncate-is-local-transaction.test.lua | 36 --------
 4 files changed, 2 insertions(+), 136 deletions(-)
 delete mode 100644 test/replication/gh-6123-truncate-is-local-transaction.result
 delete mode 100644 test/replication/gh-6123-truncate-is-local-transaction.test.lua

diff --git a/src/box/alter.cc b/src/box/alter.cc
index 399dfe049..ff1404205 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -2902,14 +2902,8 @@ on_replace_dd_truncate(struct trigger * /* trigger */, void *event)
 	    space_group_id(old_space) == GROUP_LOCAL) {
 		stmt->row->group_id = GROUP_LOCAL;
 		/*
-		 * In order to append a dummy NOP statement
-		 * to preserve the tx replication boundaries,
-		 * it is necessary that the condition
-		 * txn->n_local_rows > 0 must be true.
-		 * Therefore it is necessary to increase the
-		 * value of n_local_rows, because the checking
-		 * on the flag of GROUP_LOCAL will occurs
-		 * before it is set.
+		 * The trigger is invoked after txn->n_local_rows
+		 * is counted, so don't forget to update it here.
 		 */
 		++txn->n_local_rows;
 	}
diff --git a/test/replication-luatest/gh_6123_test.lua b/test/replication-luatest/gh_6123_test.lua
index 7341ccc95..a19d1135b 100644
--- a/test/replication-luatest/gh_6123_test.lua
+++ b/test/replication-luatest/gh_6123_test.lua
@@ -12,7 +12,6 @@ g.before_all(function()
         command = './test/replication-luatest/instance_files/master.lua',
         workdir = fio.tempdir(),
         env = {TARANTOOL_REPLICA = '13302'},
-        http_port = 8081,
         net_box_port = 13301,
     })

@@ -21,7 +20,6 @@ g.before_all(function()
         command = './test/replication-luatest/instance_files/replica.lua',
         workdir = fio.tempdir(),
         env = {TARANTOOL_MASTER = '13301'},
-        http_port = 8082,
         net_box_port = 13302,
     })

diff --git a/test/replication/gh-6123-truncate-is-local-transaction.result b/test/replication/gh-6123-truncate-is-local-transaction.result
deleted file mode 100644
index db57d37d8..000000000
--- a/test/replication/gh-6123-truncate-is-local-transaction.result
+++ /dev/null
@@ -1,90 +0,0 @@
--- test-run result file version 2
-test_run = require('test_run').new()
- | ---
- | ...
-
-
--- Step 1
-box.schema.user.grant("guest", "replication")
- | ---
- | ...
-s = box.schema.space.create("temp", {temporary=true})
- | ---
- | ...
-_ = s:create_index('pk')
- | ---
- | ...
-s:insert{1,2}
- | ---
- | - [1, 2]
- | ...
-s:insert{4}
- | ---
- | - [4]
- | ...
-s:select()
- | ---
- | - - [1, 2]
- |   - [4]
- | ...
-
-
--- Step 2
-test_run:cmd('create server replica with rpl_master=default,\
-              script="replication/replica.lua"')
- | ---
- | - true
- | ...
-test_run:cmd('start server replica')
- | ---
- | - true
- | ...
-
-
--- Step 3
-box.begin() box.space._schema:replace{"smth"} s:truncate() box.commit()
- | ---
- | ...
-s:select()
- | ---
- | - []
- | ...
-box.space._schema:select{'smth'}
- | ---
- | - - ['smth']
- | ...
-
-
--- Step 4
--- Checking that replica has received the last transaction,
--- and that replication isn't broken.
-test_run:switch('replica')
- | ---
- | - true
- | ...
-box.space._schema:select{'smth'}
- | ---
- | - - ['smth']
- | ...
-box.info.replication[1].upstream.status
- | ---
- | - follow
- | ...
-
-
-test_run:switch('default')
- | ---
- | - true
- | ...
-test_run:cmd('stop server replica')
- | ---
- | - true
- | ...
-test_run:cmd('cleanup server replica')
- | ---
- | - true
- | ...
-test_run:cmd('delete server replica')
- | ---
- | - true
- | ...
diff --git a/test/replication/gh-6123-truncate-is-local-transaction.test.lua b/test/replication/gh-6123-truncate-is-local-transaction.test.lua
deleted file mode 100644
index 336c0c44d..000000000
--- a/test/replication/gh-6123-truncate-is-local-transaction.test.lua
+++ /dev/null
@@ -1,36 +0,0 @@
-test_run = require('test_run').new()
-
-
--- Step 1
-box.schema.user.grant("guest", "replication")
-s = box.schema.space.create("temp", {temporary=true})
-_ = s:create_index('pk')
-s:insert{1,2}
-s:insert{4}
-s:select()
-
-
--- Step 2
-test_run:cmd('create server replica with rpl_master=default,\
-              script="replication/replica.lua"')
-test_run:cmd('start server replica')
-
-
--- Step 3
-box.begin() box.space._schema:replace{"smth"} s:truncate() box.commit()
-s:select()
-box.space._schema:select{'smth'}
-
-
--- Step 4
--- Checking that replica has received the last transaction,
--- and that replication isn't broken.
-test_run:switch('replica')
-box.space._schema:select{'smth'}
-box.info.replication[1].upstream.status
-
-
-test_run:switch('default')
-test_run:cmd('stop server replica')
-test_run:cmd('cleanup server replica')
-test_run:cmd('delete server replica')
--
2.25.1


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-10-06  8:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-06  8:39 [Tarantool-patches] [PATCH v2] replication: the truncate method called from within a transaction Yan Shtunder via Tarantool-patches

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox