On Mon, Apr 27, 2020 at 4:05 PM Dilip Kumar <dilipbal...@gmail.com> wrote: > [latest patches]
v16-0004-Gracefully-handle-concurrent-aborts-of-uncommitt - Any actions leading to transaction ID assignment are prohibited. That, among others, + Note that access to user catalog tables or regular system catalog tables + in the output plugins has to be done via the <literal>systable_*</literal> scan APIs only. + Access via the <literal>heap_*</literal> scan APIs will error out. + Additionally, any actions leading to transaction ID assignment are prohibited. That, among others, .. @@ -1383,6 +1392,14 @@ heap_fetch(Relation relation, bool valid; /* + * We don't expect direct calls to heap_fetch with valid + * CheckXidAlive for regular tables. Track that below. + */ + if (unlikely(TransactionIdIsValid(CheckXidAlive) && + !(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))) + elog(ERROR, "unexpected heap_fetch call during logical decoding"); + I think comments and code don't match. In the comment, we are saying that via output plugins access to user catalog tables or regular system catalog tables won't be allowed via heap_* APIs but code doesn't seem to reflect it. I feel only TransactionIdIsValid(CheckXidAlive) is sufficient here. See, the original discussion about this point [1] (Refer "I think it'd also be good to add assertions to codepaths not going through systable_* asserting that ..."). Isn't it better to block the scan to user catalog tables or regular system catalog tables for tableam scan APIs rather than at the heap level? There might be some APIs like heap_getnext where such a check might still be required but I guess it is still better to block at tableam level. [1] - https://www.postgresql.org/message-id/20180726200241.aje4dv4jsv25v4k2%40alap3.anarazel.de -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com