[tarantool-patches] [PATCH] ddl: No replication for temp and local spaces

Stanislav Zudin szudin at tarantool.org
Tue Jun 25 12:01:33 MSK 2019


Please find the updated patch below.


On 21.06.2019 18:05, Vladimir Davydov wrote:
>> +-- gh-4263 The truncation of the local & temporary space
>> +-- should not spread among the replicas
>> +s4 = box.schema.space.create('test4', {is_local = true, temporary = true})
> 
> You should test 'is_local' and 'tmemporary' separately now, as you
> changed the condition in on_replace_dd_truncate. Please fix.
> 

Do not spread the space:truncate() to replicas if the
affected space is local or temporary.

Closes #4263
---
Branch: 
https://github.com/tarantool/tarantool/tree/stanztt/gh-4263-no-replica-tmplocal-space
Issue: https://github.com/tarantool/tarantool/issues/4263

  src/box/alter.cc                       |  10 ++
  test/replication/local_spaces.result   | 129 +++++++++++++++++++++++++
  test/replication/local_spaces.test.lua |  51 ++++++++++
  3 files changed, 190 insertions(+)

diff --git a/src/box/alter.cc b/src/box/alter.cc
index a37a68ce4..e8a49cf98 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -2278,6 +2278,16 @@ on_replace_dd_truncate(struct trigger * /* 
trigger */, void *event)
  	auto scoped_guard =
  		make_scoped_guard([=] { alter_space_delete(alter); });

+	/*
+	 * Modify the WAL header to prohibit
+	 * replication of local & temporary
+	 * spaces truncation.
+	 */
+	if (space_is_temporary(old_space) ||
+	    space_group_id(old_space) == GROUP_LOCAL) {
+		stmt->row->group_id = GROUP_LOCAL;
+	}
+
  	/*
  	 * Recreate all indexes of the truncated space.
  	 */
diff --git a/test/replication/local_spaces.result 
b/test/replication/local_spaces.result
index ed1b76da8..6b4c1999d 100644
--- a/test/replication/local_spaces.result
+++ b/test/replication/local_spaces.result
@@ -71,6 +71,36 @@ s3.temporary
  ---
  - true
  ...
+-- gh-4263 The truncation of the local & temporary space
+-- should not spread among the replicas
+s4 = box.schema.space.create('test4', {is_local = true})
+---
+...
+_ = s4:create_index('pk')
+---
+...
+s4.is_local
+---
+- true
+...
+s4.temporary
+---
+- false
+...
+s5 = box.schema.space.create('test5', {temporary = true})
+---
+...
+_ = s5:create_index('pk')
+---
+...
+s5.is_local
+---
+- false
+...
+s5.temporary
+---
+- true
+...
  _ = s1:insert{1}
  ---
  ...
@@ -80,6 +110,12 @@ _ = s2:insert{1}
  _ = s3:insert{1}
  ---
  ...
+_ = s4:insert{1}
+---
+...
+_ = s5:insert{1}
+---
+...
  box.snapshot()
  ---
  - ok
@@ -93,6 +129,12 @@ _ = s2:insert{2}
  _ = s3:insert{2}
  ---
  ...
+_ = s4:insert{2}
+---
+...
+_ = s5:insert{2}
+---
+...
  box.schema.user.grant('guest', 'replication')
  ---
  ...
@@ -124,6 +166,22 @@ box.space.test3.temporary
  ---
  - true
  ...
+box.space.test4.is_local
+---
+- true
+...
+box.space.test4.temporary
+---
+- false
+...
+box.space.test5.is_local
+---
+- false
+...
+box.space.test5.temporary
+---
+- true
+...
  box.space.test1:select()
  ---
  - - [1]
@@ -137,6 +195,74 @@ box.space.test3:select()
  ---
  - []
  ...
+box.space.test4:select()
+---
+- []
+...
+box.space.test5:select()
+---
+- []
+...
+-- To check truncation fill replica's copy with 2 entries
+_=box.space.test4:insert{4}
+---
+...
+_=box.space.test4:insert{5}
+---
+...
+_=box.space.test5:insert{4}
+---
+...
+_=box.space.test5:insert{5}
+---
+...
+box.space.test4:select()
+---
+- - [4]
+  - [5]
+...
+box.space.test5:select()
+---
+- - [4]
+  - [5]
+...
+-- truncate temp & local space on master
+test_run:cmd("switch default")
+---
+- true
+...
+s4:truncate()
+---
+...
+s5:truncate()
+---
+...
+-- Expect two records
+box.space._truncate:count()
+---
+- 2
+...
+-- check truncation results on replica
+test_run:cmd("switch replica")
+---
+- true
+...
+-- Expect no records on replica
+box.space._truncate:count()
+---
+- 0
+...
+-- the affected space must be unchanged
+box.space.test4:select()
+---
+- - [4]
+  - [5]
+...
+box.space.test5:select()
+---
+- - [4]
+  - [5]
+...
  box.cfg{read_only = true} -- local spaces ignore read_only
  ---
  ...
@@ -253,3 +379,6 @@ s2:drop()
  s3:drop()
  ---
  ...
+s4:drop()
+---
+...
diff --git a/test/replication/local_spaces.test.lua 
b/test/replication/local_spaces.test.lua
index bb7294538..6e2ad2dcc 100644
--- a/test/replication/local_spaces.test.lua
+++ b/test/replication/local_spaces.test.lua
@@ -33,13 +33,30 @@ _ = s3:create_index('pk')
  s3.is_local
  s3.temporary

+-- gh-4263 The truncation of the local & temporary space
+-- should not spread among the replicas
+s4 = box.schema.space.create('test4', {is_local = true})
+_ = s4:create_index('pk')
+s4.is_local
+s4.temporary
+
+s5 = box.schema.space.create('test5', {temporary = true})
+_ = s5:create_index('pk')
+s5.is_local
+s5.temporary
+
  _ = s1:insert{1}
  _ = s2:insert{1}
  _ = s3:insert{1}
+_ = s4:insert{1}
+_ = s5:insert{1}
  box.snapshot()
  _ = s1:insert{2}
  _ = s2:insert{2}
  _ = s3:insert{2}
+_ = s4:insert{2}
+_ = s5:insert{2}
+

  box.schema.user.grant('guest', 'replication')
  test_run:cmd("create server replica with rpl_master=default, 
script='replication/replica.lua'")
@@ -50,9 +67,42 @@ box.space.test1.is_local
  box.space.test2.is_local
  box.space.test3.is_local
  box.space.test3.temporary
+box.space.test4.is_local
+box.space.test4.temporary
+box.space.test5.is_local
+box.space.test5.temporary
  box.space.test1:select()
  box.space.test2:select()
  box.space.test3:select()
+box.space.test4:select()
+box.space.test5:select()
+
+-- To check truncation fill replica's copy with 2 entries
+_=box.space.test4:insert{4}
+_=box.space.test4:insert{5}
+_=box.space.test5:insert{4}
+_=box.space.test5:insert{5}
+box.space.test4:select()
+box.space.test5:select()
+
+-- truncate temp & local space on master
+test_run:cmd("switch default")
+s4:truncate()
+s5:truncate()
+-- Expect two records
+box.space._truncate:count()
+
+-- check truncation results on replica
+test_run:cmd("switch replica")
+
+-- Expect no records on replica
+box.space._truncate:count()
+
+-- the affected space must be unchanged
+box.space.test4:select()
+box.space.test5:select()
+
+
  box.cfg{read_only = true} -- local spaces ignore read_only
  for i = 1, 3 do box.space.test2:insert{i, i} end
  for i = 1, 3 do box.space.test3:insert{i, i, i} end
@@ -87,3 +137,4 @@ s3:select()
  s1:drop()
  s2:drop()
  s3:drop()
+s4:drop()
-- 
2.17.1



More information about the Tarantool-patches mailing list