| From: | "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com> |
|---|---|
| To: | Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com> |
| Cc: | Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Pradeep Kumar <spradeepkumar29(at)gmail(dot)com>, Alexander Lakhin <exclusion(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>, vignesh C <vignesh21(at)gmail(dot)com>, Andres Freund <andres(at)anarazel(dot)de>, "Hayato Kuroda (Fujitsu)" <kuroda(dot)hayato(at)fujitsu(dot)com>, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Subject: | RE: Assertion failure in SnapBuildInitialSnapshot() |
| Date: | 2025-12-10 03:32:39 |
| Message-ID: | TY4PR01MB169073F00EB42E1370738F4C694A0A@TY4PR01MB16907.jpnprd01.prod.outlook.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Wednesday, December 10, 2025 7:25 AM Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com> wrote:
>
> On Tue, Nov 25, 2025 at 10:25 PM Zhijie Hou (Fujitsu)
> <houzj(dot)fnst(at)fujitsu(dot)com> wrote:
> >
> > On Wednesday, November 26, 2025 2:57 AM Masahiko Sawada
> <sawada(dot)mshk(at)gmail(dot)com> wrote:
> > >
> > > On Tue, Nov 25, 2025 at 4:02 AM Zhijie Hou (Fujitsu)
> <houzj(dot)fnst(at)fujitsu(dot)com>
> > > wrote:
> > > >
> > > > On Tuesday, November 25, 2025 3:30 AM Masahiko Sawada
> > > <sawada(dot)mshk(at)gmail(dot)com> wrote:
> > > > >
> > > > >
> > > > > Given that the computation of xmin and catalog_xmin among all slots
> > > > > could be executed concurrently, could the following scenario happen
> > > > > where
> > > > > procArray->replication_slot_xmin and replication_slot_catalog_xmin
> > > > > procArray->are retreat to a non-invalid
> > > > > XID?
> > > > >
> > > > > 1. Suppose the initial value procArray->replication_slot_catalog_xmin
> is
> > > 50.
> > > > > 2. Process-A updates its owned slot's catalog_xmin to 100, and
> > > > > computes the new catalog_xmin as 100 while holding
> > > > > ReplicationSlotControlLock in a shared mode in
> > > > > ReplicationSlotsComputeRequiredLSN(). But it doesn't update the
> > > procArray's catalog_xmin value yet.
> > > > > 3. Process-B updates its owned slot's catalog_xmin to 150, and
> > > > > computes the new catalog_xmin as 150.
> > > > > 4. Process-B updates the procArray->replication_slot_catalog_xmin to
> > > 150.
> > > > > 5. Process-A updates the procArray->repilcation_slot_catalog_xmin to
> > > > > 100, which was 150.
> > > >
> > > > After further investigation, I think that steps 3 and 4 cannot occur
> > > > because Process-B must have already encountered the catalog_xmin
> > > > maintained by Process-A, either 50 or 100. Consequently, Process-B
> > > > will refrain from updating the catalog_xmin to a more recent value, such
> as
> > > 150.
> > >
> > > Right. But the following scenario seems to happen:
> > >
> > > 1. Both processes have a slot with effective_catalog_xmin = 100.
> > > 2. Process-A updates effective_catalog_xmin to 150, and computes the
> new
> > > catalog_xmin as 100 because process-B slot still has
> effective_catalog_xmin =
> > > 100.
> > > 3. Process-B updates effective_catalog_xmin to 150, and computes the
> new
> > > catalog_xmin as 150.
> > > 4. Process-B updates procArray->replication_slot_catalog_xmin to 150.
> > > 5. Process-A updates procArray->replication_slot_catalog_xmin to 100.
> >
> > I think this scenario can occur, but is not harmful. Because the catalog rows
> > removed prior to xid:150 would no longer be used, as both slots have
> advanced
> > their catalog_xmin and flushed the value to disk. Therefore, even if
> > replication_slot_catalog_xmin regresses, it should be OK.
> >
> > Considering all above, I think allowing concurrent xmin computation, as the
> > patch does, is acceptable. What do you think ?
>
> I agree with your analysis. Another thing I'd like to confirm is that
> in an extreme case, if the server crashes suddenly after removing
> catalog tuples older than XID 100 and logical decoding restarts, it
> ends up missing necessary catalog tuples? I think it's not a problem
> as long as the subscriber knows the next commit LSN they want but
> could it be problematic if the user switches to use the logical
> decoding SQL API? I might be worrying too much, though.
I think this case is not a problem because:
In LogicalConfirmReceivedLocation, the updated restart_lsn and catalog_xmin are
flushed to disk before the effective_catalog_xmin is updated. Thus, once
replication_slot_catalog_xmin advances to a certain value, even in the event of
a crash, users won't encounter any removed tuples when consuming from slots
after a restart. This is because all slots have their updated restart_lsn
flushed to disk, ensuring that upon restarting, changes are decoded from the
updated position where older catalog tuples are no longer needed.
BTW, I assume you meant catalog tuples older than XID 150 are removed, since in
the previous example, tuples older than XID 100 are already not useful.
Best Regards,
Hou zj
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tan Yang | 2025-12-10 03:34:38 | Re: log_min_messages per backend type |
| Previous Message | Ajin Cherian | 2025-12-10 02:40:10 | Re: Improve pg_sync_replication_slots() to wait for primary to advance |