]> granicus.if.org Git - postgresql/commitdiff
This patch will ensure that the hash table iteration performed by
authorBruce Momjian <bruce@momjian.us>
Wed, 11 May 2005 18:05:37 +0000 (18:05 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 11 May 2005 18:05:37 +0000 (18:05 +0000)
AtCommit_Portals is restarted when a portal is deleted. This is
necessary since the deletion of a portal may cause the deletion of
another which on rare occations may cause the iterator to return a
deleted portal an thus a renewed attempt delete.

Thomas Hallgren

src/backend/utils/mmgr/portalmem.c

index fd8a737adae0996e2ccb76ce9b1200f6e3ff563c..362d3df967fd0faa514b24f916b1548f3f00d014 100644 (file)
@@ -12,7 +12,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.78 2005/04/11 19:51:15 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.79 2005/05/11 18:05:37 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -475,12 +475,6 @@ CommitHoldablePortals(void)
  *
  * Remove all non-holdable portals created in this transaction.
  * Portals remaining from prior transactions should be left untouched.
- *
- * XXX This assumes that portals can be deleted in a random order, ie,
- * no portal has a reference to any other (at least not one that will be
- * exercised during deletion). I think this is okay at the moment, but
- * we've had bugs of that ilk in the past.  Keep a close eye on cursor
- * references...
  */
 void
 AtCommit_Portals(void)
@@ -516,6 +510,9 @@ AtCommit_Portals(void)
 
                /* Zap all non-holdable portals */
                PortalDrop(portal, true);
+
+               /* Restart the iteration */
+               hash_seq_init(&status, PortalHashTable);
        }
 }