Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote:

> 
> 
> > From bf2ec8c5d753de340140839f1b061044ec4c1149 Mon Sep 17 00:00:00 2001
> > From: Antonin Houska <a...@cybertec.at>
> > Date: Mon, 13 Jan 2025 14:29:54 +0100
> > Subject: [PATCH 4/8] Add CONCURRENTLY option to both VACUUM FULL and CLUSTER
> >  commands.
> 
> > @@ -950,8 +1412,46 @@ copy_table_data(Relation NewHeap, Relation OldHeap, 
> > Relation OldIndex, bool verb
> 
> > +           if (concurrent)
> > +           {
> > +                   PgBackendProgress       progress;
> > +
> > +                   /*
> > +                    * Command progress reporting gets terminated at 
> > subtransaction
> > +                    * end. Save the status so it can be eventually 
> > restored.
> > +                    */
> > +                   memcpy(&progress, &MyBEEntry->st_progress,
> > +                              sizeof(PgBackendProgress));
> > +
> > +                   /* Release the locks by aborting the subtransaction. */
> > +                   RollbackAndReleaseCurrentSubTransaction();
> > +
> > +                   /* Restore the progress reporting status. */
> > +                   pgstat_progress_restore_state(&progress);
> > +
> > +                   CurrentResourceOwner = oldowner;
> > +           }
> 
> I was looking at 0002 to see if it'd make sense to commit it ahead of a
> fuller review of the rest, and I find that the reason for that patch is
> this hunk you have here in copy_table_data -- you want to avoid a
> subtransaction abort (which you use to release planner lock) clobbering
> the status.  I think this a bad idea.  It might be better to handle this
> in a different way, for instance
> 
> 1) maybe have a flag that says "do not reset progress status during
> subtransaction abort"; REPACK would set that flag, so it'd be able to
> continue its business without having to memcpy the current status (which
> seems like quite a hack) or restoring it afterwards.
> 
> 2) maybe subtransaction abort is not the best way to release the
> planning locks anyway.  I think it might be better to have a
> ResourceOwner that owns those locks, and we do ResourceOwnerRelease()
> which would release them.  I think this would be a novel usage of
> ResourceOwner so it needs more research.  But if this works, then we
> don't need the subtransaction at all, and therefore we don't need
> backend progress restore at all either.

If this needs change, I prefer 2) because it's less invasive: 1) still affects
the progress monitoring code. I'll look at it.

-- 
Antonin Houska
Web: https://www.cybertec-postgresql.com


Reply via email to