[patches] [PATCH vshard 1/5] On reconfig update internals only after success box.cfg
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Fri Mar 2 00:39:37 MSK 2018
If box.cfg fails, a new configuration is applied partially. It
is incorrect.
Signed-off-by: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
---
test/misc/reconfigure.result | 76 ++++++++++++++++++++++++++++++++++++++++++
test/misc/reconfigure.test.lua | 29 ++++++++++++++++
vshard/router/init.lua | 10 +++---
vshard/storage/init.lua | 23 ++++++++-----
4 files changed, 126 insertions(+), 12 deletions(-)
diff --git a/test/misc/reconfigure.result b/test/misc/reconfigure.result
index f873299..0a014a3 100644
--- a/test/misc/reconfigure.result
+++ b/test/misc/reconfigure.result
@@ -93,6 +93,54 @@ util.check_error(vshard.storage.cfg, cfg, 'unknow uuid')
- Local replica unknow uuid wasn't found in config
...
--
+-- Ensure that in a case of error storage internals are not
+-- changed.
+--
+not vshard.storage.internal.collect_lua_garbage
+---
+- true
+...
+cfg.collect_lua_garbage = true
+---
+...
+cfg.rebalancer_max_receiving = 1000
+---
+...
+cfg.collect_bucket_garbage_interval = 100
+---
+...
+cfg.invalid_option = 'kek'
+---
+...
+vshard.storage.cfg(cfg, names.storage_1_a)
+---
+- error: 'Incorrect value for option ''invalid_option'': unexpected option'
+...
+not vshard.storage.internal.collect_lua_garbage
+---
+- true
+...
+vshard.storage.internal.rebalancer_max_receiving ~= 1000
+---
+- true
+...
+vshard.storage.internal.collect_bucket_garbage_interval ~= 100
+---
+- true
+...
+cfg.collect_lua_garbage = nil
+---
+...
+cfg.rebalancer_max_receiving = nil
+---
+...
+cfg.collect_bucket_garbage_interval = nil
+---
+...
+cfg.invalid_option = nil
+---
+...
+--
-- gh-59: provide trigger on master enable/disable.
--
disable_count = 0
@@ -184,6 +232,34 @@ test_run:switch('router_1')
---
- true
...
+--
+-- Ensure that in a case of error router internals are not
+-- changed.
+--
+not vshard.router.internal.collect_lua_garbage
+---
+- true
+...
+cfg.collect_lua_garbage = true
+---
+...
+cfg.invalid_option = 'kek'
+---
+...
+vshard.router.cfg(cfg)
+---
+- error: 'Incorrect value for option ''invalid_option'': unexpected option'
+...
+not vshard.router.internal.collect_lua_garbage
+---
+- true
+...
+cfg.invalid_option = nil
+---
+...
+cfg.collect_lua_garbage = nil
+---
+...
vshard.router.cfg(cfg)
---
...
diff --git a/test/misc/reconfigure.test.lua b/test/misc/reconfigure.test.lua
index 65e7cef..033214a 100644
--- a/test/misc/reconfigure.test.lua
+++ b/test/misc/reconfigure.test.lua
@@ -36,6 +36,24 @@ test_run:cmd('switch storage_1_a')
util = require('util')
util.check_error(vshard.storage.cfg, cfg, 'unknow uuid')
+--
+-- Ensure that in a case of error storage internals are not
+-- changed.
+--
+not vshard.storage.internal.collect_lua_garbage
+cfg.collect_lua_garbage = true
+cfg.rebalancer_max_receiving = 1000
+cfg.collect_bucket_garbage_interval = 100
+cfg.invalid_option = 'kek'
+vshard.storage.cfg(cfg, names.storage_1_a)
+not vshard.storage.internal.collect_lua_garbage
+vshard.storage.internal.rebalancer_max_receiving ~= 1000
+vshard.storage.internal.collect_bucket_garbage_interval ~= 100
+cfg.collect_lua_garbage = nil
+cfg.rebalancer_max_receiving = nil
+cfg.collect_bucket_garbage_interval = nil
+cfg.invalid_option = nil
+
--
-- gh-59: provide trigger on master enable/disable.
--
@@ -73,6 +91,17 @@ test_run:switch('storage_2_b')
vshard.storage.cfg(cfg, names['storage_2_b'])
test_run:switch('router_1')
+--
+-- Ensure that in a case of error router internals are not
+-- changed.
+--
+not vshard.router.internal.collect_lua_garbage
+cfg.collect_lua_garbage = true
+cfg.invalid_option = 'kek'
+vshard.router.cfg(cfg)
+not vshard.router.internal.collect_lua_garbage
+cfg.invalid_option = nil
+cfg.collect_lua_garbage = nil
vshard.router.cfg(cfg)
test_run:cmd('switch default')
diff --git a/vshard/router/init.lua b/vshard/router/init.lua
index c01cb5a..eb12edf 100644
--- a/vshard/router/init.lua
+++ b/vshard/router/init.lua
@@ -492,10 +492,8 @@ local function router_cfg(cfg)
log.info('Starting router reconfiguration')
end
local new_replicasets = lreplicaset.buildall(cfg)
- -- TODO: update existing route map in-place
- M.route_map = {}
- M.total_bucket_count = cfg.bucket_count
- M.collect_lua_garbage = cfg.collect_lua_garbage
+ local total_bucket_count = cfg.bucket_count
+ local collect_lua_garbage = cfg.collect_lua_garbage
lcfg.remove_non_box_options(cfg)
-- Force net.box connection on cfg()
for _, replicaset in pairs(new_replicasets) do
@@ -509,6 +507,10 @@ local function router_cfg(cfg)
end
box.cfg(cfg)
log.info("Box has been configured")
+ M.total_bucket_count = total_bucket_count
+ M.collect_lua_garbage = collect_lua_garbage
+ -- TODO: update existing route map in-place
+ M.route_map = {}
M.replicasets = new_replicasets
if M.failover_fiber == nil then
log.info('Start failover fiber')
diff --git a/vshard/storage/init.lua b/vshard/storage/init.lua
index 7c978b8..408e559 100644
--- a/vshard/storage/init.lua
+++ b/vshard/storage/init.lua
@@ -1342,21 +1342,28 @@ local function storage_cfg(cfg, this_replica_uuid)
end
cfg.instance_uuid = this_replica.uuid
cfg.replicaset_uuid = this_replicaset.uuid
- M.total_bucket_count = cfg.bucket_count
- M.rebalancer_disbalance_threshold = cfg.rebalancer_disbalance_threshold
- M.rebalancer_max_receiving = cfg.rebalancer_max_receiving
- M.shard_index = cfg.shard_index
- M.collect_bucket_garbage_interval = cfg.collect_bucket_garbage_interval
- M.collect_lua_garbage = cfg.collect_lua_garbage
+ local total_bucket_count = cfg.bucket_count
+ local rebalancer_disbalance_threshold = cfg.rebalancer_disbalance_threshold
+ local rebalancer_max_receiving = cfg.rebalancer_max_receiving
+ local shard_index = cfg.shard_index
+ local collect_bucket_garbage_interval = cfg.collect_bucket_garbage_interval
+ local collect_lua_garbage = cfg.collect_lua_garbage
lcfg.remove_non_box_options(cfg)
box.cfg(cfg)
log.info("Box has been configured")
+ local uri = luri.parse(this_replica.uri)
+ box.once("vshard:storage:1", storage_schema_v1, uri.login, uri.password)
+
M.replicasets = new_replicasets
M.this_replicaset = this_replicaset
M.this_replica = this_replica
- local uri = luri.parse(this_replica.uri)
- box.once("vshard:storage:1", storage_schema_v1, uri.login, uri.password)
+ M.total_bucket_count = total_bucket_count
+ M.rebalancer_disbalance_threshold = rebalancer_disbalance_threshold
+ M.rebalancer_max_receiving = rebalancer_max_receiving
+ M.shard_index = shard_index
+ M.collect_bucket_garbage_interval = collect_bucket_garbage_interval
+ M.collect_lua_garbage = collect_lua_garbage
if was_master and not is_master then
local_on_master_disable()
--
2.14.3 (Apple Git-98)
More information about the Tarantool-patches
mailing list