On Sat, Jan 30, 2016 at 04:28:47PM -0500, Robert Haas wrote:
> I think I've
> pretty much said what I have to say about this; if nothing I wrote up
> until now swayed you, it's unlikely that anything else I say after
> this point will either.

Say I drop the parts that change the binary.  Does the attached v2 manage to
improve PostgreSQL, or is it neutral-or-harmful like v1?

On Sat, Jan 30, 2016 at 04:28:47PM -0500, Robert Haas wrote:
> On Sat, Jan 30, 2016 at 2:13 PM, Noah Misch <n...@leadboat.com> wrote:
> > On Sat, Jan 30, 2016 at 07:37:45AM -0500, Robert Haas wrote:
> > > On Fri, Jan 29, 2016 at 11:19 PM, Noah Misch <n...@leadboat.com> wrote:
> > > > On Thu, Jan 28, 2016 at 11:12:15AM -0500, Robert Haas wrote:
> > > >> The code you quote emits a warning
> > > >> about a reasonably forseeable situation that can never be right, but
> > > >> there's no particular reason to think that MarkPortalFailed is the
> > > >> wrong thing to do here if that situation came up.
> > > >
> > > > I have two reasons to expect these MarkPortalFailed() calls will be the 
> > > > wrong
> > > > thing for hypothetical code reaching them.  First, PortalRun() and 
> > > > peers reset
> > > > ActivePortal and PortalContext on error in addition to fixing portal 
> > > > status
> > > > with MarkPortalFailed().  If code forgets to update the status, there's 
> > > > a
> > > > substantial chance it forgot the other two.  My patch added a comment
> > > > explaining the second reason:
> > > >
> > > > +               /*
> > > > +                * See similar code in AtSubAbort_Portals().  This 
> > > > would fire if code
> > > > +                * orchestrating multiple top-level transactions within 
> > > > a portal, such
> > > > +                * as VACUUM, caught errors and continued under the 
> > > > same portal with a
> > > > +                * fresh transaction.  No part of core PostgreSQL 
> > > > functions that way,
> > > > +                * though it's a fair thing to want.  Such code would 
> > > > wish the portal
> > > > +                * to remain ACTIVE, as in PreCommit_Portals(); we 
> > > > don't cater to
> > > > +                * that.  Instead, like AtSubAbort_Portals(), interpret 
> > > > this as a bug.
> > > > +                */
> > > 
> > > You may be right, but then again Tom had a different opinion, even
> > > after seeing your patch, and he's no dummy.
> >
> > Eh?  Tom last posted to this thread before I first posted a patch.
> 
> http://www.postgresql.org/message-id/29758.1451780...@sss.pgh.pa.us
> seems to me to be a vote against the concept embodied by the patch.

That much is true.  The order of postings is the opposite of what you stated,
and there's no mailing list evidence that anyone other than you has read my
explanation of why MarkPortalFailed() is wrong here.  Alternately, I demand
the schematics for Tom's time machine.
diff --git a/src/backend/utils/mmgr/portalmem.c 
b/src/backend/utils/mmgr/portalmem.c
index a53673c..c840aa6 100644
--- a/src/backend/utils/mmgr/portalmem.c
+++ b/src/backend/utils/mmgr/portalmem.c
@@ -765,7 +765,14 @@ AtAbort_Portals(void)
        {
                Portal          portal = hentry->portal;
 
-               /* Any portal that was actually running has to be considered 
broken */
+               /*
+                * See similar code in AtSubAbort_Portals().  This would fire 
if code
+                * orchestrating multiple top-level transactions within a 
portal, such
+                * as VACUUM, caught errors and continued under the same portal 
with a
+                * fresh transaction.  No part of core PostgreSQL functions 
that way.
+                * XXX Such code would wish the portal to remain ACTIVE, as in
+                * PreCommit_Portals().
+                */
                if (portal->status == PORTAL_ACTIVE)
                        MarkPortalFailed(portal);
 
@@ -919,9 +926,11 @@ AtSubAbort_Portals(SubTransactionId mySubid,
                                portal->activeSubid = parentSubid;
 
                                /*
-                                * Upper-level portals that failed while 
running in this
-                                * subtransaction must be forced into FAILED 
state, for the
-                                * same reasons discussed below.
+                                * If a bug in a MarkPortalActive() caller has 
it miss cleanup
+                                * after having failed while running an 
upper-level portal in
+                                * this subtransaction, we don't know what else 
in the portal
+                                * is wrong.  Force it into FAILED state, for 
the same reasons
+                                * discussed below.
                                 *
                                 * We assume we can get away without forcing 
upper-level READY
                                 * portals to fail, even if they were run and 
then suspended.
@@ -960,7 +969,11 @@ AtSubAbort_Portals(SubTransactionId mySubid,
                 * Force any live portals of my own subtransaction into FAILED 
state.
                 * We have to do this because they might refer to objects 
created or
                 * changed in the failed subtransaction, leading to crashes 
within
-                * ExecutorEnd when portalcmds.c tries to close down the portal.
+                * ExecutorEnd when portalcmds.c tries to close down the 
portal.  Each
+                * MarkPortalActive() caller ensures it updates the portal 
status
+                * again before relinquishing control, so ACTIVE can't happen 
here.
+                * If a bug does make it happen, dispose the portal like a 
normal
+                * MarkPortalActive() caller would.
                 */
                if (portal->status == PORTAL_READY ||
                        portal->status == PORTAL_ACTIVE)
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to