Tarantool development patches archive
 help / color / mirror / Atom feed
From: Sergey Kaplun via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: Maxim Kokryashkin <max.kokryashkin@gmail.com>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH luajit 1/2 v8] tools: add cli flag to run profile dump parsers
Date: Mon, 28 Aug 2023 14:17:42 +0300	[thread overview]
Message-ID: <ZOyCViU-1BxQ_pBb@root> (raw)
In-Reply-To: <ba310224cde35b7e0c38a741fbd1fe2400a28428.1692954427.git.m.kokryashkin@tarantool.org>

Hi, Maxim!
Thanks for the patch!
Please, consider my comments below.

On 25.08.23, Maxim Kokryashkin wrote:
> It is really inconvenient to use a standalone shell script to parse
> binary dumps from profilers. That is why this commit introduces a
> CLI flag for tools to the LuaJIT, so now it is possible to parse

Typo? s/for tools to the/for tools in the/

> a memprof dump as simple as:
> ```
> luajit -tm memprof.bin
> luajit -tm --leak-only memprof.bin
> ```
> 
> And the sysprof too:
> ```
> luajit -ts sysprof.bin
> luajit -ts --split sysprof.bin
> ```
> 
> The `luajit-parse-memprof` and `luajit-parse-sysprof` are purged
> as a result of this changes.

Typo: s/this/these/

> 
> Closes tarantool/tarantool#5688
> ---
> This patch requires additional changes for tarantool proxying,
> that are done in the PR.
>  Makefile.original                             |  20 ---
>  src/luajit.c                                  |  41 +++++-
>  .../gh-5688-tool-cli-flag.test.lua            | 130 ++++++++++++++++++
>  tools/CMakeLists.txt                          |  73 ----------
>  tools/luajit-parse-memprof.in                 |   6 -
>  tools/luajit-parse-sysprof.in                 |   6 -
>  tools/memprof.lua                             |   4 +-
>  tools/sysprof.lua                             |  16 ++-
>  8 files changed, 186 insertions(+), 110 deletions(-)
>  create mode 100644 test/tarantool-tests/gh-5688-tool-cli-flag.test.lua
>  delete mode 100755 tools/luajit-parse-memprof.in
>  delete mode 100644 tools/luajit-parse-sysprof.in
> 
> diff --git a/Makefile.original b/Makefile.original
> index 0c92df9e..10836f7d 100644
> --- a/Makefile.original
> +++ b/Makefile.original
> @@ -58,7 +58,6 @@ INSTALL_DYLIBSHORT2= libluajit-$(ABIVER).$(MAJVER).dylib
>  INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib
>  INSTALL_PCNAME= luajit.pc
>  INSTALL_TMEMPROFNAME= luajit-$(VERSION)-parse-memprof

I suppose, that this should be dropped too.

> -INSTALL_TMEMPROFSYMNAME= luajit-parse-memprof
>  
>  INSTALL_STATIC= $(INSTALL_LIB)/$(INSTALL_ANAME)
>  INSTALL_DYN= $(INSTALL_LIB)/$(INSTALL_SONAME)
> @@ -68,7 +67,6 @@ INSTALL_T= $(INSTALL_BIN)/$(INSTALL_TNAME)
>  INSTALL_TSYM= $(INSTALL_BIN)/$(INSTALL_TSYMNAME)
>  INSTALL_PC= $(INSTALL_PKGCONFIG)/$(INSTALL_PCNAME)
>  INSTALL_TMEMPROF= $(INSTALL_BIN)/$(INSTALL_TMEMPROFNAME)

As far as this one.

> -INSTALL_TMEMPROFSYM= $(INSTALL_BIN)/$(INSTALL_TMEMPROFSYMNAME)

<snipped>

> @@ -103,7 +99,6 @@ FILES_JITLIB= bc.lua bcsave.lua dump.lua p.lua v.lua zone.lua \
>  FILES_UTILSLIB= avl.lua bufread.lua symtab.lua
>  FILES_MEMPROFLIB= parse.lua humanize.lua

I noticed that this variable misses the <process.lua> recently
introduced. Also, there are no libs to install via sysprof too. I
suggest to fix this misbehaviour within the other patch (not even in
this patchset).

>  FILES_TOOLSLIB= memprof.lua
> -FILE_TMEMPROF= luajit-parse-memprof
>  

<snipped>

> diff --git a/src/luajit.c b/src/luajit.c
> index 1ca24301..e9ed89bc 100644
> --- a/src/luajit.c
> +++ b/src/luajit.c

<snipped>

> +static int runtoolcmd(lua_State *L, const char *tool_name)
> +{
> +  lua_getglobal(L, "require");
> +  lua_pushstring(L, tool_name);
> +  if (lua_pcall(L, 1, 1, 0)) {
> +    const char *msg = lua_tostring(L, -1);
> +    if (msg && !strncmp(msg, "module ", 7))
> +      l_message(progname,
> +        "unknown luaJIT command or tools not installed");

Nit: There is no need for new line here.

Also, I strongly believe that we should report an error in the case,
when there is another error reason. Just to avoid silent failures.

> +    return 1;
> +  }
> +  lua_getglobal(L, "arg");
> +  return report(L, lua_pcall(L, 1, 1, 0));
> +}
> +

<snipped>

> diff --git a/test/tarantool-tests/gh-5688-tool-cli-flag.test.lua b/test/tarantool-tests/gh-5688-tool-cli-flag.test.lua
> new file mode 100644
> index 00000000..b91902fd
> --- /dev/null
> +++ b/test/tarantool-tests/gh-5688-tool-cli-flag.test.lua

<snipped>

> +
> +local function tool_test_case(case_name, cmd_set)
> +  test:test(case_name, function(subtest)
> +    subtest:plan(#cmd_set)
> +
> +    for idx = 1, #cmd_set do
> +      local result = os.execute(cmd_set[idx].cmd .. SUPPRESS_OUTPUT) == 0

Here we got a problem: if sysprof has bad arguments, sysprof reports
nothing -- just silently fails:

| >>> LUA_PATH="tools/?.lua;;" src/luajit -ts /tmp/memprof.bin
| 13:29:14 jobs:0 burii@root:~/reviews/luajit/cli-flags$[1]
| >>> LUA_PATH="tools/?.lua;;" src/luajit -ts asdfl
| 13:29:14 jobs:0 burii@root:~/reviews/luajit/cli-flags$[1]

I suggest to check the error message too.

> +      subtest:ok(result == cmd_set[idx].expected, cmd_set[idx].cmd)
> +    end
> +  end)
> +end
> +
> +tool_test_case('smoke', SMOKE_CMD_SET)
> +
> +generate_profiler_output(TMP_BINFILE_MEMPROF, memprof_payload, misc.memprof)
> +tool_test_case('memprof parsing tool', MEMPROF_CMD_SET)
> +
> +local sysprof_opts = { mode = 'C', path = TMP_BINFILE_SYSPROF }
> +generate_profiler_output(sysprof_opts, sysprof_payload, misc.sysprof)
> +tool_test_case('sysprof parsing tool', SYSPROF_CMD_SET)
> +
> +os.remove(TMP_BINFILE_MEMPROF)
> +os.remove(TMP_BINFILE_SYSPROF)
> +test:done(true)
> diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
> index dd7ec6bd..b7aeb472 100644
> --- a/tools/CMakeLists.txt
> +++ b/tools/CMakeLists.txt

<snipped>

>    add_custom_target(tools-parse-memprof EXCLUDE_FROM_ALL DEPENDS
> -    luajit-parse-memprof
>      memprof/humanize.lua
>      memprof/parse.lua
>      memprof.lua

<memprof/process.lua> is missing here.

> @@ -66,27 +51,6 @@ else()
>        WORLD_READ
>      COMPONENT tools-parse-memprof
>    )

<snipped>

>    add_custom_target(tools-parse-sysprof EXCLUDE_FROM_ALL DEPENDS
> -    luajit-parse-sysprof
>      sysprof/parse.lua
>      sysprof/collapse.lua
>      sysprof.lua
> @@ -148,27 +96,6 @@ else()
>        WORLD_READ
>      COMPONENT tools-parse-sysprof
>    )

<snipped>

> diff --git a/tools/luajit-parse-memprof.in b/tools/luajit-parse-memprof.in
> deleted file mode 100755
> index 8867202a..00000000
> --- a/tools/luajit-parse-memprof.in
> +++ /dev/null

<snipped>

> diff --git a/tools/luajit-parse-sysprof.in b/tools/luajit-parse-sysprof.in
> deleted file mode 100644
> index 2be25eb3..00000000
> --- a/tools/luajit-parse-sysprof.in
> +++ /dev/null

<snipped>

> diff --git a/tools/memprof.lua b/tools/memprof.lua
> index cf66dd9e..8df1630a 100644
> --- a/tools/memprof.lua
> +++ b/tools/memprof.lua

<snipped>

> +-- XXX: When this script is used as a preloaded module by an
> +-- application, it should return one function for correct parsing
> +-- of command line flags like --leak-only and dumping profile
> +-- info.
> +local function dump_wrapped(...)
> +  return dump(parseargs(...))
>  end
>  
>  -- FIXME: this script should be application-independent.
>  local args = {...}
>  if #args == 1 and args[1] == "sysprof" then
> -  return dump
> +  return dump_wrapped
>  else
> -  dump(parseargs(args))
> +  dump_wrapped(args)

Do we ever need this case since there is no direct call to it?
I suppose that this FIXME and if/else branches may be deleted.
Now we may always return the `dump_wrapped()` function.

>  end
> -- 
> 2.41.0
> 

-- 
Best regards,
Sergey Kaplun

  reply	other threads:[~2023-08-28 11:22 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-25  9:14 [Tarantool-patches] [PATCH luajit 0/2 v8] introduce cli for tools Maxim Kokryashkin via Tarantool-patches
2023-08-25  9:14 ` [Tarantool-patches] [PATCH luajit 1/2 v8] tools: add cli flag to run profile dump parsers Maxim Kokryashkin via Tarantool-patches
2023-08-28 11:17   ` Sergey Kaplun via Tarantool-patches [this message]
2023-08-25  9:14 ` [Tarantool-patches] [PATCH luajit 2/2 v8] test: don't skip tool CLI flag for tarantool Maxim Kokryashkin via Tarantool-patches
2023-08-28 11:21   ` Sergey Kaplun via Tarantool-patches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZOyCViU-1BxQ_pBb@root \
    --to=tarantool-patches@dev.tarantool.org \
    --cc=max.kokryashkin@gmail.com \
    --cc=skaplun@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH luajit 1/2 v8] tools: add cli flag to run profile dump parsers' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox