Skip to content

Commit 9caf4b3

Browse files
authored
Fix roles reload (#157)
Before this patch reload wasn't fair - reloading `tuple.merger` and `tuple.keydef` modules failed, and crud starting to use `crud.select.compat.select_old` module with naive merger realization. Fair reloading `tuple.merger` and `tuple.keydef` led to the errors [1],[2] that were fixed by caching loaded module in the special global variable not cleaned on reloading roles. Ability of using `tuple.merger` and `tuple.keydef` modules now is checked by calling `package.search`, built-in `merger` and `keydef` modules are used if present in `package.loaded`. It allows to avoid ignoring errors on checking modules existing via `pcall(require, '<module_name>')`. [1]: tarantool/tuple-keydef#9 [2]: tarantool/tuple-merger#21
1 parent 6841dad commit 9caf4b3

File tree

5 files changed

+58
-34
lines changed

5 files changed

+58
-34
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1212
* Fixed error for partial result option if field contains box.NULL.
1313
* Fixed incorrect ``crud`` results during reverse pagination
1414
without specifying ``batch_size``.
15+
* Fixed crud roles reload:
16+
* before this patch reload wasn't fair - reloading `tuple.merger`
17+
and `tuple.keydef` modules failed, and crud started to use
18+
`crud.select.compat.select_old` module with naive merger implementation;
19+
* fair reloading `tuple.merger` and `tuple.keydef` led to the error that was
20+
fixed by caching loaded module in the special global variable not cleaned
21+
on reloading roles;
22+
* ability of using `tuple.merger` and `tuple.keydef` modules now is checked
23+
by calling `package.search`, built-in `merger` and `keydef` modules are used
24+
if present in `package.loaded`. It allows to avoid ignoring errors on checking
25+
modules existing via `pcall(require, '<module_name>')`.
1526

1627
### Added
1728

crud/common/compat.lua

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
local log = require('log')
2+
3+
local compat = {}
4+
5+
function compat.require(module_name, builtin_module_name)
6+
local module_cached_name = string.format('__crud_%s_cached', module_name)
7+
8+
local module
9+
10+
local module_cached = rawget(_G, module_cached_name)
11+
if module_cached ~= nil then
12+
module = module_cached
13+
elseif package.search(module_name) then
14+
-- we don't use pcall(require, modile_name) here because it
15+
-- leads to ignoring errors other than 'No LuaRocks module found'
16+
log.info('%q module is used', module_name)
17+
module = require(module_name)
18+
else
19+
log.info('%q module is not found. Built-in %q is used', module_name, builtin_module_name)
20+
module = require(builtin_module_name)
21+
end
22+
23+
rawset(_G, module_cached_name, module)
24+
25+
local hotreload = package.loaded['cartridge.hotreload']
26+
if hotreload ~= nil then
27+
hotreload.whitelist_globals({module_cached_name})
28+
end
29+
30+
return module
31+
end
32+
33+
return compat

crud/compare/keydef.lua

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,10 @@
1-
local log = require('log')
21
local msgpack = require('msgpack')
32

43
local comparators = require('crud.compare.comparators')
54
local collations = require('crud.common.collations')
65

7-
local keydef_lib
8-
9-
if pcall(require, 'tuple.keydef') then
10-
keydef_lib = require('tuple.keydef')
11-
elseif pcall(require, 'keydef') then
12-
log.info('Impossible to load "tuple-keydef" module. Built-in "keydef" is used')
13-
keydef_lib = require('key_def')
14-
else
15-
error(string.format('Seems your Tarantool version (%q' ..
16-
') does not support "tuple-keydef" or "keydef" modules', _TARANTOOL))
17-
end
6+
local compat = require('crud.common.compat')
7+
local keydef_lib = compat.require('tuple.keydef', 'key_def')
188

199
-- As "tuple.key_def" doesn't support collation_id
2010
-- we manually change it to collation

crud/select.lua

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@ local SelectError = errors.new_class('SelectError')
99

1010
local select_module
1111

12-
-- "merger" segfaults here
13-
-- See https://github.com/tarantool/tarantool/issues/4954
1412
if '2' <= _TARANTOOL and _TARANTOOL <= '2.3.3' then
13+
-- "merger" segfaults here
14+
-- See https://github.com/tarantool/tarantool/issues/4954
15+
select_module = require('crud.select.compat.select_old')
16+
elseif not package.search('tuple.merger') and package.loaded['merger'] == nil then
17+
-- we don't use pcall(require, modile_name) here because it
18+
-- leads to ignoring errors other than 'No LuaRocks module found'
19+
20+
-- "merger" isn't supported here
1521
select_module = require('crud.select.compat.select_old')
1622
else
17-
-- Try to require built-in or external merger
18-
local ok, module = pcall(require, 'crud.select.compat.select')
19-
if ok then
20-
select_module = module
21-
else
22-
select_module = require('crud.select.compat.select_old')
23-
end
23+
select_module = require('crud.select.compat.select')
2424
end
2525

2626
local function make_cursor(data)

crud/select/merger.lua

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
11
local buffer = require('buffer')
22
local msgpack = require('msgpack')
3-
local log = require('log')
43
local ffi = require('ffi')
54
local call = require('crud.common.call')
65

7-
local Keydef = require('crud.compare.keydef')
8-
9-
local merger_lib
6+
local compat = require('crud.common.compat')
7+
local merger_lib = compat.require('tuple.merger', 'merger')
108

11-
if pcall(require, 'tuple.merger') then
12-
merger_lib = require('tuple.merger')
13-
elseif pcall(require, 'merger') then
14-
log.info('Impossible to load "tuple-merger" module. Built-in "merger" is used')
15-
merger_lib = require('merger')
16-
else
17-
error(string.format('Seems your Tarantool version (%q' ..
18-
') does not support "tuple-merger" or "merger" modules', _TARANTOOL))
19-
end
9+
local Keydef = require('crud.compare.keydef')
2010

2111
local function bswap_u16(num)
2212
return bit.rshift(bit.bswap(tonumber(num)), 16)

0 commit comments

Comments
 (0)