[Tarantool-patches] [PATCH 4/9] storage: bucket_recv() should check rs lock

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Wed Feb 10 02:46:10 MSK 2021


Locked replicaset (via config) should not allow any bucket moves
from or to the replicaset.

But the lock check was only done by bucket_send(). Bucket_recv()
allowed to receive a bucket even if the replicaset is locked. The
patch fixes it.

It didn't affect automatic bucket sends, because lock is
accounted by the rebalancer from the config. Only manual bucket
moves could have this bug.
---
 test/rebalancer/rebalancer_lock_and_pin.result   | 14 ++++++++++++++
 test/rebalancer/rebalancer_lock_and_pin.test.lua |  4 ++++
 vshard/storage/init.lua                          |  3 +++
 3 files changed, 21 insertions(+)

diff --git a/test/rebalancer/rebalancer_lock_and_pin.result b/test/rebalancer/rebalancer_lock_and_pin.result
index 51dd36e..0bb4f45 100644
--- a/test/rebalancer/rebalancer_lock_and_pin.result
+++ b/test/rebalancer/rebalancer_lock_and_pin.result
@@ -156,6 +156,20 @@ vshard.storage.bucket_send(1, util.replicasets[2])
   message: Replicaset is locked
   code: 19
 ...
+test_run:switch('box_2_a')
+---
+- true
+...
+-- Does not allow to receive either. Send from a non-locked replicaset to a
+-- locked one fails.
+vshard.storage.bucket_send(101, util.replicasets[1])
+---
+- null
+- type: ShardingError
+  code: 19
+  name: REPLICASET_IS_LOCKED
+  message: Replicaset is locked
+...
 --
 -- Vshard ensures that if a replicaset is locked, then it will not
 -- allow to change its bucket set even if a rebalancer does not
diff --git a/test/rebalancer/rebalancer_lock_and_pin.test.lua b/test/rebalancer/rebalancer_lock_and_pin.test.lua
index c3412c1..7b87004 100644
--- a/test/rebalancer/rebalancer_lock_and_pin.test.lua
+++ b/test/rebalancer/rebalancer_lock_and_pin.test.lua
@@ -69,6 +69,10 @@ info.lock
 -- explicitly.
 --
 vshard.storage.bucket_send(1, util.replicasets[2])
+test_run:switch('box_2_a')
+-- Does not allow to receive either. Send from a non-locked replicaset to a
+-- locked one fails.
+vshard.storage.bucket_send(101, util.replicasets[1])
 
 --
 -- Vshard ensures that if a replicaset is locked, then it will not
diff --git a/vshard/storage/init.lua b/vshard/storage/init.lua
index c7335fc..298df71 100644
--- a/vshard/storage/init.lua
+++ b/vshard/storage/init.lua
@@ -995,6 +995,9 @@ local function bucket_recv_xc(bucket_id, from, data, opts)
             return nil, lerror.vshard(lerror.code.WRONG_BUCKET, bucket_id, msg,
                                       from)
         end
+        if is_this_replicaset_locked() then
+            return nil, lerror.vshard(lerror.code.REPLICASET_IS_LOCKED)
+        end
         if not bucket_receiving_quota_add(-1) then
             return nil, lerror.vshard(lerror.code.TOO_MANY_RECEIVING)
         end
-- 
2.24.3 (Apple Git-128)



More information about the Tarantool-patches mailing list