> On Sep 10, 2021, at 8:42 AM, Mark Dilger <mark.dilger@enterprisedb.com> wrote:
>
> Take for example a code stanza from heapam.c:
>
> if (needwal)
> CheckWALPermitted();
>
> /* NO EREPORT(ERROR) from here till changes are logged */
> START_CRIT_SECTION();
>
> Now, I know that interrupts won't be processed after starting the critical section, but I can see plain as day that
aninterrupt might get processed *during* CheckWALPermitted, since that function isn't atomic.
A better example may be found in ginmetapage.c:
needwal = RelationNeedsWAL(indexrel);
if (needwal)
{
CheckWALPermitted();
computeLeafRecompressWALData(leaf);
}
/* Apply changes to page */
START_CRIT_SECTION();
Even if CheckWALPermitted is assumed to be close enough to atomic to not be a problem (I don't agree), that argument
can'tbe made here, as computeLeafRecompressWALData is not trivial and signals could easily be processed while it is
running.
—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company