> 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.

-- 
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/


Reply via email to