* 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