From: | Noah Misch <noah(at)leadboat(dot)com> |
---|---|
To: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Subject: | datfrozen/relfrozen update race condition |
Date: | 2024-04-23 00:39:56 |
Message-ID: | 20240423003956.e7.nmisch@google.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Tue, May 24, 2016 at 03:01:13PM -0400, Tom Lane wrote:
> Also, I notice another problem in vac_truncate_clog() now that I'm looking
> at it: it's expecting that the pg_database datfrozenxid and datminmxid
> values will hold still while it's looking at them. Since
> vac_update_datfrozenxid updates those values in-place, there's a race
> condition against VACUUMs happening in other databases. We should fetch
> those values into local variables before doing the various tests inside
> the scan loop.
Commit 2d2e40e fixed the above. There's another problem just like it, one
layer lower. vac_update_datfrozenxid() has:
if (TransactionIdPrecedes(classForm->relfrozenxid, newFrozenXid))
newFrozenXid = classForm->relfrozenxid;
classForm points to buffer memory, and vac_update_relstats() inplace-updates
the buffer. Like vac_truncate_clog(), we don't mind using an old value, but
those two lines must use the same value. The attached test case shows this
bug making datfrozenxid move ahead of relfrozenxid. The attached patch fixes
it. (I noticed this while finishing up patches for the heap_inplace_update
writer race in https://postgr.es/m/20231102030915.d3.nmisch@google.com.)
I audited other read-only use of inplace-updated fields. Others look safe,
because they hold rel locks that exclude VACUUM, or they make only
non-critical decisions. Still, let's change some to the load-once style, to
improve the chance of future copy/paste finding the safe style. I'm attaching
a patch for that, too. I didn't add "volatile", because I couldn't think of
how we'd care if the load moved earlier.
Attachment | Content-Type | Size |
---|---|---|
test-inplace-inconsistent-read-v0.patch | text/plain | 28.9 KB |
vac_update_datfrozenxid-race-relfrozenxid-v1.patch | text/plain | 3.4 KB |
frozen-id-load-style-v1.patch | text/plain | 5.4 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Michael Paquier | 2024-04-23 01:14:42 | Re: Cleanup: remove unused fields from nodes |
Previous Message | Michael Paquier | 2024-04-23 00:23:29 | Re: GUC-ify walsender MAX_SEND_SIZE constant |