pg_upgrade: Fix last multixid ending at offset wraparound On v18 and below, if the newest multixid's members end exactly at the the 32-bit offset wraparound point, the next offset in the control file is 0. GetOldMultiXactIdSingleMember() treated that as an invalid entry and dropped the multixid's members, so after upgrade accessing the tuple failed with "MultiXact N has invalid offset".
To fix, only check for zero offset when it was read from the next multixid's slot, like GetMultiXactIdMembers() did in v18. This is unlikely to happen in practice, but better to get it right. The bug came with commit bd8d9c9bdfa in v19. Author: Zsolt Parragi <[email protected]> Discussion: https://www.postgresql.org/message-id/can4czfm8bcazgz6s1vn5tmexyixe2fi8t2rwmwxsty5gd+h...@mail.gmail.com Backpatch-through: 19 Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/2323f03a1789bc52bee980c56b8057470458701a Modified Files -------------- src/bin/pg_upgrade/multixact_read_v18.c | 17 +++++---- src/bin/pg_upgrade/t/007_multixact_conversion.pl | 44 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-)
