Skip vacuum log report code in lazy_scan_heap() if possible

Started by Greg Nancarrowalmost 5 years ago8 messageshackers
Beta feature

Hackorum builds and tests every patch posted to the lists, not only commitfest submissions. This is Hackorum's own CI rather than the PostgreSQL project's, and it is still under testing - please report anything that looks wrong.

won't retrysuccessCI history

You can run a PostgreSQL built from this patch straight from Docker, with no checkout and no build:

docker run --rm -p 5432:5432 ghcr.io/hackorum-dev/postgres-patch:t45027
psql -h localhost -U postgres

Built from patchset v1 (message #1), July 27, 2026 at 04:00 PM.

Every patchset is also pushed to a branch of our PostgreSQL fork, so you can check out the same tree CI built. Without a PostgreSQL checkout:

git clone --branch t45027_1 https://github.com/hackorum-dev/postgres.git

In a checkout you already have, add the fork once:

git remote add hackorum https://github.com/hackorum-dev/postgres.git

then, for this patchset and every later one:

git fetch hackorum t45027_1 && git checkout t45027_1

Patchset v1 (message #1) is on t45027_1

Jump to latest
#1Greg Nancarrow
gregn4422@gmail.com

Hi,

When recently debugging a vacuum-related issue, I noticed that there
is some log-report processing/formatting code at the end of
lazy_scan_heap() that, unless the vacuum VERBOSE option is specified,
typically results in no log output (as the log-level is then DEBUG2).
I think it is worth skipping this code if ultimately nothing is going
to be logged (and I found that even for a tiny database, a VACUUM may
execute this code hundreds of times).
I have attached a simple patch for this.

Regards,
Greg Nancarrow
Fujitsu Australia

Attachments:

t45027_1
v1-0001-Skip-vacuum-log-report-processing-in-lazy_scan_heap-if-possible.patchapplication/octet-stream; name=v1-0001-Skip-vacuum-log-report-processing-in-lazy_scan_heap-if-possible.patchDownload+7-1
#2Nathan Bossart
nathandbossart@gmail.com
In reply to: Greg Nancarrow (#1)
Re: Skip vacuum log report code in lazy_scan_heap() if possible

On 10/29/21, 3:54 AM, "Greg Nancarrow" <gregn4422@gmail.com> wrote:

When recently debugging a vacuum-related issue, I noticed that there
is some log-report processing/formatting code at the end of
lazy_scan_heap() that, unless the vacuum VERBOSE option is specified,
typically results in no log output (as the log-level is then DEBUG2).
I think it is worth skipping this code if ultimately nothing is going
to be logged (and I found that even for a tiny database, a VACUUM may
execute this code hundreds of times).
I have attached a simple patch for this.

I think this logging only happens once per table, so I'm not sure it's
really worth it to short-circuit here. If it was per-page, IMO there
would be a much stronger case for it. That being said, I don't think
the proposed patch would hurt anything.

Nathan

#3Nathan Bossart
nathandbossart@gmail.com
In reply to: Greg Nancarrow (#1)
Re: Skip vacuum log report code in lazy_scan_heap() if possible

On 10/29/21, 10:49 AM, "Bossart, Nathan" <bossartn@amazon.com> wrote:

On 10/29/21, 3:54 AM, "Greg Nancarrow" <gregn4422@gmail.com> wrote:

When recently debugging a vacuum-related issue, I noticed that there
is some log-report processing/formatting code at the end of
lazy_scan_heap() that, unless the vacuum VERBOSE option is specified,
typically results in no log output (as the log-level is then DEBUG2).
I think it is worth skipping this code if ultimately nothing is going
to be logged (and I found that even for a tiny database, a VACUUM may
execute this code hundreds of times).
I have attached a simple patch for this.

I think this logging only happens once per table, so I'm not sure it's
really worth it to short-circuit here. If it was per-page, IMO there
would be a much stronger case for it. That being said, I don't think
the proposed patch would hurt anything.

Since I have no further comments, I went ahead and marked this once as
ready-for-committer.

Nathan

#4Michael Paquier
michael@paquier.xyz
In reply to: Nathan Bossart (#3)
Re: Skip vacuum log report code in lazy_scan_heap() if possible

On Thu, Dec 02, 2021 at 10:22:25PM +0000, Bossart, Nathan wrote:

Since I have no further comments, I went ahead and marked this once as
ready-for-committer.

Well, as you say, lazy_scan_heap() is only run once per relation, so
that's not a hot code path. Looking at the callers of
message_level_is_interesting(), we apply that also in areas where a
lot of unnecessary work would be involved, like the drop of object
dependencies or ProcSleep() (I recall that there were profiles where
standby replies in walsender.c could show up). And based on the
amount of unnecessary work done at the end of lazy_scan_heap(), I'd
say that this is worth skipping, so let's do it.

There is always the argument that one may blindly add some logic at
the end of lazy_scan_heap(), causing it to be skipped depending on the
configuration, but that's unlikely going to happen after the activity
is logged, so I am fine to apply what you have here. Let's wait a bit
to see if others have any objections, first.
--
Michael

#5Andres Freund
andres@anarazel.de
In reply to: Michael Paquier (#4)
Re: Skip vacuum log report code in lazy_scan_heap() if possible

Hi,

On 2021-12-03 09:53:22 +0900, Michael Paquier wrote:

On Thu, Dec 02, 2021 at 10:22:25PM +0000, Bossart, Nathan wrote:

Since I have no further comments, I went ahead and marked this once as
ready-for-committer.

Well, as you say, lazy_scan_heap() is only run once per relation, so
that's not a hot code path.

Yea, it seems like a premature optimization.

Looking at the callers of
message_level_is_interesting(), we apply that also in areas where a
lot of unnecessary work would be involved, like the drop of object
dependencies or ProcSleep() (I recall that there were profiles where
standby replies in walsender.c could show up). And based on the
amount of unnecessary work done at the end of lazy_scan_heap(), I'd
say that this is worth skipping, so let's do it.

I think this mostly reduces the coverage of the relevant code without any
measurable speed gain. -0.5 from here.

Greetings,

Andres Freund

In reply to: Andres Freund (#5)
Re: Skip vacuum log report code in lazy_scan_heap() if possible

If my patch to unite vacuum verbose and the autovacuum logging gets in,
then this issue also goes away.

Peter Geoghegan
(Sent from my phone)

#7Nathan Bossart
nathandbossart@gmail.com
In reply to: Peter Geoghegan (#6)
Re: Skip vacuum log report code in lazy_scan_heap() if possible

On 12/3/21, 7:40 AM, "Peter Geoghegan" <pg@bowt.ie> wrote:

If my patch to unite vacuum verbose and the autovacuum logging gets
in, then this issue also goes away.

Perhaps this patch should be marked Rejected in favor of that one,
then.

Nathan

#8Michael Paquier
michael@paquier.xyz
In reply to: Nathan Bossart (#7)
Re: Skip vacuum log report code in lazy_scan_heap() if possible

On Fri, Dec 03, 2021 at 05:46:51PM +0000, Bossart, Nathan wrote:

Perhaps this patch should be marked Rejected in favor of that one,
then.

Let's do so, then. I can also get behind the coverage argument for
this code path.
--
Michael