aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/indexcmds.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index f2dcc1c51fb..dda0dcb8aa8 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -1197,14 +1197,25 @@ DefineIndex(Oid relationId,
* doing CREATE INDEX CONCURRENTLY, which would see our snapshot as one
* they must wait for. But first, save the snapshot's xmin to use as
* limitXmin for GetCurrentVirtualXIDs().
- *
- * Our catalog snapshot could have the same effect, so drop that one too.
*/
limitXmin = snapshot->xmin;
PopActiveSnapshot();
UnregisterSnapshot(snapshot);
- InvalidateCatalogSnapshot();
+
+ /*
+ * The snapshot subsystem could still contain registered snapshots that
+ * are holding back our process's advertised xmin; in particular, if
+ * default_transaction_isolation = serializable, there is a transaction
+ * snapshot that is still active. The CatalogSnapshot is likewise a
+ * hazard. To ensure no deadlocks, we must commit and start yet another
+ * transaction, and do our wait before any snapshot has been taken in it.
+ */
+ CommitTransactionCommand();
+ StartTransactionCommand();
+
+ /* We should now definitely not be advertising any xmin. */
+ Assert(MyPgXact->xmin == InvalidTransactionId);
/*
* The index is now valid in the sense that it contains all currently