| From: | Nikolay Samokhvalov <nik(at)postgres(dot)ai> |
|---|---|
| To: | Amit Langote <amitlangote09(at)gmail(dot)com> |
| Cc: | pgsql-hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Andrey Borodin <amborodin(at)acm(dot)org>, Kirk Wolak <wolakk(at)gmail(dot)com> |
| Subject: | Re: PG19: two RI fast-path issues found while testing the batching revert |
| Date: | 2026-09-13 08:20:01 |
| Message-ID: | CAM527d8az+PKmmchgb-0_9VZzn7bDGqh938ezZzKGkCTZT3NDg@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Sat, Sep 12, 2026 at 8:04 AM Nikolay Samokhvalov <nik(at)postgres(dot)ai> wrote:
> I'd keep the dead list for now. No runtime issue found in v2.
Hi Amit,
I kept iterating with our new PostgresAI harness and found one more
issue while testing v2.
`ri_HashCompareOp()` can process a cast invalidation inside
`fmgr_info_cxt()`, before publishing `entry->info`. The callback sees
NULL and has nothing to detach, so the outer call publishes the old
cast information afterward.
In the affected backend, a direct cast maps 2 to 102, but RI still
looks for parent 2. A fresh backend uses the new cast. This can occur
when function initialization processes a pending cast invalidation
during cache construction.
Reproduced on master and PG19. The same comparison-cache construction
sequence is present in the PG14–18 v2 patches.
Function initialization can load a C library and run its `_PG_init()`.
Nested RI from there can populate the same cache entry. The outer call
then overwrites it, leaking the comparison context; fast-path metadata
has the same problem.
In case helpful, attached is an incremental fix for master/PG19, on
top of v2. It retries after invalidation and keeps an entry already
populated by a nested call. The fast-path check uses a per-constraint
generation, since a nested reload can set `valid` back to true before
the outer call resumes. PG14–18 need only the comparison-cache
changes.
The fix passes checks for invalidation during construction, nested
initialization, and both together. On master, regression, isolation,
and injection-point suites pass with the earlier memory-test
correction applied.
Thanks,
Nik
| Attachment | Content-Type | Size |
|---|---|---|
| v2-construction-fix.patch | application/x-patch | 6.8 KB |
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Nikolay Samokhvalov | 2026-09-13 09:20:45 | [PATCH] Avoid a REPACK worker startup hang |
| Previous Message | Vaibhav Dalvi | 2026-09-13 06:53:05 | Re: Add PRODUCT() aggregate function |