threads / discuss / 41565

GIT_TRACE_PERFORMANCE and pager

Subject: GIT_TRACE_PERFORMANCE and pager

## tl;dr

5 messages between Feb 29, 2016 and Feb 29, 2016.

replies: 4people: 3as markdown or json

Christian Couder· Feb 29, 2016, 11:25 UTC · lore
Hi,

It looks like setting GIT_TRACE_PERFORMANCE to 1 or 2 (for stdout or stderr) does not always work well with commands that use a pager, for example:

-------------
> GIT_TRACE_PERFORMANCE=2 git log -1
commit f02fbc4f9433937ee0463d0342d6d7d97e1f6f1e
Author: Junio C Hamano <gitster@pobox.com>
Date:   Fri Feb 26 13:45:26 2016 -0800
    Git 2.8-rc0
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
-------------
In the above the GIT_TRACE_PERFORMANCE output is missing.
When I use "--no-pager", I get the GIT_TRACE_PERFORMANCE output:
-------------
> GIT_TRACE_PERFORMANCE=2 git --no-pager log -1
commit f02fbc4f9433937ee0463d0342d6d7d97e1f6f1e
Author: Junio C Hamano <gitster@pobox.com>
Date:   Fri Feb 26 13:45:26 2016 -0800
    Git 2.8-rc0
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
12:16:31.258462 trace.c:420             performance: 0.001415428 s:
git command: 'git' '--no-pager' 'log' '-1'
-------------

Setting GIT_TRACE to 1 or 2 seems to work, but maybe it is because it outputs stuff at the beginning of the process and not at the end.

Cheers, Christian.

Jeff King· Feb 29, 2016, 11:39 UTC · re: Christian Couder · lore

Re: GIT_TRACE_PERFORMANCE and pager

On Mon, Feb 29, 2016 at 12:25:49PM +0100, Christian Couder wrote:
> Setting GIT_TRACE to 1 or 2 seems to work, but maybe it is because it
> outputs stuff at the beginning of the process and not at the end.
Yeah, I think so. Try this (on Linux):
  $ GIT_PAGER='sed s/^/paged:/' \
    GIT_TRACE_PERFORMANCE=1 \
    strace -f -e write -e 'signal=!sigchld' git -p rev-parse
  strace: Process 31155 attached
  strace: Process 31156 attached
  [pid 31156] +++ exited with 0 +++
  [pid 31155] +++ exited with 0 +++
  write(2, "06:32:30.486995 [pid=31154] trac"..., 114) = -1 EBADF (Bad file descriptor)
  write(2, "Could not trace into fd given by"..., 99) = -1 EBADF (Bad file descriptor)
  +++ exited with 0 +++

We redirect stderr to the pager (note that GIT_TRACE=1 still goes to stderr; it never goes to stdout). We wait() on the pager process before we exit the main git process, and we don't print the performance stats until atexit(). So by the time we get there, the pager must be dead, and the pipe descriptor is closed (I'm actually kind of surprised we don't get EPIPE, but it looks like we close the descriptors in wait_for_pager()).

One workaround is something like:
  GIT_TRACE_PERFORMANCE=3 3>&2 git ...

though I guess I'd question whether trace-performance is interesting at all for a paged command, since it is also counting the length of time you spend looking at the pager waiting to hit "q".

-Peff
Christian Couder· Feb 29, 2016, 13:46 UTC · re: Jeff King · lore

Re: GIT_TRACE_PERFORMANCE and pager

On Mon, Feb 29, 2016 at 12:39 PM, Jeff King <peff@peff.net> wrote:
Show 17 quoted lines
> On Mon, Feb 29, 2016 at 12:25:49PM +0100, Christian Couder wrote:
>
>> Setting GIT_TRACE to 1 or 2 seems to work, but maybe it is because it
>> outputs stuff at the beginning of the process and not at the end.
>
> Yeah, I think so. Try this (on Linux):
>
>   $ GIT_PAGER='sed s/^/paged:/' \
>     GIT_TRACE_PERFORMANCE=1 \
>     strace -f -e write -e 'signal=!sigchld' git -p rev-parse
>   strace: Process 31155 attached
>   strace: Process 31156 attached
>   [pid 31156] +++ exited with 0 +++
>   [pid 31155] +++ exited with 0 +++
>   write(2, "06:32:30.486995 [pid=31154] trac"..., 114) = -1 EBADF (Bad file descriptor)
>   write(2, "Could not trace into fd given by"..., 99) = -1 EBADF (Bad file descriptor)
>   +++ exited with 0 +++
Yeah, I get the same thing.
Show 11 quoted lines
> We redirect stderr to the pager (note that GIT_TRACE=1 still goes to
> stderr; it never goes to stdout). We wait() on the pager process before
> we exit the main git process, and we don't print the performance stats
> until atexit(). So by the time we get there, the pager must be dead, and
> the pipe descriptor is closed (I'm actually kind of surprised we don't
> get EPIPE, but it looks like we close the descriptors in
> wait_for_pager()).
>
> One workaround is something like:
>
>   GIT_TRACE_PERFORMANCE=3 3>&2 git ...
Yeah, that works.
> though I guess I'd question whether trace-performance is interesting at
> all for a paged command, since it is also counting the length of time
> you spend looking at the pager waiting to hit "q".

In case of "GIT_TRACE_PERFORMANCE=2 git log -1", it doesn't count the time spent looking at the pager because the output is small, so 'less' exits immediately, and it could give the impression that GIT_TRACE_PERFORMANCE is not working.

I am preparing a patch to Documentation/technical/api-trace.txt to warn about that.

Jeff King· Feb 29, 2016, 21:30 UTC · re: Christian Couder · lore

Re: GIT_TRACE_PERFORMANCE and pager

On Mon, Feb 29, 2016 at 02:46:12PM +0100, Christian Couder wrote:
Show 8 quoted lines
> > though I guess I'd question whether trace-performance is interesting at
> > all for a paged command, since it is also counting the length of time
> > you spend looking at the pager waiting to hit "q".
> 
> In case of "GIT_TRACE_PERFORMANCE=2 git log -1", it doesn't count the
> time spent looking at the pager because the output is small, so 'less'
> exits immediately, and it could give the impression that
> GIT_TRACE_PERFORMANCE is not working.

Ah, right. I don't use "-F" with less, so mine hangs around until I quit.

-Peff
Junio C Hamano· Feb 29, 2016, 16:47 UTC · re: Jeff King · lore

Re: GIT_TRACE_PERFORMANCE and pager

On Mon, Feb 29, 2016 at 3:39 AM, Jeff King <peff@peff.net> wrote:
Show 7 quoted lines
> One workaround is something like:
>
>   GIT_TRACE_PERFORMANCE=3 3>&2 git ...
>
> though I guess I'd question whether trace-performance is interesting at
> all for a paged command, since it is also counting the length of time
> you spend looking at the pager waiting to hit "q".

Yup, exactly. I see Christian tried to add something to the documentation, but I think it is sufficient to suggest running commands with --no-pager.

← back to recent threads