From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id A79D923F32 for ; Wed, 27 Jun 2018 15:25:58 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 55V6d7i2ZsyA for ; Wed, 27 Jun 2018 15:25:58 -0400 (EDT) Received: from smtp41.i.mail.ru (smtp41.i.mail.ru [94.100.177.101]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id DCBCD23DEA for ; Wed, 27 Jun 2018 15:25:57 -0400 (EDT) Subject: [tarantool-patches] Re: [PATCH][vshard] Prohibit reconfigure non-dynamic options References: <20180615140225.2576-1-avkhatskevich@tarantool.org> <92d28edf-8237-c499-3ff0-e9795d8ff845@tarantool.org> <9d1392dc-c923-4e49-b3b5-41ad7d099ccd@tarantool.org> <161cd93f-0c72-181d-c9ab-23c9e8be1de3@tarantool.org> From: Alex Khatskevich Message-ID: Date: Wed, 27 Jun 2018 22:25:50 +0300 MIME-Version: 1.0 In-Reply-To: <161cd93f-0c72-181d-c9ab-23c9e8be1de3@tarantool.org> Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: Vladislav Shpilevoy , tarantool-patches@freelists.org The issue is solved. I had to make bucket_cnt common for all tests in `rebalancer` folder. Here is a full diff: commit e9219cd33ea78d8dcbe18eb66a5216643af114e0 Author: AKhatskevich Date:   Fri Jun 15 16:53:06 2018 +0300     Prohibit reconfigure non-dynamic options     By now there are two non-dynamic options:      * bucket_count      * shard_index     They cannot be changed by passing a new value to     router/storage.cfg.     Extra changes:      * bucket_count for test/rebalancer/* was changed to 200:        1. After this commit it is impossible reconfigure bucket_count           and it should be common for all tests which uses common cfg.        2. 200 was choosed, because time to run some of the tests depends           on the number.     Closes #114 diff --git a/test/rebalancer/box_1_a.lua b/test/rebalancer/box_1_a.lua index 8fddcf0..6d33978 100644 --- a/test/rebalancer/box_1_a.lua +++ b/test/rebalancer/box_1_a.lua @@ -21,6 +21,8 @@ if NAME == 'box_4_a' or NAME == 'box_4_b' or     string.match(NAME, 'fullbox') then      add_second_replicaset()  end +-- Use small number of buckets to speedup tests. +cfg.bucket_count = 200  vshard.storage.cfg(cfg, names.replica_uuid[NAME])  function init_schema() diff --git a/test/rebalancer/rebalancer_lock_and_pin.result b/test/rebalancer/rebalancer_lock_and_pin.result index 95a160a..58583b1 100644 --- a/test/rebalancer/rebalancer_lock_and_pin.result +++ b/test/rebalancer/rebalancer_lock_and_pin.result @@ -33,7 +33,7 @@ test_run:switch('box_2_a')  ---  - true  ... -vshard.storage.bucket_force_create(1501, 1500) +vshard.storage.bucket_force_create(101, 100)  ---  - true  ... @@ -41,7 +41,7 @@ test_run:switch('box_1_a')  ---  - true  ... -vshard.storage.bucket_force_create(1, 1500) +vshard.storage.bucket_force_create(1, 100)  ---  - true  ... @@ -97,7 +97,7 @@ info = vshard.storage.info().bucket  ...  info.active  --- -- 1500 +- 100  ...  info.lock  --- @@ -135,7 +135,7 @@ info = vshard.storage.info().bucket  ...  info.active  --- -- 1500 +- 100  ...  info.lock  --- @@ -278,7 +278,7 @@ info = vshard.storage.info().bucket  ...  info.active  --- -- 1500 +- 100  ...  info.lock  --- @@ -290,7 +290,7 @@ test_run:switch('box_2_a')  ...  vshard.storage.info().bucket.active  --- -- 500 +- 34  ...  test_run:switch('box_3_a')  --- @@ -298,7 +298,7 @@ test_run:switch('box_3_a')  ...  vshard.storage.info().bucket.active  --- -- 1000 +- 66  ...  --  -- Test bucket pinning. At first, return to the default @@ -366,7 +366,7 @@ wait_rebalancer_state('The cluster is balanced ok', test_run)  ...  vshard.storage.info().bucket.active  --- -- 1000 +- 67  ...  status = box.space._bucket.index.status  --- @@ -443,12 +443,12 @@ test_run:cmd("setopt delimiter ''");  -- rebalancer will face with unreachability of the perfect  -- balance.  -- -for i = 1, 800 do local ok, err = vshard.storage.bucket_pin(first_id - 1 + i) assert(ok) end +for i = 1, 60 do local ok, err = vshard.storage.bucket_pin(first_id - 1 + i) assert(ok) end  ---  ...  status:count({vshard.consts.BUCKET.PINNED})  --- -- 800 +- 60  ...  rs1_cfg.weight = 0.5  --- @@ -466,11 +466,11 @@ info = vshard.storage.info().bucket  ...  info.active  --- -- 800 +- 60  ...  info.pinned  --- -- 800 +- 60  ...  test_run:switch('box_2_a')  --- @@ -478,7 +478,7 @@ test_run:switch('box_2_a')  ...  vshard.storage.info().bucket.active  --- -- 1100 +- 70  ...  test_run:switch('box_3_a')  --- @@ -486,7 +486,7 @@ test_run:switch('box_3_a')  ...  vshard.storage.info().bucket.active  --- -- 1100 +- 70  ...  test_run:cmd("switch default")  --- diff --git a/test/rebalancer/rebalancer_lock_and_pin.test.lua b/test/rebalancer/rebalancer_lock_and_pin.test.lua index afef135..eae42fb 100644 --- a/test/rebalancer/rebalancer_lock_and_pin.test.lua +++ b/test/rebalancer/rebalancer_lock_and_pin.test.lua @@ -16,10 +16,10 @@ util.wait_master(test_run, REPLICASET_2, 'box_2_a')  --  test_run:switch('box_2_a') -vshard.storage.bucket_force_create(1501, 1500) +vshard.storage.bucket_force_create(101, 100)  test_run:switch('box_1_a') -vshard.storage.bucket_force_create(1, 1500) +vshard.storage.bucket_force_create(1, 100)  wait_rebalancer_state('The cluster is balanced ok', test_run) @@ -202,7 +202,7 @@ test_run:cmd("setopt delimiter ''");  -- rebalancer will face with unreachability of the perfect  -- balance.  -- -for i = 1, 800 do local ok, err = vshard.storage.bucket_pin(first_id - 1 + i) assert(ok) end +for i = 1, 60 do local ok, err = vshard.storage.bucket_pin(first_id - 1 + i) assert(ok) end  status:count({vshard.consts.BUCKET.PINNED})  rs1_cfg.weight = 0.5  vshard.storage.cfg(cfg, names.replica_uuid.box_1_a) diff --git a/test/rebalancer/restart_during_rebalancing.result b/test/rebalancer/restart_during_rebalancing.result index 2c2e3ec..84ef6c1 100644 --- a/test/rebalancer/restart_during_rebalancing.result +++ b/test/rebalancer/restart_during_rebalancing.result @@ -83,7 +83,7 @@ log = require('log')  log.info(string.rep('a', 1000))  ---  ... -for i = 1, vshard.consts.DEFAULT_BUCKET_COUNT do box.space._bucket:replace({i, vshard.consts.BUCKET.ACTIVE}) end +for i = 1, 200 do box.space._bucket:replace({i, vshard.consts.BUCKET.ACTIVE}) end  ---  ...  test_run:switch('router_1') @@ -93,7 +93,7 @@ test_run:switch('router_1')  util = require('rebalancer_utils')  ---  ... -util.set_bucket_count(vshard.consts.DEFAULT_BUCKET_COUNT) +util.set_bucket_count(200)  ---  ...  for i = 1, 4 do vshard.router.discovery_wakeup() end @@ -201,7 +201,7 @@ test_run:switch('router_1')  start = fiber.time()  ---  ... -while vshard.router.info().bucket.available_rw ~= vshard.consts.DEFAULT_BUCKET_COUNT do vshard.router.discovery_wakeup() fiber.sleep(0.1) end +while vshard.router.info().bucket.available_rw ~= 200 do vshard.router.discovery_wakeup() fiber.sleep(0.1) end  ---  ...  fiber.sleep(10 - (fiber.time() - start)) @@ -234,7 +234,7 @@ info          uri: storage@127.0.0.1:3305          uuid: ad40a200-730e-401a-9400-30dbd96dedbd        bucket: -        available_rw: 750 +        available_rw: 50        uuid: ffdfc117-5089-40a8-99f5-0aa914aa2275        master: *0      3e9bdda9-ce19-4f9f-b630-116f5dbc7fef: @@ -244,7 +244,7 @@ info          uri: storage@127.0.0.1:3307          uuid: 535df17b-c325-466c-9320-77f1190c749c        bucket: -        available_rw: 750 +        available_rw: 50        uuid: 3e9bdda9-ce19-4f9f-b630-116f5dbc7fef        master: *1      739fe4fb-2850-4cde-9637-10150724c5eb: @@ -254,7 +254,7 @@ info          uri: storage@127.0.0.1:3301          uuid: 3e01062d-5c1b-4382-b14e-f80a517cb462        bucket: -        available_rw: 750 +        available_rw: 50        uuid: 739fe4fb-2850-4cde-9637-10150724c5eb        master: *2      832bbba0-9699-4aa1-907d-c7c7af61f5c9: @@ -264,14 +264,14 @@ info          uri: storage@127.0.0.1:3303          uuid: 7223fc89-1a0d-480b-a33e-a8d2b117b13d        bucket: -        available_rw: 750 +        available_rw: 50        uuid: 832bbba0-9699-4aa1-907d-c7c7af61f5c9        master: *3    bucket:      unreachable: 0      available_ro: 0      unknown: 0 -    available_rw: 3000 +    available_rw: 200    status: 0    alerts: []  ... @@ -289,8 +289,8 @@ test_run:switch('fullbox_1_a')  vshard.storage.info().bucket  ---  - receiving: 0 -  active: 750 -  total: 750 +  active: 50 +  total: 50    garbage: 0    pinned: 0    sending: 0 @@ -310,8 +310,8 @@ test_run:switch('fullbox_2_a')  vshard.storage.info().bucket  ---  - receiving: 0 -  active: 750 -  total: 750 +  active: 50 +  total: 50    garbage: 0    pinned: 0    sending: 0 @@ -331,8 +331,8 @@ test_run:switch('fullbox_3_a')  vshard.storage.info().bucket  ---  - receiving: 0 -  active: 750 -  total: 750 +  active: 50 +  total: 50    garbage: 0    pinned: 0    sending: 0 @@ -352,8 +352,8 @@ test_run:switch('fullbox_4_a')  vshard.storage.info().bucket  ---  - receiving: 0 -  active: 750 -  total: 750 +  active: 50 +  total: 50    garbage: 0    pinned: 0    sending: 0 diff --git a/test/rebalancer/restart_during_rebalancing.test.lua b/test/rebalancer/restart_during_rebalancing.test.lua index fdd086c..397d181 100644 --- a/test/rebalancer/restart_during_rebalancing.test.lua +++ b/test/rebalancer/restart_during_rebalancing.test.lua @@ -36,11 +36,11 @@ test_run:switch('fullbox_1_a')  vshard.storage.rebalancer_disable()  log = require('log')  log.info(string.rep('a', 1000)) -for i = 1, vshard.consts.DEFAULT_BUCKET_COUNT do box.space._bucket:replace({i, vshard.consts.BUCKET.ACTIVE}) end +for i = 1, 200 do box.space._bucket:replace({i, vshard.consts.BUCKET.ACTIVE}) end  test_run:switch('router_1')  util = require('rebalancer_utils') -util.set_bucket_count(vshard.consts.DEFAULT_BUCKET_COUNT) +util.set_bucket_count(200)  for i = 1, 4 do vshard.router.discovery_wakeup() end  util.start_loading()  fiber.sleep(2) @@ -105,7 +105,7 @@ while killer:status() ~= 'dead' do fiber.sleep(0.1) end  test_run:switch('router_1')  -- Wait until all GC, recovery-discovery finish work.  start = fiber.time() -while vshard.router.info().bucket.available_rw ~= vshard.consts.DEFAULT_BUCKET_COUNT do vshard.router.discovery_wakeup() fiber.sleep(0.1) end +while vshard.router.info().bucket.available_rw ~= 200 do vshard.router.discovery_wakeup() fiber.sleep(0.1) end  fiber.sleep(10 - (fiber.time() - start))  info = vshard.router.info()  -- Do not show concrete timeouts. They are not stable. diff --git a/test/rebalancer/router_1.lua b/test/rebalancer/router_1.lua index 5ad944b..5fe6dc7 100644 --- a/test/rebalancer/router_1.lua +++ b/test/rebalancer/router_1.lua @@ -9,6 +9,8 @@ rs_uuid = names.rs_uuid  replica_uuid = names.replica_uuid  box.cfg{listen = 3333} +-- Use small number of buckets to speedup tests. +cfg.bucket_count = 200  vshard.router.cfg(cfg)  require('console').listen(os.getenv('ADMIN')) diff --git a/test/rebalancer/stress_add_remove_rs.result b/test/rebalancer/stress_add_remove_rs.result index 02263ea..8a955e2 100644 --- a/test/rebalancer/stress_add_remove_rs.result +++ b/test/rebalancer/stress_add_remove_rs.result @@ -50,16 +50,13 @@ test_run:switch('box_2_a')  ---  - true  ... -for i = 1, 100 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end +for i = 1, 200 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end  ---  ...  test_run:switch('box_1_a')  ---  - true  ... -cfg.bucket_count = 100 ---- -...  vshard.storage.cfg(cfg, names.replica_uuid.box_1_a)  ---  ... @@ -68,7 +65,7 @@ wait_rebalancer_state('The cluster is balanced ok', test_run)  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 50 +- 100  ...  --  -- Test the first case of described above. @@ -80,9 +77,6 @@ test_run:switch('router_1')  util = require('rebalancer_utils')  ---  ... -cfg.bucket_count = 100 ---- -...  vshard.router.cfg(cfg)  ---  ... @@ -176,7 +170,7 @@ wait_rebalancer_state('The cluster is balanced ok', test_run)  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 33 +- 67  ...  test_run:switch('router_1')  --- @@ -195,7 +189,7 @@ test_run:switch('box_1_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 33 +- 67  ...  check_consistency()  --- @@ -207,7 +201,7 @@ test_run:switch('box_2_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 34 +- 67  ...  check_consistency()  --- @@ -219,7 +213,7 @@ test_run:switch('box_3_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 33 +- 66  ...  check_consistency()  --- @@ -354,7 +348,7 @@ test_run:switch('box_1_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 50 +- 100  ...  check_consistency()  --- @@ -366,7 +360,7 @@ test_run:switch('box_2_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 50 +- 100  ...  check_consistency()  --- diff --git a/test/rebalancer/stress_add_remove_rs.test.lua b/test/rebalancer/stress_add_remove_rs.test.lua index 342751e..c80df40 100644 --- a/test/rebalancer/stress_add_remove_rs.test.lua +++ b/test/rebalancer/stress_add_remove_rs.test.lua @@ -24,9 +24,8 @@ test_run:switch('router_1')  -- data, that were written during the step execution.  --  test_run:switch('box_2_a') -for i = 1, 100 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end +for i = 1, 200 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end  test_run:switch('box_1_a') -cfg.bucket_count = 100  vshard.storage.cfg(cfg, names.replica_uuid.box_1_a)  wait_rebalancer_state('The cluster is balanced ok', test_run)  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE} @@ -36,7 +35,6 @@ wait_rebalancer_state('The cluster is balanced ok', test_run)  --  test_run:switch('router_1')  util = require('rebalancer_utils') -cfg.bucket_count = 100  vshard.router.cfg(cfg)  vshard.router.discovery_wakeup()  util.start_loading() diff --git a/test/rebalancer/stress_add_remove_several_rs.result b/test/rebalancer/stress_add_remove_several_rs.result index 79639b3..d6008b8 100644 --- a/test/rebalancer/stress_add_remove_several_rs.result +++ b/test/rebalancer/stress_add_remove_several_rs.result @@ -54,25 +54,19 @@ test_run:switch('box_2_a')  ---  - true  ... -cfg.bucket_count = 100 ---- -...  cfg.rebalancer_max_receiving = 2  ---  ...  vshard.storage.cfg(cfg, names.replica_uuid.box_2_a)  ---  ... -for i = 1, 100 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end +for i = 1, 200 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end  ---  ...  test_run:switch('box_1_a')  ---  - true  ... -cfg.bucket_count = 100 ---- -...  cfg.rebalancer_max_receiving = 2  ---  ... @@ -89,9 +83,6 @@ test_run:switch('router_1')  util = require('rebalancer_utils')  ---  ... -cfg.bucket_count = 100 ---- -...  vshard.router.cfg(cfg)  ---  ... @@ -303,7 +294,7 @@ test_run:switch('box_1_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 25 +- 50  ...  check_consistency()  --- @@ -315,7 +306,7 @@ test_run:switch('box_2_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 25 +- 50  ...  check_consistency()  --- @@ -327,7 +318,7 @@ test_run:switch('box_3_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 25 +- 50  ...  check_consistency()  --- @@ -339,7 +330,7 @@ test_run:switch('box_4_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 25 +- 50  ...  check_consistency()  --- @@ -496,7 +487,7 @@ test_run:switch('box_1_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 50 +- 100  ...  check_consistency()  --- @@ -508,7 +499,7 @@ test_run:switch('box_2_a')  ...  #box.space._bucket.index.status:select{vshard.consts.BUCKET.ACTIVE}  --- -- 50 +- 100  ...  check_consistency()  --- diff --git a/test/rebalancer/stress_add_remove_several_rs.test.lua b/test/rebalancer/stress_add_remove_several_rs.test.lua index 3895363..3cc105e 100644 --- a/test/rebalancer/stress_add_remove_several_rs.test.lua +++ b/test/rebalancer/stress_add_remove_several_rs.test.lua @@ -27,20 +27,17 @@ test_run:switch('router_1')  --  test_run:switch('box_2_a') -cfg.bucket_count = 100  cfg.rebalancer_max_receiving = 2  vshard.storage.cfg(cfg, names.replica_uuid.box_2_a) -for i = 1, 100 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end +for i = 1, 200 do box.space._bucket:replace{i, vshard.consts.BUCKET.ACTIVE} end  test_run:switch('box_1_a') -cfg.bucket_count = 100  cfg.rebalancer_max_receiving = 2  vshard.storage.cfg(cfg, names.replica_uuid.box_1_a)  wait_rebalancer_state('The cluster is balanced ok', test_run)  test_run:switch('router_1')  util = require('rebalancer_utils') -cfg.bucket_count = 100  vshard.router.cfg(cfg)  vshard.router.discovery_wakeup()  util.start_loading() diff --git a/test/router/router.result b/test/router/router.result index 2ee1bff..ab1808d 100644 --- a/test/router/router.result +++ b/test/router/router.result @@ -1057,6 +1057,17 @@ error_messages  - - Use replica:is_connected(...) instead of replica.is_connected(...)    - Use replica:safe_uri(...) instead of replica.safe_uri(...)  ... +-- gh-114: Check non-dynamic option change during reconfigure. +non_dynamic_cfg = table.copy(cfg) +--- +... +non_dynamic_cfg.shard_index = 'non_default_name' +--- +... +util.check_error(vshard.router.cfg, non_dynamic_cfg) +--- +- Non-dynamic option shard_index cannot be reconfigured +...  _ = test_run:cmd("switch default")  ---  ... diff --git a/test/router/router.test.lua b/test/router/router.test.lua index fae8e24..63616cd 100644 --- a/test/router/router.test.lua +++ b/test/router/router.test.lua @@ -389,6 +389,11 @@ end;  test_run:cmd("setopt delimiter ''");  error_messages +-- gh-114: Check non-dynamic option change during reconfigure. +non_dynamic_cfg = table.copy(cfg) +non_dynamic_cfg.shard_index = 'non_default_name' +util.check_error(vshard.router.cfg, non_dynamic_cfg) +  _ = test_run:cmd("switch default")  test_run:drop_cluster(REPLICASET_2) diff --git a/test/storage/storage.result b/test/storage/storage.result index d0bf792..5685ccf 100644 --- a/test/storage/storage.result +++ b/test/storage/storage.result @@ -720,6 +720,17 @@ test_run:cmd("setopt delimiter ''");  ---  - true  ... +-- gh-114: Check non-dynamic option change during reconfigure. +non_dynamic_cfg = table.copy(cfg) +--- +... +non_dynamic_cfg.bucket_count = require('vshard.consts').DEFAULT_BUCKET_COUNT + 1 +--- +... +util.check_error(vshard.storage.cfg, non_dynamic_cfg, names.storage_1_a) +--- +- Non-dynamic option bucket_count cannot be reconfigured +...  _ = test_run:cmd("switch default")  ---  ... diff --git a/test/storage/storage.test.lua b/test/storage/storage.test.lua index f4bbf0e..72564e1 100644 --- a/test/storage/storage.test.lua +++ b/test/storage/storage.test.lua @@ -177,6 +177,11 @@ for _, new_replicaset in pairs(new_replicasets) do  end;  test_run:cmd("setopt delimiter ''"); +-- gh-114: Check non-dynamic option change during reconfigure. +non_dynamic_cfg = table.copy(cfg) +non_dynamic_cfg.bucket_count = require('vshard.consts').DEFAULT_BUCKET_COUNT + 1 +util.check_error(vshard.storage.cfg, non_dynamic_cfg, names.storage_1_a) +  _ = test_run:cmd("switch default")  test_run:drop_cluster(REPLICASET_2) diff --git a/test/unit/config.result b/test/unit/config.result index d3b9a23..10237ee 100644 --- a/test/unit/config.result +++ b/test/unit/config.result @@ -546,3 +546,17 @@ lcfg.check(cfg)['sharding']  replica.url = old_uri  ---  ... +-- gh-114: Check non-dynamic option change during reconfigure. +cfg_with_non_default = table.copy(cfg) +--- +... +cfg.shard_index = nil +--- +... +cfg_with_non_default.shard_index = 'non_default_name' +--- +... +util.check_error(lcfg.check, cfg, cfg_with_non_default) +--- +- Non-dynamic option shard_index cannot be reconfigured +... diff --git a/test/unit/config.test.lua b/test/unit/config.test.lua index fd62707..3361766 100644 --- a/test/unit/config.test.lua +++ b/test/unit/config.test.lua @@ -217,3 +217,9 @@ lcfg.check(cfg)['sharding']  replica.uri = 'user:password@localhost'  lcfg.check(cfg)['sharding']  replica.url = old_uri + +-- gh-114: Check non-dynamic option change during reconfigure. +cfg_with_non_default = table.copy(cfg) +cfg.shard_index = nil +cfg_with_non_default.shard_index = 'non_default_name' +util.check_error(lcfg.check, cfg, cfg_with_non_default) diff --git a/vshard/cfg.lua b/vshard/cfg.lua index caaf19f..d5429af 100644 --- a/vshard/cfg.lua +++ b/vshard/cfg.lua @@ -219,16 +219,34 @@ local cfg_template = {      }},  } +-- +-- Names of options which cannot be changed during reconfigure. +-- +local non_dynamic_options = { +    'bucket_count', 'shard_index' +} +  --  -- Check sharding config on correctness. Check types, name and uri --- uniqueness, master count (in each replicaset must by <= 1). +-- uniqueness, master count (in each replicaset must be <= 1).  -- -local function cfg_check(shard_cfg) +local function cfg_check(shard_cfg, old_cfg)      if type(shard_cfg) ~= 'table' then          error('Сonfig must be map of options')      end      shard_cfg = table.deepcopy(shard_cfg)      validate_config(shard_cfg, cfg_template) +    if not old_cfg then +        return shard_cfg +    end +    -- Check non-dynamic after default values are added. +    for _, f_name in pairs(non_dynamic_options) do +        -- New option may be added in new vshard version. +        if shard_cfg[f_name] ~= old_cfg[f_name] then +           error(string.format('Non-dynamic option %s ' .. +                               'cannot be reconfigured', f_name)) +        end +    end      return shard_cfg  end diff --git a/vshard/router/init.lua b/vshard/router/init.lua index 21093e5..fc4714d 100644 --- a/vshard/router/init.lua +++ b/vshard/router/init.lua @@ -457,7 +457,8 @@ end  --------------------------------------------------------------------------------  local function router_cfg(cfg) -    cfg = lcfg.check(cfg) +    cfg = lcfg.check(cfg, M.current_cfg) +    local new_cfg = table.copy(cfg)      if not M.replicasets then          log.info('Starting router configuration')      else @@ -478,6 +479,7 @@ local function router_cfg(cfg)      -- TODO: update existing route map in-place      M.route_map = {}      M.replicasets = new_replicasets +    M.current_cfg = new_cfg      -- Move connections from an old configuration to a new one.      -- It must be done with no yields to prevent usage both of not      -- fully moved old replicasets, and not fully built new ones. diff --git a/vshard/storage/init.lua b/vshard/storage/init.lua index c80bfbf..6e1194a 100644 --- a/vshard/storage/init.lua +++ b/vshard/storage/init.lua @@ -1452,7 +1452,8 @@ local function storage_cfg(cfg, this_replica_uuid)      if this_replica_uuid == nil then          error('Usage: cfg(configuration, this_replica_uuid)')      end -    cfg = lcfg.check(cfg) +    cfg = lcfg.check(cfg, M.current_cfg) +    local new_cfg = table.copy(cfg)      if cfg.weights or cfg.zone then          error('Weights and zone are not allowed for storage configuration')      end @@ -1578,6 +1579,7 @@ local function storage_cfg(cfg, this_replica_uuid)      M.shard_index = shard_index      M.collect_bucket_garbage_interval = collect_bucket_garbage_interval      M.collect_lua_garbage = collect_lua_garbage +    M.current_cfg = new_cfg      if was_master and not is_master then          local_on_master_disable()