Skip to content

Commit e2c540b

Browse files
committed
util: create but do not start reloadable fiber
This commit makes the whole vshard use `reloadable_fiber_new` instead of the `reloadable_fiber_create`, from now on reloadable fiber is not started, just created. This allows all functions not to yield, when creating such fibers. The initial motivation was `log_ratelimit` module, where we cannot yield during creation of the flush fiber, since otherwise it may happen, that several logs through limiters from different fibers may create several flush fibers. It was decided to apply that strategy everywhere, firstly, for the sake of consistency and, secondly, in order not to repeat the same error in the future - using `new` instead of `create` will protect us from creating duplicate reloadable fibers from different fibers. Needed for #606 NO_DOC=internal
1 parent f979f63 commit e2c540b

File tree

6 files changed

+19
-21
lines changed

6 files changed

+19
-21
lines changed

test/unit/util.result

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function slow_fail() fiber.sleep(0.01) error('Error happened.') end
3434
fake_M.reloadable_function = function () fake_M.reloadable_function = slow_fail; slow_fail() end
3535
---
3636
...
37-
fib = util.reloadable_fiber_create('Worker_name', fake_M, 'reloadable_function')
37+
fib = util.reloadable_fiber_new('Worker_name', fake_M, 'reloadable_function')
3838
---
3939
...
4040
-- Check that the fiber starts with the proper name
@@ -62,7 +62,7 @@ log.info(string.rep('a', 1000))
6262
fake_M.reloadable_function = function () fiber.sleep(0.01); return true end
6363
---
6464
...
65-
fib = util.reloadable_fiber_create('Worker_name', fake_M, 'reloadable_function')
65+
fib = util.reloadable_fiber_new('Worker_name', fake_M, 'reloadable_function')
6666
---
6767
...
6868
while not test_run:grep_log('default', 'module is reloaded, restarting') do fiber.sleep(0.01) end
@@ -79,7 +79,7 @@ fib:cancel()
7979
name = string.rep('a', 512)
8080
---
8181
...
82-
fib = util.reloadable_fiber_create(name, fake_M, 'reloadable_function')
82+
fib = util.reloadable_fiber_new(name, fake_M, 'reloadable_function')
8383
---
8484
...
8585
fib:cancel()

test/unit/util.test.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function slow_fail() fiber.sleep(0.01) error('Error happened.') end
1414
-- Check autoreload on function change during failure.
1515
fake_M.reloadable_function = function () fake_M.reloadable_function = slow_fail; slow_fail() end
1616

17-
fib = util.reloadable_fiber_create('Worker_name', fake_M, 'reloadable_function')
17+
fib = util.reloadable_fiber_new('Worker_name', fake_M, 'reloadable_function')
1818
-- Check that the fiber starts with the proper name
1919
while not test_run:grep_log('default', 'Worker_name.+reloadable_function has been started') do fiber.sleep(0.01); end
2020
while not test_run:grep_log('default', 'reloadable function reloadable_function has been changed') do fiber.sleep(0.01); end
@@ -25,14 +25,14 @@ log.info(string.rep('a', 1000))
2525

2626
-- Check reload feature.
2727
fake_M.reloadable_function = function () fiber.sleep(0.01); return true end
28-
fib = util.reloadable_fiber_create('Worker_name', fake_M, 'reloadable_function')
28+
fib = util.reloadable_fiber_new('Worker_name', fake_M, 'reloadable_function')
2929
while not test_run:grep_log('default', 'module is reloaded, restarting') do fiber.sleep(0.01) end
3030
test_run:grep_log('default', 'reloadable_function has been started', 1000)
3131
fib:cancel()
3232

3333
-- Re-loadable fiber must truncate too long name.
3434
name = string.rep('a', 512)
35-
fib = util.reloadable_fiber_create(name, fake_M, 'reloadable_function')
35+
fib = util.reloadable_fiber_new(name, fake_M, 'reloadable_function')
3636
fib:cancel()
3737

3838
-- Yielding table minus.

vshard/log_ratelimit.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ local function ratelimit_create(cfg)
173173
setmetatable(ratelimit, ratelimit_mt)
174174
M.limiters[ratelimit.name] = ratelimit
175175
if M.flush_fiber == nil then
176-
M.flush_fiber = util.reloadable_fiber_create(
176+
M.flush_fiber = util.reloadable_fiber_new(
177177
'vshard.ratelimit_flush', M, 'ratelimit_flush_f')
178178
end
179179
return ratelimit

vshard/router/init.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ local function discovery_set(router, new_mode)
457457
-- is found. But it is the case already. So nothing to do.
458458
return
459459
end
460-
router.discovery_fiber = util.reloadable_fiber_create(
460+
router.discovery_fiber = util.reloadable_fiber_new(
461461
'vshard.discovery.' .. router.name, M, 'discovery_f', router)
462462
end
463463

vshard/storage/init.lua

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3085,9 +3085,8 @@ local function rebalancer_role_update()
30853085
elseif need_rebalancer then
30863086
if not M.rebalancer_fiber then
30873087
log.info('Starting the rebalancer')
3088-
M.rebalancer_fiber =
3089-
util.reloadable_fiber_create('vshard.rebalancer', M,
3090-
'rebalancer_f')
3088+
M.rebalancer_fiber = util.reloadable_fiber_new(
3089+
'vshard.rebalancer', M, 'rebalancer_f')
30913090
return
30923091
end
30933092
end
@@ -3381,11 +3380,11 @@ local function master_role_update()
33813380
if this_is_master() and M.is_configured then
33823381
if not M.collect_bucket_garbage_fiber then
33833382
M.collect_bucket_garbage_fiber =
3384-
util.reloadable_fiber_create('vshard.gc', M, 'gc_bucket_f')
3383+
util.reloadable_fiber_new('vshard.gc', M, 'gc_bucket_f')
33853384
end
33863385
if not M.recovery_fiber then
33873386
M.recovery_fiber =
3388-
util.reloadable_fiber_create('vshard.recovery', M, 'recovery_f')
3387+
util.reloadable_fiber_new('vshard.recovery', M, 'recovery_f')
33893388
end
33903389
else
33913390
if M.collect_bucket_garbage_fiber then
@@ -3494,7 +3493,7 @@ end
34943493
local function instance_watch_update()
34953494
if M.this_replicaset.is_master_auto then
34963495
if not M.instance_watch_fiber then
3497-
M.instance_watch_fiber = util.reloadable_fiber_create(
3496+
M.instance_watch_fiber = util.reloadable_fiber_new(
34983497
'vshard.state_watch', M, 'instance_watch_f')
34993498
end
35003499
return

vshard/util.lua

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ end
102102
-- errors and module reload.
103103
-- This loop executes the latest version of itself in case of
104104
-- reload of that module.
105-
-- See description of parameters in `reloadable_fiber_create`.
105+
-- See description of parameters in `reloadable_fiber_new`.
106106
--
107107
local function reloadable_fiber_main_loop(module, func_name, data)
108108
local func = module[func_name]
@@ -135,9 +135,9 @@ local function reloadable_fiber_main_loop(module, func_name, data)
135135
end
136136

137137
--
138-
-- Create a new fiber which runs a function in a loop. This loop
139-
-- is aware of reload mechanism and it loads a new version of the
140-
-- function in that case.
138+
-- Create but do not start a new fiber which runs a function in a loop. This
139+
-- loop is aware of reload mechanism and it loads a new version of the function
140+
-- in that case.
141141
-- To handle module reload and run new version of a function
142142
-- in the module, the function should just return.
143143
-- @param fiber_name Name of a new fiber. E.g.
@@ -148,12 +148,11 @@ end
148148
-- @param data Data to be passed to the specified function.
149149
-- @retval New fiber.
150150
--
151-
local function reloadable_fiber_create(fiber_name, module, func_name, data)
151+
local function reloadable_fiber_new(fiber_name, module, func_name, data)
152152
assert(type(fiber_name) == 'string')
153153
local xfiber = fiber.new(reloadable_fiber_main_loop, module, func_name, data)
154154
xfiber:name(fiber_name, {truncate = true})
155155
xfiber:wakeup()
156-
fiber.yield()
157156
return xfiber
158157
end
159158

@@ -483,7 +482,7 @@ return {
483482
core_version = tnt_version,
484483
uri_eq = uri_eq,
485484
tuple_extract_key = tuple_extract_key,
486-
reloadable_fiber_create = reloadable_fiber_create,
485+
reloadable_fiber_new = reloadable_fiber_new,
487486
future_wait = future_wait,
488487
generate_self_checker = generate_self_checker,
489488
async_task = async_task,

0 commit comments

Comments
 (0)