From bbbd008cb28b6264574d9ca68d79fee037c46c0a Mon Sep 17 00:00:00 2001 From: Alexey Bashtanov Date: Wed, 1 Nov 2017 15:03:33 +0000 Subject: [PATCH 1/3] fix relfrozenxid and relminmxid on table data files swap --- lib/repack.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/repack.c b/lib/repack.c index ff60df8..bf08faf 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -1189,6 +1189,7 @@ swap_heap_or_index_files(Oid r1, Oid r2) Form_pg_class relform1, relform2; Oid swaptemp; + TransactionId swaptempxid; CatalogIndexState indstate; /* We need writable copies of both pg_class tuples. */ @@ -1225,15 +1226,18 @@ swap_heap_or_index_files(Oid r1, Oid r2) relform1->reltoastrelid = relform2->reltoastrelid; relform2->reltoastrelid = swaptemp; - /* set rel1's frozen Xid to larger one */ - if (TransactionIdIsNormal(relform1->relfrozenxid)) - { - if (TransactionIdFollows(relform1->relfrozenxid, - relform2->relfrozenxid)) - relform1->relfrozenxid = relform2->relfrozenxid; - else - relform2->relfrozenxid = relform1->relfrozenxid; - } + /* + * Swap relfrozenxid and relminmxid, as they must be consistent with the data + */ + swaptemp = relform1->relfrozenxid; + relform1->relfrozenxid = relform2->relfrozenxid; + relform2->relfrozenxid = swaptempxid; + +#if PG_VERSION_NUM >= 90300 + swaptemp = relform1->relminmxid; + relform1->relminmxid = relform2->relminmxid; + relform2->relminmxid = swaptempxid; +#endif /* swap size statistics too, since new rel has freshly-updated stats */ { @@ -1247,6 +1251,12 @@ swap_heap_or_index_files(Oid r1, Oid r2) swap_tuples = relform1->reltuples; relform1->reltuples = relform2->reltuples; relform2->reltuples = swap_tuples; + +#if PG_VERSION_NUM >= 90200 + swap_pages = relform1->relallvisible; + relform1->relallvisible = relform2->relallvisible; + relform2->relallvisible = swap_pages; +#endif } indstate = CatalogOpenIndexes(relRelation); From 1b5daa9b5fdf94d2eae729316a94a1b4e36e2f37 Mon Sep 17 00:00:00 2001 From: Artur Zakirov Date: Fri, 5 Jan 2024 15:50:52 +0100 Subject: [PATCH 2/3] Fix typos and don't use PG_VERSION_NUM condition --- lib/repack.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/repack.c b/lib/repack.c index bf08faf..3dff816 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -1229,20 +1229,22 @@ swap_heap_or_index_files(Oid r1, Oid r2) /* * Swap relfrozenxid and relminmxid, as they must be consistent with the data */ - swaptemp = relform1->relfrozenxid; - relform1->relfrozenxid = relform2->relfrozenxid; - relform2->relfrozenxid = swaptempxid; - -#if PG_VERSION_NUM >= 90300 - swaptemp = relform1->relminmxid; - relform1->relminmxid = relform2->relminmxid; - relform2->relminmxid = swaptempxid; -#endif + if (relform1->relkind != RELKIND_INDEX) + { + swaptempxid = relform1->relfrozenxid; + relform1->relfrozenxid = relform2->relfrozenxid; + relform2->relfrozenxid = swaptempxid; + + swaptempxid = relform1->relminmxid; + relform1->relminmxid = relform2->relminmxid; + relform2->relminmxid = swaptempxid; + } /* swap size statistics too, since new rel has freshly-updated stats */ { int32 swap_pages; float4 swap_tuples; + int32 swap_allvisible; swap_pages = relform1->relpages; relform1->relpages = relform2->relpages; @@ -1252,11 +1254,9 @@ swap_heap_or_index_files(Oid r1, Oid r2) relform1->reltuples = relform2->reltuples; relform2->reltuples = swap_tuples; -#if PG_VERSION_NUM >= 90200 - swap_pages = relform1->relallvisible; + swap_allvisible = relform1->relallvisible; relform1->relallvisible = relform2->relallvisible; - relform2->relallvisible = swap_pages; -#endif + relform2->relallvisible = swap_allvisible; } indstate = CatalogOpenIndexes(relRelation); From 3792badbf191cb55a551d8144c352ef33d2bca7f Mon Sep 17 00:00:00 2001 From: Artur Zakirov Date: Mon, 20 May 2024 23:42:07 +0200 Subject: [PATCH 3/3] Rename swaptempxid to fronzenxid, add minmxid --- lib/repack.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/repack.c b/lib/repack.c index 3dff816..26a937d 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -1189,7 +1189,6 @@ swap_heap_or_index_files(Oid r1, Oid r2) Form_pg_class relform1, relform2; Oid swaptemp; - TransactionId swaptempxid; CatalogIndexState indstate; /* We need writable copies of both pg_class tuples. */ @@ -1231,13 +1230,16 @@ swap_heap_or_index_files(Oid r1, Oid r2) */ if (relform1->relkind != RELKIND_INDEX) { - swaptempxid = relform1->relfrozenxid; + TransactionId frozenxid; + MultiXactId minmxid; + + frozenxid = relform1->relfrozenxid; relform1->relfrozenxid = relform2->relfrozenxid; - relform2->relfrozenxid = swaptempxid; + relform2->relfrozenxid = frozenxid; - swaptempxid = relform1->relminmxid; + minmxid = relform1->relminmxid; relform1->relminmxid = relform2->relminmxid; - relform2->relminmxid = swaptempxid; + relform2->relminmxid = minmxid; } /* swap size statistics too, since new rel has freshly-updated stats */