If an interrupt arrives in the middle of FinishPreparedTransaction and any callback decide to call CHECK_FOR_INTERRUPTS (e.g. RemoveTwoPhaseFile can write a warning with ereport, which checks for interrupts) then it's possible to leave current GXact undeleted.
Backpatch to all supported branches
8f9be261f4 Add HOLD_INTERRUPTS section into FinishPreparedTransaction.
src/backend/access/transam/twophase.c | 5 +++++
1 file changed, 5 insertions(+)