[patches] [PATCH vshard 1/1] Introduce generic configuration validator

Georgy Kirichenko georgy at tarantool.org
Mon Feb 26 21:57:06 MSK 2018


Ok to push

On Sunday, February 25, 2018 10:51:19 PM MSK Vladislav Shpilevoy wrote:
> The more constants become options, the more duplicated code
> appears in cfg.lua to validate options and in
> storage(router)/init.lua to fill default values.
> 
> Allow to specify these options in congiguration templates like it
> is done in Tarantool for box.cfg, create_space, create_index ...
> And fill optional and absent values with default ones specified
> in a template.
> 
> Closes #78
> 
> Signed-off-by: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
> ---
>  test/unit/config.result   |  72 ++++++-------
>  test/unit/config.test.lua |  24 ++---
>  vshard/cfg.lua            | 262
> ++++++++++++++++++++++++++++------------------ vshard/router/init.lua    | 
>  7 +-
>  vshard/storage/init.lua   |  20 ++--
>  5 files changed, 218 insertions(+), 167 deletions(-)
> 
> diff --git a/test/unit/config.result b/test/unit/config.result
> index 99a77b6..2a5473c 100644
> --- a/test/unit/config.result
> +++ b/test/unit/config.result
> @@ -24,7 +24,7 @@ check(100)
>  -- Sharding is not a table.
>  check({sharding = 100})
>  ---
> -- Sharding config must be array of replicasets
> +- Sharding must be table
>  ...
>  -- Replicaset is not table.
>  check({sharding = {100}})
> @@ -43,14 +43,14 @@ cfg = {sharding = {['replicaset_uuid'] = replicaset}}
>  -- URI is not string.
>  check(cfg)
>  ---
> -- replica uri must be string
> +- URI must be specified
>  ...
>  replica.uri = 100
>  ---
>  ...
>  check(cfg)
>  ---
> -- replica uri must be string
> +- URI must be non-empty string
>  ...
>  replica.uri = 'uri:uri at uri'
>  ---
> @@ -58,14 +58,14 @@ replica.uri = 'uri:uri at uri'
>  -- Name is not string.
>  check(cfg)
>  ---
> -- replica name must be string
> +- Name must be specified
>  ...
>  replica.name = 100
>  ---
>  ...
>  check(cfg)
>  ---
> -- replica name must be string
> +- Name must be string
>  ...
>  replica.name = 'storage'
>  ---
> @@ -76,7 +76,7 @@ replica.master = 100
>  ...
>  check(cfg)
>  ---
> -- '"master" must be boolean'
> +- Master must be boolean
>  ...
>  replica.master = true
>  ---
> @@ -155,31 +155,31 @@ replicaset.weight = '100'
>  ...
>  check(cfg)
>  ---
> -- Replicaset weight must be either nil or non-negative number
> +- Weight must be non-negative number
>  ...
>  replicaset.weight = -100
>  ---
>  ...
>  check(cfg)
>  ---
> -- Replicaset weight must be either nil or non-negative number
> +- Weight must be non-negative number
>  ...
>  replicaset.weight = 0
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  replicaset.weight = 0.123
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  replicaset.weight = 100000
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  --
> @@ -190,14 +190,14 @@ cfg.weights = 100
>  ...
>  check(cfg)
>  ---
> -- weights must be map of maps
> +- Weight matrix must be table
>  ...
>  cfg.weights = {[{1}] = 200}
>  ---
>  ...
>  check(cfg)
>  ---
> -- zone identifier must be either string or number
> +- Zone identifier must be either string or number
>  ...
>  weights = {zone1 = 100}
>  ---
> @@ -207,28 +207,28 @@ cfg.weights = weights
>  ...
>  check(cfg)
>  ---
> -- zone must be map of relative weights of other zones
> +- Zone must be map of relative weights of other zones
>  ...
>  weights.zone1 = {[{1}] = 100}
>  ---
>  ...
>  check(cfg)
>  ---
> -- zone identifier must be either string or number
> +- Zone identifier must be either string or number
>  ...
>  weights.zone1 = {zone2 = '100'}
>  ---
>  ...
>  check(cfg)
>  ---
> -- weight must be either nil or non-negative number
> +- Zone weight must be either nil or non-negative number
>  ...
>  weights.zone1 = {zone1 = 100}
>  ---
>  ...
>  check(cfg)
>  ---
> -- weight of zone self must be either nil or 0
> +- Weight of own zone must be either nil or 0
>  ...
>  weights[2] = {zone1 = 100}
>  ---
> @@ -236,7 +236,7 @@ weights[2] = {zone1 = 100}
>  weights.zone1 = {[2] = 100}
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  --
> @@ -273,7 +273,7 @@ check(cfg)
>  cfg.bucket_count = 100
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  cfg.rebalancer_disbalance_threshold = -100
> @@ -293,7 +293,7 @@ check(cfg)
>  cfg.rebalancer_disbalance_threshold = 0.5
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  cfg.rebalancer_max_receiving = -100
> @@ -327,7 +327,7 @@ check(cfg)
>  cfg.rebalancer_max_receiving = 10
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  --
> @@ -339,21 +339,21 @@ cfg.shard_index = -100
>  ...
>  check(cfg)
>  ---
> -- Shard index must be non-empty string to specify index by name, or
> unsigned integer -  to specify index by identifier
> +- 'Shard index must be one of the following types: non-empty string,
> non-negative +  integer'
>  ...
>  cfg.shard_index = 0.1
>  ---
>  ...
>  check(cfg)
>  ---
> -- Shard index must be non-empty string to specify index by name, or
> unsigned integer -  to specify index by identifier
> +- 'Shard index must be one of the following types: non-empty string,
> non-negative +  integer'
>  ...
>  cfg.shard_index = 0
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  cfg.shard_index = ''
> @@ -361,13 +361,13 @@ cfg.shard_index = ''
>  ...
>  check(cfg)
>  ---
> -- Shard index must be non-empty string to specify index by name, or
> unsigned integer -  to specify index by identifier
> +- 'Shard index must be one of the following types: non-empty string,
> non-negative +  integer'
>  ...
>  cfg.shard_index = 'vbucket'
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  --
> @@ -378,26 +378,26 @@ cfg.collect_bucket_garbage_interval = 'str'
>  ...
>  check(cfg)
>  ---
> -- Garbage collect interval must be positive number
> +- Garbage bucket collect interval must be positive number
>  ...
>  cfg.collect_bucket_garbage_interval = 0
>  ---
>  ...
>  check(cfg)
>  ---
> -- Garbage collect interval must be positive number
> +- Garbage bucket collect interval must be positive number
>  ...
>  cfg.collect_bucket_garbage_interval = -1
>  ---
>  ...
>  check(cfg)
>  ---
> -- Garbage collect interval must be positive number
> +- Garbage bucket collect interval must be positive number
>  ...
>  cfg.collect_bucket_garbage_interval = 100.5
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  cfg.collect_lua_garbage = 100
> @@ -405,17 +405,17 @@ cfg.collect_lua_garbage = 100
>  ...
>  check(cfg)
>  ---
> -- Collect Lua garbage must be either true or false
> +- Garbage Lua collect necessity must be boolean
>  ...
>  cfg.collect_lua_garbage = true
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
>  cfg.collect_lua_garbage = false
>  ---
>  ...
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  ---
>  ...
> diff --git a/test/unit/config.test.lua b/test/unit/config.test.lua
> index 7cb93d5..140c38c 100644
> --- a/test/unit/config.test.lua
> +++ b/test/unit/config.test.lua
> @@ -75,11 +75,11 @@ check(cfg)
>  replicaset.weight = -100
>  check(cfg)
>  replicaset.weight = 0
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  replicaset.weight = 0.123
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  replicaset.weight = 100000
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> 
>  --
>  -- gh-12: zones, zone weight and failover by weight.
> @@ -99,7 +99,7 @@ weights.zone1 = {zone1 = 100}
>  check(cfg)
>  weights[2] = {zone1 = 100}
>  weights.zone1 = {[2] = 100}
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> 
>  --
>  -- gh-62: allow to specify bucket_count, rebalancer settings.
> @@ -113,14 +113,14 @@ check(cfg)
>  cfg.bucket_count = 0
>  check(cfg)
>  cfg.bucket_count = 100
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> 
>  cfg.rebalancer_disbalance_threshold = -100
>  check(cfg)
>  cfg.rebalancer_disbalance_threshold = '100'
>  check(cfg)
>  cfg.rebalancer_disbalance_threshold = 0.5
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> 
>  cfg.rebalancer_max_receiving = -100
>  check(cfg)
> @@ -131,7 +131,7 @@ check(cfg)
>  cfg.rebalancer_max_receiving = 0
>  check(cfg)
>  cfg.rebalancer_max_receiving = 10
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> 
>  --
>  -- gh-74: allow to specify name or id of an index on bucket
> @@ -142,11 +142,11 @@ check(cfg)
>  cfg.shard_index = 0.1
>  check(cfg)
>  cfg.shard_index = 0
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  cfg.shard_index = ''
>  check(cfg)
>  cfg.shard_index = 'vbucket'
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> 
>  --
>  -- gh-77: garbage collection options.
> @@ -158,11 +158,11 @@ check(cfg)
>  cfg.collect_bucket_garbage_interval = -1
>  check(cfg)
>  cfg.collect_bucket_garbage_interval = 100.5
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> 
>  cfg.collect_lua_garbage = 100
>  check(cfg)
>  cfg.collect_lua_garbage = true
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
>  cfg.collect_lua_garbage = false
> -lcfg.check(cfg)
> +_ = lcfg.check(cfg)
> diff --git a/vshard/cfg.lua b/vshard/cfg.lua
> index a8656a0..e4317f8 100644
> --- a/vshard/cfg.lua
> +++ b/vshard/cfg.lua
> @@ -2,146 +2,152 @@
> 
>  local log = require('log')
>  local luri = require('uri')
> +local consts = require('vshard.consts')
> 
> ---
> --- Check replicaset config on correctness.
> ---
> -local function cfg_check_replicaset(replicaset)
> -    if type(replicaset) ~= 'table' then
> -        error('Replicaset must be a table')
> -    end
> -    if type(replicaset.replicas) ~= 'table' then
> -        error('Replicaset.replicas must be array of replicas')
> -    end
> -    if replicaset.weight ~= nil and (type(replicaset.weight) ~= 'number' or
> -                                     replicaset.weight < 0) then
> -        error('Replicaset weight must be either nil or non-negative
> number') +local function check_uri(uri)
> +    uri = luri.parse(uri)
> +    if uri.login == nil or uri.password == nil then
> +        error('URI must contain login and password')
>      end
> -    local master_is_found = false
> -    for k, replica in pairs(replicaset.replicas) do
> -        if type(replica.uri) ~= 'string' then
> -            error('replica uri must be string')
> -        end
> -        local uri = luri.parse(replica.uri)
> -        if uri.login == nil or uri.password == nil then
> -            error('URI must contain login and password')
> -        end
> -        if type(replica.name) ~= 'string' then
> -            error('replica name must be string')
> -        end
> -        if replica.zone ~= nil and type(replica.zone) ~= 'number' and
> -           type(replica.zone) ~= 'string' then
> -            error('replica zone must be either string or number')
> +end
> +
> +local function check_master(master, ctx)
> +    if master then
> +        if ctx.master then
> +            error('Only one master is allowed per replicaset')
> +        else
> +            ctx.master = master
>          end
> -        if replica.master ~= nil then
> -            if type(replica.master) ~= 'boolean' then
> -                error('"master" must be boolean')
> +    end
> +end
> +
> +local type_validate = {
> +    ['string'] = function(v) return type(v) == 'string' end,
> +    ['non-empty string'] = function(v)
> +        return type(v) == 'string' and #v > 0
> +    end,
> +    ['boolean'] = function(v) return type(v) == 'boolean' end,
> +    ['number'] = function(v) return type(v) == 'number' end,
> +    ['non-negative number'] = function(v)
> +        return type(v) == 'number' and v >= 0
> +    end,
> +    ['positive number'] = function(v)
> +        return type(v) == 'number' and v > 0
> +    end,
> +    ['non-negative integer'] = function(v)
> +        return type(v) == 'number' and v >= 0 and math.floor(v) == v
> +    end,
> +    ['positive integer'] = function(v)
> +        return type(v) == 'number' and v > 0 and math.floor(v) == v
> +    end,
> +    ['table'] = function(v) return type(v) == 'table' end,
> +}
> +
> +local function validate_config(config, template, check_arg)
> +    for _, key_template in pairs(template) do
> +        local key = key_template[1]
> +        local template_value = key_template[2]
> +        local value = config[key]
> +        if not value then
> +            if not template_value.is_optional then
> +                error(string.format('%s must be specified',
> +                                    template_value.name))
> +            else
> +                config[key] = template_value.default
>              end
> -            if replica.master then
> -                if master_is_found then
> -                    error('Only one master is allowed per replicaset')
> +        else
> +            if type(template_value.type) == 'string' then
> +                if not type_validate[template_value.type](value) then
> +                    error(string.format('%s must be %s',
> template_value.name, +                                       
> template_value.type))
> +                end
> +            else
> +                local is_valid_type_found = false
> +                for _, t in pairs(template_value.type) do
> +                    if type_validate[t](value) then
> +                        is_valid_type_found = true
> +                        break
> +                    end
>                  end
> -                master_is_found = true
> +                if not is_valid_type_found then
> +                    local types = table.concat(template_value.type, ', ')
> +                    error(string.format('%s must be one of the following
> '.. +                                        'types: %s',
> template_value.name, +                                        types))
> +                end
> +            end
> +            if template_value.check then
> +                template_value.check(value, check_arg)
>              end
>          end
>      end
>  end
> 
> +local replica_template = {
> +    {'uri', {type = 'non-empty string', name = 'URI', check = check_uri}},
> +    {'name', {type = 'string', name = "Name"}},
> +    {'zone', {type = {'string', 'number'}, name = "Zone", is_optional =
> true}}, +    {'master', {
> +        type = 'boolean', name = "Master", is_optional = true, default =
> false, +        check = check_master
> +    }},
> +}
> +
> +local function check_replicas(replicas)
> +    local ctx = {master = false}
> +    for _, replica in pairs(replicas) do
> +        validate_config(replica, replica_template, ctx)
> +    end
> +end
> +
> +local replicaset_template = {
> +    {'replicas', {type = 'table', name = 'Replicas', check =
> check_replicas}}, +    {'weight', {
> +        type = 'non-negative number', name = 'Weight', is_optional = true
> +    }}
> +}
> +
>  --
>  -- Check weights map on correctness.
>  --
>  local function cfg_check_weights(weights)
> -    if type(weights) ~= 'table' then
> -        error('weights must be map of maps')
> -    end
>      for zone1, v in pairs(weights) do
>          if type(zone1) ~= 'number' and type(zone1) ~= 'string' then
>              -- Zone1 can be not number or string, if an user made
>              -- this: weights = {[{1}] = ...}. In such a case
>              -- {1} is the unaccassible key of a lua table, which
>              -- is available only via pairs.
> -            error('zone identifier must be either string or number')
> +            error('Zone identifier must be either string or number')
>          end
>          if type(v) ~= 'table' then
> -            error('zone must be map of relative weights of other zones')
> +            error('Zone must be map of relative weights of other zones')
>          end
>          for zone2, weight in pairs(v) do
>              if type(zone2) ~= 'number' and type(zone2) ~= 'string' then
> -                error('zone identifier must be either string or number')
> +                error('Zone identifier must be either string or number')
>              end
>              if type(weight) ~= 'number' or weight < 0 then
> -                error('weight must be either nil or non-negative number')
> +                error('Zone weight must be either nil or non-negative
> number') end
>              if zone2 == zone1 and weight ~= 0 then
> -                error('weight of zone self must be either nil or 0')
> +                error('Weight of own zone must be either nil or 0')
>              end
>          end
>      end
>  end
> 
> ---
> --- Check sharding config on correctness. Check types, name and uri
> --- uniqueness, master count (in each replicaset must by <= 1).
> ---
> -local function cfg_check(shard_cfg)
> -    if type(shard_cfg) ~= 'table' then
> -        error('Сonfig must be map of options')
> -    end
> -    if type(shard_cfg.sharding) ~= 'table' then
> -        error('Sharding config must be array of replicasets')
> -    end
> -    if shard_cfg.weights ~= nil then
> -        cfg_check_weights(shard_cfg.weights)
> -    end
> -    if shard_cfg.shard_index ~= nil and
> -       (type(shard_cfg.shard_index) ~= 'string' or
> -        #shard_cfg.shard_index == 0) and
> -       (type(shard_cfg.shard_index) ~= 'number' or shard_cfg.shard_index <
> 0 or -        math.floor(shard_cfg.shard_index) ~= shard_cfg.shard_index)
> then -        error('Shard index must be non-empty string to specify index
> by '.. -              'name, or unsigned integer to specify index by
> identifier') -    end
> -    if shard_cfg.zone ~= nil and type(shard_cfg.zone) ~= 'number' and
> -       type(shard_cfg.zone) ~= 'string' then
> -        error('Config zone must be either number or string')
> -    end
> -    if shard_cfg.bucket_count ~= nil and
> -       (type(shard_cfg.bucket_count) ~= 'number' or
> -        shard_cfg.bucket_count <= 0 or
> -        math.floor(shard_cfg.bucket_count) ~= shard_cfg.bucket_count) then
> -        error('Bucket count must be positive integer')
> -    end
> -    if shard_cfg.rebalancer_disbalance_threshold ~= nil then
> -        local t = shard_cfg.rebalancer_disbalance_threshold
> -        if type(t) ~= 'number' or t < 0 then
> -            error('Rebalancer disbalance threshold must be non-negative
> number') -        end
> -    end
> -    if shard_cfg.rebalancer_max_receiving ~= nil then
> -        local t = shard_cfg.rebalancer_max_receiving
> -        if type(t) ~= 'number' or t <= 0 or math.floor(t) ~= t then
> -            error('Rebalancer max receiving bucket count must be '..
> -                  'positive integer')
> -        end
> -    end
> -    if shard_cfg.collect_bucket_garbage_interval ~= nil then
> -        local t = shard_cfg.collect_bucket_garbage_interval
> -        if type(t) ~= 'number' or t <= 0 then
> -            error('Garbage collect interval must be positive number')
> -        end
> -    end
> -    if shard_cfg.collect_lua_garbage ~= nil and
> -       type(shard_cfg.collect_lua_garbage) ~= 'boolean' then
> -        error('Collect Lua garbage must be either true or false')
> -    end
> +local function check_sharding(sharding)
>      local uuids = {}
>      local uris = {}
> -    for replicaset_uuid, replicaset in pairs(shard_cfg.sharding) do
> +    for replicaset_uuid, replicaset in pairs(sharding) do
>          if uuids[replicaset_uuid] then
>              error(string.format('Duplicate uuid %s', replicaset_uuid))
>          end
>          uuids[replicaset_uuid] = true
> -        cfg_check_replicaset(replicaset)
> +        if type(replicaset) ~= 'table' then
> +            error('Replicaset must be a table')
> +        end
> +        validate_config(replicaset, replicaset_template)
>          for replica_uuid, replica in pairs(replicaset.replicas) do
>              if uris[replica.uri] then
>                  error(string.format('Duplicate uri %s', replica.uri))
> @@ -155,10 +161,62 @@ local function cfg_check(shard_cfg)
>      end
>  end
> 
> +local cfg_template = {
> +    {'sharding', {type = 'table', name = 'Sharding', check =
> check_sharding}}, +    {'weights', {
> +        type = 'table', name = 'Weight matrix', is_optional = true,
> +        check = cfg_check_weights
> +    }},
> +    {'shard_index', {
> +        type = {'non-empty string', 'non-negative integer'},
> +        name = 'Shard index', is_optional = true, default = 'bucket_id',
> +    }},
> +    {'zone', {
> +        type = {'string', 'number'}, name = 'Zone identifier',
> +        is_optional = true
> +    }},
> +    {'bucket_count', {
> +        type = 'positive integer', name = 'Bucket count', is_optional =
> true, +        default = consts.DEFAULT_BUCKET_COUNT
> +    }},
> +    {'rebalancer_disbalance_threshold', {
> +        type = 'non-negative number', name = 'Rebalancer disbalance
> threshold', +        is_optional = true,
> +        default = consts.DEFAULT_REBALANCER_DISBALANCE_THRESHOLD
> +    }},
> +    {'rebalancer_max_receiving', {
> +        type = 'positive integer',
> +        name = 'Rebalancer max receiving bucket count', is_optional = true,
> +        default = consts.DEFAULT_REBALANCER_MAX_RECEIVING
> +    }},
> +    {'collect_bucket_garbage_interval', {
> +        type = 'positive number', name = 'Garbage bucket collect interval',
> +        is_optional = true,
> +        default = consts.DEFAULT_COLLECT_BUCKET_GARBAGE_INTERVAL
> +    }},
> +    {'collect_lua_garbage', {
> +        type = 'boolean', name = 'Garbage Lua collect necessity',
> +        is_optional = true, default = false
> +    }}
> +}
> +
> +--
> +-- Check sharding config on correctness. Check types, name and uri
> +-- uniqueness, master count (in each replicaset must by <= 1).
> +--
> +local function cfg_check(shard_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)
> +    return shard_cfg
> +end
> +
>  --
>  -- Nullify non-box options.
>  --
> -local function prepare_for_box_cfg(cfg)
> +local function remove_non_box_options(cfg)
>      cfg.sharding = nil
>      cfg.weights = nil
>      cfg.zone = nil
> @@ -172,5 +230,5 @@ end
> 
>  return {
>      check = cfg_check,
> -    prepare_for_box_cfg = prepare_for_box_cfg,
> +    remove_non_box_options = remove_non_box_options,
>  }
> diff --git a/vshard/router/init.lua b/vshard/router/init.lua
> index abad12c..c01cb5a 100644
> --- a/vshard/router/init.lua
> +++ b/vshard/router/init.lua
> @@ -484,8 +484,7 @@ end
>  ---------------------------------------------------------------------------
> -----
> 
>  local function router_cfg(cfg)
> -    cfg = table.deepcopy(cfg)
> -    lcfg.check(cfg)
> +    cfg = lcfg.check(cfg)
>      local old_replicasets = M.replicasets
>      if not old_replicasets then
>          log.info('Starting router configuration')
> @@ -495,9 +494,9 @@ local function router_cfg(cfg)
>      local new_replicasets = lreplicaset.buildall(cfg)
>      -- TODO: update existing route map in-place
>      M.route_map = {}
> -    M.total_bucket_count = cfg.bucket_count or consts.DEFAULT_BUCKET_COUNT
> +    M.total_bucket_count = cfg.bucket_count
>      M.collect_lua_garbage = cfg.collect_lua_garbage
> -    lcfg.prepare_for_box_cfg(cfg)
> +    lcfg.remove_non_box_options(cfg)
>      -- Force net.box connection on cfg()
>      for _, replicaset in pairs(new_replicasets) do
>          replicaset:connect()
> diff --git a/vshard/storage/init.lua b/vshard/storage/init.lua
> index a449aec..7c978b8 100644
> --- a/vshard/storage/init.lua
> +++ b/vshard/storage/init.lua
> @@ -1279,11 +1279,10 @@ end
>  -- Configuration
>  ---------------------------------------------------------------------------
> ----- local function storage_cfg(cfg, this_replica_uuid)
> -    cfg = table.deepcopy(cfg)
>      if this_replica_uuid == nil then
>          error('Usage: cfg(configuration, this_replica_uuid)')
>      end
> -    lcfg.check(cfg)
> +    cfg = lcfg.check(cfg)
>      if cfg.weights or cfg.zone then
>          error('Weights and zone are not allowed for storage configuration')
> end
> @@ -1343,18 +1342,13 @@ 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 or consts.DEFAULT_BUCKET_COUNT
> -    M.rebalancer_disbalance_threshold =
> -        cfg.rebalancer_disbalance_threshold or
> -        consts.DEFAULT_REBALANCER_DISBALANCE_THRESHOLD
> -    M.rebalancer_max_receiving = cfg.rebalancer_max_receiving or
> -                                    consts.DEFAULT_REBALANCER_MAX_RECEIVING
> -    M.shard_index = cfg.shard_index or 'bucket_id'
> -    M.collect_bucket_garbage_interval =
> -        cfg.collect_bucket_garbage_interval or
> -        consts.DEFAULT_COLLECT_BUCKET_GARBAGE_INTERVAL
> +    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
> -    lcfg.prepare_for_box_cfg(cfg)
> +    lcfg.remove_non_box_options(cfg)
> 
>      box.cfg(cfg)
>      log.info("Box has been configured")

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.tarantool.org/pipermail/tarantool-patches/attachments/20180226/8b6d4674/attachment.sig>


More information about the Tarantool-patches mailing list