On Thursday, January 2, 2025 2:30 PM Amit Kapila <amit.kapil...@gmail.com> wrote: > > Sounds reasonable but OTOH, all other places that create physical > slots (which we are doing here) don't use this trick. So, don't they > need similar reliability?
I have not figured the reason for existing physical slots' handling, but will think more. > Also, add some comments as to why we are > initially creating the RS_EPHEMERAL slot as we have at other places. Added. > > Few other comments on 0003 > ======================= > 1. > + if (sublist) > + { > + bool updated; > + > + if (!can_advance_xmin) > + xmin = InvalidFullTransactionId; > + > + updated = advance_conflict_slot_xmin(xmin); > > How will it help to try advancing slot_xmin when xmin is invalid? It was intended to create the slot without updating the xmin in this case, but the function name seems misleading. So, I will think more on this and modify it in next version because it may also be affected by the discussion in [1]. > > 2. > @@ -1167,14 +1181,43 @@ ApplyLauncherMain(Datum main_arg) > long elapsed; > > if (!sub->enabled) > + { > + can_advance_xmin = false; > > In ApplyLauncherMain(), if one of the subscriptions is disabled (say > the last one in sublist), then can_advance_xmin will become false in > the above code. Now, later, as quoted in comment-1, the patch > overrides xmin to InvalidFullTransactionId if can_advance_xmin is > false. Won't that lead to the wrong computation of xmin? advance_conflict_slot_xmin() would skip updating the slot.xmin if the input value is invalid. But I will think how to improve this in next version. > > 3. > + slot_maybe_exist = true; > + } > + > + /* > + * Drop the slot if we're no longer retaining dead tuples. > + */ > + else if (slot_maybe_exist) > + { > + drop_conflict_slot_if_exists(); > + slot_maybe_exist = false; > > Can't we use MyReplicationSlot instead of introducing a new boolean > slot_maybe_exist? > > In any case, how does the above code deal with the case where the > launcher is restarted for some reason and there is no subscription > after that? Will it be possible to drop the slot in that case? Since the initial value of slot_maybe_exist is true, so I think the launcher would always check the slot once and drop the slot if not needed even if the launcher restarted. [1] https://www.postgresql.org/message-id/CAA4eK1Li8XLJ5f-pYvPJ8pXxyA3G-QsyBLNzHY940amF7jm%3D3A%40mail.gmail.com Best Regards, Hou zj