postgres.git / summary / log / commit / refs
commit 963a6b6fa45d8f7627c14be7295f709ef92204f5
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu Aug 04 18:10:06 2022 +0000
Add CHECK_FOR_INTERRUPTS in ExecInsert's speculative insertion loop.
Ordinarily the functions called in this loop ought to have plenty
of CFIs themselves; but we've now seen a case where no such CFI is
reached, making the loop uninterruptible. Even though that's from
a recently-introduced bug, it seems prudent to install a CFI at
the loop level in all branches.
Per discussion of bug #17558 from Andrew Kesper (an actual fix for
that bug will follow).
Discussion: https://postgr.es/m/17558-3f6599ffcf52fd4a@postgresql.org
src/backend/executor/nodeModifyTable.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 24b4818d35c..91bd0de28ce 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -516,9 +516,11 @@ ExecInsert(ModifyTableState *mtstate,
*
* We loop back here if we find a conflict below, either during
* the pre-check, or when we re-check after inserting the tuple
- * speculatively.
+ * speculatively. Better allow interrupts in case some bug makes
+ * this an infinite loop.
*/
vlock:
+ CHECK_FOR_INTERRUPTS();
specConflict = false;
if (!ExecCheckIndexConstraints(slot, estate, &conflictTid,
arbiterIndexes))
[parent: 9c92a10f5a98]