Lock the TOAST table early in REPACK (CONCURRENTLY) The decoding worker records the relfilenumber of the TOAST table when it starts, and skips changes stored under any other one, but the TOAST table was not locked until the data copy began. If VACUUM FULL rewrote it while the worker was starting, concurrent updates of TOASTed columns were silently lost.
Fix by locking the TOAST table in cluster_rel() in the concurrent case, before the worker starts. Author: Shihao Zhong <[email protected]> Reported-by: Thom Brown <[email protected]> Backpatch-through: 19 Discussion: https://postgr.es/m/caa-alv5mf6bll+bwvix2yw+cbardth43aofprequnhdzpnb...@mail.gmail.com Branch ------ REL_19_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/76a268273c87b8efda86a3a729f5b89c60f48882 Modified Files -------------- src/backend/commands/repack.c | 34 ++++- src/backend/commands/repack_worker.c | 5 +- .../injection_points/expected/repack_toast.out | 152 ++++++++++++++++++++- .../injection_points/specs/repack_toast.spec | 45 ++++++ 4 files changed, 229 insertions(+), 7 deletions(-)
