| From: | Andres Freund <andres(at)anarazel(dot)de> |
|---|---|
| To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
| Cc: | Álvaro Herrera <alvherre(at)kurilemu(dot)de>, Narek Galstyan <narek(dot)galstyan(at)enterprisedb(dot)com>, pgsql-hackers(at)postgresql(dot)org, "narekg(at)berkeley(dot)edu" <narekg(at)berkeley(dot)edu>, ngalstyan4(at)gmail(dot)com |
| Subject: | Re: Coverage with make coverage-html is broken on latest Debian using lcov v2 |
| Date: | 2026-10-03 21:03:27 |
| Message-ID: | 44mk7ctqddpmo5666am4nagw4ocovrubvqjdg3zpm5t3qatwaf@qx5zshy6mogj |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi,
On 2026-10-03 12:39:29 -0400, Tom Lane wrote:
> > I'm not sure sure about the 0002 patch though. It builds in the
> > assumption that lcov is broken and that we're going to ignore these
> > warnings by default [forever]. Do we really want to bake those flags
> > into our build system?
>
> That bothers me too, mainly because I foresee a risk of the switches
> hiding genuine problems somewhere down the road. Also the switches
> Narek proposes don't match what I've found to be necessary on my
> own installation (so maybe there is a gcov version dependency here
> too?).
>
> For the moment I'm content to insert the --ignore-errors flags
> manually. The 0001 patch should at least reduce the noise level
> a bit.
Yea, I think we really need to fix the sources of some of these corruptions. I
don't think it's primarily lcov's problem, I think it's that we end up with
actually corrupted coverage data and that lcov got *better* at surfacing that.
I know of a few problems:
- We build some code without -pthread that is then used in a threaded
environment. One problem is that gcc uses the presence of -pthread to
influence what -fprofile-update=method gets chosen.
Which, I think, means that any multi-threaded execution of any of that code
ends up using the non-atomic counter updates, which allows them to become
inconsistent.
For autoconf we end up with -pthread for libpq, pgbench, and ecpg. But not
for pgport, pgcommon, which means none of them are safe.
For meson it's similar, except that the backend will typically be built with
-pthread as well. But that doesn't help the fact that pgport, pgcommon can
end up being completely inconsistent.
- Sometimes we can interrupt a process in the middle of a normal exit, while
coverage data being written out, with a SIGQUIT/SIGKILL, which then leads to
corrupted coverage files.
Those coverage files then end up being corrupted.
I unfortunately don't know of a way of fixing that short of teaching libgcov
to update the coverage files with an atomic rename - except that it uses
flock for locking, which probably would be incompatible with that :(.
- code compiled multiple times ends triggering errors
That's the new lcov-2.5 thing where it complains about functions being in
different places if they're built multiple times.
I suspect that a lot of those we could fix with relatively minimal effort,
e.g. by moving the #ifdef SH_RAW_ALLOCATOR around SH_CREATE to inside the
argument list and instead of defining use_builtin_flow() in three places
depending on how things are built, do it in one, moving the ifdefs inside.
- flex generates wrong file locations
This has been an open flex bug for a long time:
https://github.com/westes/flex/issues/235
Kinda wonder if we should just strip line numbers from the file. Or perhaps
we should compile with explicit options to not generate a profile?
Unfortunately the lines are only wrong starting with the first rule,
otherwise it'd not be too hard to just fix that.
Until then I guess it might make sense to add --exclude '*.l' or such? That
does seem to avoid these problems.
- The intentional use of SIGQUIT shutdowns in a lot of tests leads to
incomplete coverage
That doesn't trigger gcov / lcov / genhtml errors, but it leads to things
being assumed uncovered that aren't.
Because we shut down a lot of tap test clusters with immediate mode, this
actually has pretty large impact.
I've experimented with replacing all the _exit() uses in the backend with
something that triggers flushing of the coverage information in some cases
that can be considered kinda maybe safe.
I think there are definitely some bugs in lcov around multi-line statements
that contain branches. That's where it seems to very often get confused and
claims the data is inconsistent, but afaict it's due to it misunderstanding
the data that gcov spits out. I'll try to make a bug report out of that.
Greetings,
Andres Freund
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Álvaro Herrera | 2026-10-03 21:23:16 | Re: Coverage with make coverage-html is broken on latest Debian using lcov v2 |
| Previous Message | Kacper Kuras | 2026-10-03 19:54:39 | Re: Proposal: SELECT * EXCLUDE (...) command |