On Tue, Feb 20, 2024 at 3:38 PM Robert Haas <robertmh...@gmail.com> wrote:
> Let's say fast_forward is true. Then smgr_decode() is going to skip > recording anything about the relfilenode, so we'll identify all > sequence changes as non-transactional. But look at how this case is > handled in seq_decode(): > > + if (ctx->fast_forward) > + { > + /* > + * We need to set processing_required flag to notify the sequence > + * change existence to the caller. Usually, the flag is set when > + * either the COMMIT or ABORT records are decoded, but this must be > + * turned on here because the non-transactional logical message is > + * decoded without waiting for these records. > + */ > + if (!transactional) > + ctx->processing_required = true; > + > + return; > + } It appears that the 'processing_required' flag was introduced as part of supporting upgrades for logical replication slots. Its purpose is to determine whether a slot is fully caught up, meaning that there are no pending decodable changes left before it can be upgraded. So now if some change was transactional but we have identified it as non-transaction then we will mark this flag 'ctx->processing_required = true;' so we temporarily set this flag incorrectly, but even if the flag would have been correctly identified initially, it would have been set again to true in the DecodeTXNNeedSkip() function regardless of whether the transaction is committed or aborted. As a result, the flag would eventually be set to 'true', and the behavior would align with the intended logic. But I am wondering why this flag is always set to true in DecodeTXNNeedSkip() irrespective of the commit or abort. Because the aborted transactions are not supposed to be replayed? So if my observation is correct that for the aborted transaction, this shouldn't be set to true then we have a problem with sequence where we are identifying the transactional changes as non-transaction changes because now for transactional changes this should depend upon commit status. On another thought, can there be a situation where we have identified this flag wrongly as non-transaction and set this flag, and the commit/abort record never appeared in the WAL so never decoded? That can also lead to an incorrect decision during the upgrade. -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com