# GIT_TRACE_PERFORMANCE and pager

5 messages from 2016-02-29 to 2016-02-29. Participants: Christian Couder, Jeff King, Junio C Hamano.
Thread: https://gitlist.dev/t/41565

## Christian Couder, 2016-02-29 11:25

Subject: GIT_TRACE_PERFORMANCE and pager
Message-ID: <CAP8UFD2zFBV7gRVvLB-gGEB=cfZJmYKrfiD2vdTdxgEgYU6jHQ@mail.gmail.com>
URL: https://gitlist.dev/e/CAP8UFD2zFBV7gRVvLB-gGEB%3DcfZJmYKrfiD2vdTdxgEgYU6jHQ%40mail.gmail.com

```
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, 2016-02-29 11:39

Subject: Re: GIT_TRACE_PERFORMANCE and pager
Message-ID: <20160229113924.GC29769@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20160229113924.GC29769%40sigill.intra.peff.net
In-Reply-To: <CAP8UFD2zFBV7gRVvLB-gGEB=cfZJmYKrfiD2vdTdxgEgYU6jHQ@mail.gmail.com>

```
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, 2016-02-29 13:46

Subject: Re: GIT_TRACE_PERFORMANCE and pager
Message-ID: <CAP8UFD30fWvFPtSgY_6mVMCeQ9rMR-0EODaKbZdMmz_fo-qfKw@mail.gmail.com>
URL: https://gitlist.dev/e/CAP8UFD30fWvFPtSgY_6mVMCeQ9rMR-0EODaKbZdMmz_fo-qfKw%40mail.gmail.com
In-Reply-To: <20160229113924.GC29769@sigill.intra.peff.net>

```
On Mon, Feb 29, 2016 at 12:39 PM, Jeff King <peff@peff.net> wrote:
> 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.

> 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.

```

## Junio C Hamano, 2016-02-29 16:47

Subject: Re: GIT_TRACE_PERFORMANCE and pager
Message-ID: <CAPc5daWp+ACy_5=prqa2f_ry4Z92B7mOEw_mC_-arCSNeX=3Kw@mail.gmail.com>
URL: https://gitlist.dev/e/CAPc5daWp%2BACy_5%3Dprqa2f_ry4Z92B7mOEw_mC_-arCSNeX%3D3Kw%40mail.gmail.com
In-Reply-To: <20160229113924.GC29769@sigill.intra.peff.net>

```
On Mon, Feb 29, 2016 at 3:39 AM, Jeff King <peff@peff.net> wrote:
> 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.

```

## Jeff King, 2016-02-29 21:30

Subject: Re: GIT_TRACE_PERFORMANCE and pager
Message-ID: <20160229213026.GB25342@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20160229213026.GB25342%40sigill.intra.peff.net
In-Reply-To: <CAP8UFD30fWvFPtSgY_6mVMCeQ9rMR-0EODaKbZdMmz_fo-qfKw@mail.gmail.com>

```
On Mon, Feb 29, 2016 at 02:46:12PM +0100, Christian Couder wrote:

> > 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

```
