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