Re: Return pg_control from pg_backup_stop().

From: David Steele <david(at)pgbackrest(dot)org>
To: Michael Paquier <michael(at)paquier(dot)xyz>, "Burd, Greg" <gregburd(at)amazon(dot)com>
Cc: "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>, "hlinnaka(at)iki(dot)fi" <hlinnaka(at)iki(dot)fi>, "robertmhaas(at)gmail(dot)com" <robertmhaas(at)gmail(dot)com>, "andres(at)anarazel(dot)de" <andres(at)anarazel(dot)de>, "masao(dot)fujii(at)gmail(dot)com" <masao(dot)fujii(at)gmail(dot)com>, "solai(dot)cdac(at)gmail(dot)com" <solai(dot)cdac(at)gmail(dot)com>
Subject: Re: Return pg_control from pg_backup_stop().
Date: 2026-10-30 08:33:49
Message-ID: a2bf51cb-639f-48bd-a647-dcb4278654ff@pgbackrest.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 10/30/26 00:08, Michael Paquier wrote:
> On Thu, Oct 29, 2026 at 06:11:39PM +0000, Burd, Greg wrote:
>> Validation of c97931c16d on the same machine: with it applied, three
>> runs each of both reproductions give the WARNING and ERROR and no
>> crash, and t/010_pg_basebackup.pl passes all 168 tests with no
>> backend crash in the server logs. With it reverted, the same TAP run
>> logs the SIGSEGV. The test still reports PASS in that case because
>> it only checks that pg_basebackup fails.
>
> Ah, thanks for the in-depth investigation. So the previous guess was
> really right. Candles work.

Thank you, Greg! This is exactly the confirmation we needed.

I would encourage you to file a bug with gcc. I've found a few bugs and
the gcc folks are really easy to work with. Since you have a repro it
will be easy to produce the pre-processed output they want.

One bad thing -- even if they fix the bug, distros may choose not to
back patch it (so it may already be fixed). I had to maintain a patch
for a gcc bug on ppc64le for years before the affected distros EOL'd.
That bug limited where I could use const, which was pretty annoying.

>> I don't see a better fix on our side. A helper function with
>> the array would also work, but palloc0() is simpler, and both rely on
>> the same thing: no PG_TRY() frame larger than 4kB. In a core build
>> on this machine, the only other function with a frame that large that
>> calls sigsetjmp() is be_lo_export() (char buf[BUFSIZE]). Its code
>> after sigsetjmp() reloads the constant, so it is fine today, but only
>> by luck of register allocation. I haven't checked contrib or other
>> GCC versions or as mentioned earlier against their bug system.
>
> Ugh. Even if the buffer itself is not used within the try/catch
> block itself?

Apparently so -- the failure of the base backup cancel test showed that.
The buffer was never used and just the larger frame caused the problem.

> Getting entirely rid of the TRY/CATCH would lead to a
> much nicer result overall: we'd be able to keep the local buffer. Or
> perhaps go to the simpler solution of a palloc/pfree? I cannot
> believe that this extra allocation would matter for lo_export() calls.

palloc/pfree seems like the simpler solution.

> If you are proved to be right, it sounds to me that we ought to
> fix and backpatch that as well, especially if there is nothing we can
> do on the Postgres side. I don't believe in luck and magic when it
> comes to software programming.
I've attached a patch for be_lo_export(). Working around compiler bugs
is never fun but I'm not sure what choice we have.

Regards,
-David

Attachment Content-Type Size
lo-export-heap-buffer.patch text/plain 1005 bytes

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bertrand Drouvot 2026-10-30 08:41:35 Re: Setting the number of digits after the decimal point with a psql's pset variable
Previous Message Alexander Lakhin 2026-10-30 08:00:00 Re: Fix "unexpected logical decoding status change" error; from concurrent logical decoding activation