[Tarantool-patches] [PATCH v3] lua: fix running init lua script
Sergey Bronnikov
sergeyb at tarantool.org
Tue Dec 22 11:02:16 MSK 2020
Hi,
On 21.12.2020 17:23, Artem wrote:
> Hello, Sergey!
>
> Thanks for your review! See my answers below.
>
> Branch is updated.
>
> 18.12.2020 15:59, Sergey Bronnikov пишет:
>> Hello, Artem
>>
>> thanks for the patch! See 4 minor comments below.
>>
>> On 16.12.2020 18:57, Artem Starshov wrote:
>>> When tarantool launched with -e flag and in
>>> script after there is an error, programm hangs.
>> 1. "program"
> 1. Done.
>>> This happens because shed fiber launches separate
>>> fiber for init user script and starts auxiliary
>>> event loop. It's supposed that fiber will stop
>>> this loop, but in case of error in script, fiber
>>> tries to stop a loop when the last one isn't
>>> started yet.
>>>
>>> Added a flag, which will watch is loop started and
>>> when fiber tries to call `ev_break()` we can be sure
>>> that loop is running already.
>>>
>>> Fixes #4983
>>> ---
>>> @ChangeLog: Fixed a hang when tarantool launched with the -e option
>>> and users
>>> script throws an error (`tarantool -e 'assert(false)'`) (gh-4983).
>>>
>>> Changes in v2:
>>> - Test commit squashed with code fix commit;
>>> - Fixed comments in test;
>>> - Fixed commit message (no stairs);
>>> - Closes -> Fixes;
>>> - Removed small bugs in test;
>>> - Moved test to tap.test(name, func).
>>>
>>> Changes in v3:
>>> - Added more information to change log;
>>> - 'src/lua` -> 'lua' for patch name;
>>> - Code-style fixes in test.
>>>
>>> Branch:
>>> https://github.com/tarantool/tarantool/tree/artemreyt/gh-4983-tnt-e-assert-false-hangs
>>> Issue: https://github.com/tarantool/tarantool/issues/4983
>>>
>>> src/lua/init.c | 9 ++
>>> .../gh-4983-tnt-e-assert-false-hangs.test.lua | 92
>>> +++++++++++++++++++
>>> 2 files changed, 101 insertions(+)
>>> create mode 100755
>>> test/app-tap/gh-4983-tnt-e-assert-false-hangs.test.lua
>>>
>>> diff --git a/src/lua/init.c b/src/lua/init.c
>>> index a0b2fc775..92bdb82c0 100644
>>> --- a/src/lua/init.c
>>> +++ b/src/lua/init.c
>>> @@ -569,6 +569,7 @@ run_script_f(va_list ap)
>>> * never really dead. It never returns from its function.
>>> */
>>> struct diag *diag = va_arg(ap, struct diag *);
>>> + bool aux_loop_is_run = false;
>>> /*
>>> * Load libraries and execute chunks passed by -l and -e
>>> @@ -611,6 +612,7 @@ run_script_f(va_list ap)
>>> * loop and re-schedule this fiber.
>>> */
>>> fiber_sleep(0.0);
>>> + aux_loop_is_run = true;
>>> if (path && strcmp(path, "-") != 0 && access(path, F_OK) ==
>>> 0) {
>>> /* Execute script. */
>>> @@ -650,6 +652,13 @@ run_script_f(va_list ap)
>>> * return control back to tarantool_lua_run_script.
>>> */
>>> end:
>>> + /*
>>> + * Auxiliary loop in tarantool_lua_run_script
>>> + * should start (ev_run()) before this fiber
>>> + * invokes ev_break().
>>> + */
>>> + if (!aux_loop_is_run)
>>> + fiber_sleep(0.0);
>>> ev_break(loop(), EVBREAK_ALL);
>>> return 0;
>>> diff --git
>>> a/test/app-tap/gh-4983-tnt-e-assert-false-hangs.test.lua
>>> b/test/app-tap/gh-4983-tnt-e-assert-false-hangs.test.lua
>>> new file mode 100755
>>> index 000000000..378ac229c
>>> --- /dev/null
>>> +++ b/test/app-tap/gh-4983-tnt-e-assert-false-hangs.test.lua
>>
>> 2. test always failed when it is running with high concurrency:
>>
>> ../../test/test-run.py
>> --builddir=/home/s.bronnikov/work/tarantool/build
>> --vardir=/home/s.bronnikov/work/tantool/build/test/var \
>>
>> -j100 $(yes app-tap/gh-4983-tnt-e-assert-false-hangs.test.lua | head
>> -n 1000)
>>
> 2. Fixed by increasing timeout on waiting for process, opening log
> file and reading the last one.
>
> (From 2 seconds to 5).
>
>
still reproduced with command line below:
../../test/test-run.py --builddir=/home/s.bronnikov/work/tarantool/build
--vardir=/home/s.bronnikov/work/tantool/build/test/var -j200 $(yes
app-tap/gh-4983-tnt-e-assert-false-hangs.test.lua | head -n 1000)
<snipped>
More information about the Tarantool-patches
mailing list