Skip to content
Snippets Groups Projects
Commit 6e403753 authored by Nikolay Shirokovskiy's avatar Nikolay Shirokovskiy Committed by Vladimir Davydov
Browse files

lua: shutdown tasks worker fiber

As this fiber is made system in the commit bf620650 ("box: finish
client fibers on shutdown") we don not need the existing protection from
cancelling. So first remove it. Now make it managed on shutdown.

Note that we may have issues as we finish this fiber too early. The
tasks scheduled but not executed at this moment will never be executed.
So the tasks that be scheduled after fiber is finished. Now when we
don't use worker fiber for swim gc this will not cause leaks. And
leaking fd on Tarantool shutdown in fio is not a problem.

Closes #9722

NO_CHANGELOG=internal
NO_DOC=internal
parent ab386e65
No related branches found
No related tags found
No related merge requests found
...@@ -922,6 +922,7 @@ lbox_fiber_stall(struct lua_State *L) ...@@ -922,6 +922,7 @@ lbox_fiber_stall(struct lua_State *L)
{ {
(void) L; (void) L;
fiber_yield(); fiber_yield();
luaL_testcancel(L);
return 0; return 0;
} }
......
...@@ -100,25 +100,16 @@ local function worker_f() ...@@ -100,25 +100,16 @@ local function worker_f()
stall() stall()
end end
worker_next_task = task.next worker_next_task = task.next
task.f(task.arg) pcall(task.f, task.arg)
fiber.sleep(0) fiber.sleep(0)
end end
end end
local worker_name = 'tasks_worker_fiber' local worker_name = 'tasks_worker_fiber'
local function worker_safe_f() worker_fiber = fiber.new(worker_f)
pcall(worker_f)
-- Worker_f never returns. If the execution is here, this
-- fiber is probably canceled and now is not able to sleep.
-- Create a new one.
worker_fiber = fiber.new(worker_safe_f)
fiber_set_system(worker_fiber)
worker_fiber:name(worker_name)
end
worker_fiber = fiber.new(worker_safe_f)
fiber_set_system(worker_fiber) fiber_set_system(worker_fiber)
fiber_set_managed_shutdown(worker_fiber)
worker_fiber:name(worker_name) worker_fiber:name(worker_name)
local function worker_schedule_task(f, arg) local function worker_schedule_task(f, arg)
...@@ -129,7 +120,10 @@ local function worker_schedule_task(f, arg) ...@@ -129,7 +120,10 @@ local function worker_schedule_task(f, arg)
worker_last_task.next = task worker_last_task.next = task
end end
worker_last_task = task worker_last_task = task
worker_fiber:wakeup() -- Fiber is finished on shutdown as it has managed shutdown.
if worker_fiber:status() ~= 'dead' then
worker_fiber:wakeup()
end
end end
-- Start from '_' to hide it from auto completion. -- Start from '_' to hide it from auto completion.
......
...@@ -1589,7 +1589,6 @@ function task_f(arg) ...@@ -1589,7 +1589,6 @@ function task_f(arg)
if arg <= 3 then \ if arg <= 3 then \
fiber._internal.schedule_task(task_f, arg) \ fiber._internal.schedule_task(task_f, arg) \
else \ else \
fiber.self():cancel() \
error('Worker is broken') \ error('Worker is broken') \
end \ end \
end end
......
...@@ -712,7 +712,6 @@ function task_f(arg) ...@@ -712,7 +712,6 @@ function task_f(arg)
if arg <= 3 then \ if arg <= 3 then \
fiber._internal.schedule_task(task_f, arg) \ fiber._internal.schedule_task(task_f, arg) \
else \ else \
fiber.self():cancel() \
error('Worker is broken') \ error('Worker is broken') \
end \ end \
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment