Hello Amit,
thanks for your very quick response.
On 08.02.21 11:13, Amit Kapila wrote:
> /*
> * It is possible that this transaction is not decoded at prepare time
> * either because by that time we didn't have a consistent snapshot or it
> * was decoded earlier but we have restarted. We can't distinguish between
> * those two cases so we send the prepare in both the cases and let
> * downstream decide whether to process or skip it. We don't need to
> * decode the xact for aborts if it is not done already.
> */
The way I read the surrounding code, the only case a 2PC transaction
does not get decoded a prepare time is if the transaction is empty. Or
are you aware of any other situation that might currently happen?
> (unless the server needs to be restarted due to some reason)
Right, the repetition occurs only after a restart of the walsender in
between a prepare and a commit prepared record.
> That anyway is true without this work as well where restart_lsn can be
> advanced on commits. We haven't changed anything in that regard.
I did not mean to blame the patch, but merely try to understand some of
the design decisions behind it.
And as I just learned, even if we managed to avoid the repetition, a
restarted walsender still needs to see prepared transactions as
in-progress in its snapshots. So we cannot move forward the restart_lsn
to after a prepare record (until the final commit or rollback is consumed).
Best Regards
Markus