[tarantool-patches] Re: [PATCH] tarantoolctl: remove metatable assumptions in start()

Alexander Turenko alexander.turenko at tarantool.org
Thu Apr 11 17:57:26 MSK 2019


The behaviour is almost okay, but you need to work on wording of the
commit message to make it useful for a reader. Feel free to ask more if
you have questions.

See comments below.

WBR, Alexander Turenko.

> commit 4cdf8e79bb530288098fb30e5014498fc0ad4262
> Author: Roman Khabibov <roman.habibov at tarantool.org>
> Date:   Mon Mar 25 20:52:05 2019 +0300
> 
>     tarantoolctl: error when box.cfg didn't called

Cite from our developer guidelines [1]:

> 6. Use the imperative mood in the subject line. A properly formed Git
> commit subject line should always be able to complete the following
> sentence: “If applied, this commit will /your subject line here/”.

[1]: https://www.tarantool.io/en/doc/1.10/dev_guide/developer_guidelines/#how-to-write-a-commit-message

Also you construct passive voice wrongly, it should be 'to be + [not] + Ved'.

>     
>     There was assumpted uninitialized metamethods of box.cfg{} if user
>     did't call it in his instance.

This sentence raises more questions then give answers. What is
'uninitialized metamethods'? Whether 'of box.cfg{}' means result of the
call or a new value of the 'cfg' field of the 'box' table?

Also I doubt 'There was assumpted' is valid phrase.

>     
>     Closes #3953
> 
> diff --git a/extra/dist/tarantoolctl.in b/extra/dist/tarantoolctl.in
> index 47fcf895f..396fa7957 100755
> --- a/extra/dist/tarantoolctl.in
> +++ b/extra/dist/tarantoolctl.in
> @@ -547,7 +547,11 @@ local function start()
>          end
>          os.exit(1)
>      end
> -    local old_call = getmetatable(box.cfg).__call
> +    local m_table = getmetatable(box.cfg)
> +    if m_table == nil then

Cite from our Lua style guide [2]:

> `*_mt` and `*_methods` defines metatable and methods table

Suggested to name it box_cfg_mt.

[2]: https://www.tarantool.io/en/doc/1.10/dev_guide/lua_style_guide/

> +        error("Plaese, call box.cfg{} within your instance")

Typo: 'Plaese'.

I would change wording to just state what is wrong, e.g.: 'box.cfg() is
not called in an instance file'.

See also how errors are reported in other places: log.error() and
os.exit(1). I guess it does not matter much from a behaviour point of
view, but it would be good to report errors in one way with surrounding
code.

(BTW, found one behaviour difference: error() reports a line number when
called with one argument or non-zero second argument.)

Please, install tarantool and tarantoolctl and check the behaviour:
messages and exit codes. Currently it looks so:

# tarantoolctl start foo
Starting instance foo...
Hello, World!
/usr/bin/tarantoolctl:552: Plaese, call box.cfg{} within your instance
# echo $?
1

It is okay except file:line part, but anyway I suggest you to use
log.error() and os.exit(1).

> +    end
> +    local old_call = m_table.__call
>      getmetatable(box.cfg).__call = function(old_cfg, cfg)

There is no need to call getmetatable() again, we can use box_cfg_mt.

>          if old_cfg.pid_file ~= nil and cfg ~= nil and cfg.pid_file ~= nil then
>              cfg.pid_file = old_cfg.pid_file
> diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua
> index db046e03f..428b074e2 100755
> --- a/test/app-tap/tarantoolctl.test.lua
> +++ b/test/app-tap/tarantoolctl.test.lua
> @@ -165,10 +165,13 @@ do
>      local dir = fio.tempdir()
>      local code = [[ box.cfg{memtx_memory = 104857600} ]]
>      create_script(dir, 'script.lua', code)
> +    create_script(dir, 'init.lua', [[ print('Hi!') ]])
>  
>      local status, err = pcall(function()
>          test:test("basic test", function(test_i)
> -            test_i:plan(16)
> +            test_i:plan(18)
> +            check_ok(test_i, dir, 'start', 'init.lua', 1, nil, "Starting instance init...",
> +                     "Plaese, call box.cfg{} within your instance")
>              check_ok(test_i, dir, 'start',  'script', 0, nil, "Starting instance")
>              tctl_wait_start(dir, 'script')
>              check_ok(test_i, dir, 'status', 'script', 0, nil, "is running")
> 
> 

I propose to make the code of the test a bit more uniform and use a
meaningful instance file name:

diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua
index 428b074e2..7d7c63371 100755
--- a/test/app-tap/tarantoolctl.test.lua
+++ b/test/app-tap/tarantoolctl.test.lua
@@ -163,15 +163,14 @@ test:plan(7)
 -- must be stopped afterwards
 do
     local dir = fio.tempdir()
-    local code = [[ box.cfg{memtx_memory = 104857600} ]]
-    create_script(dir, 'script.lua', code)
-    create_script(dir, 'init.lua', [[ print('Hi!') ]])
+    create_script(dir, 'script.lua', [[ box.cfg{memtx_memory = 104857600} ]])
+    create_script(dir, 'no_box_cfg.lua', [[ print('Hi!') ]])
 
     local status, err = pcall(function()
         test:test("basic test", function(test_i)
             test_i:plan(18)
-            check_ok(test_i, dir, 'start', 'init.lua', 1, nil, "Starting instance init...",
-                     "Plaese, call box.cfg{} within your instance")
+            check_ok(test_i, dir, 'start', 'no_box_cfg', 1, nil, "Starting instance",
+                     "box.cfg() is not called in an instance file")
             check_ok(test_i, dir, 'start',  'script', 0, nil, "Starting instance")
             tctl_wait_start(dir, 'script')
             check_ok(test_i, dir, 'status', 'script', 0, nil, "is running")




More information about the Tarantool-patches mailing list