[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