Fix assertion failure in heap_vacuum_rel
authorDaniel Gustafsson <[email protected]>
Fri, 28 Apr 2023 08:30:05 +0000 (10:30 +0200)
committerDaniel Gustafsson <[email protected]>
Fri, 28 Apr 2023 08:30:05 +0000 (10:30 +0200)
Commit 7d71d3dd08 changed resetting the VacuumFailsafeActive flag to an
assertion since the flag is reset before starting vacuuming a relation.
This however failed to take recursive calls of vacuum_rel() and vacuum
of TOAST tables into consideration. Fix by reverting back to resettting
the flag.

Author: Masahiko Sawada <[email protected]>
Reviewed-by: Melanie Plageman <[email protected]>
Reported-by: John Naylor <[email protected]>
Discussion: https://postgr.es/m/CAFBsxsFz=GqaG5Ens5aNgVYoV2Y+pfMUijX0ku+CCkWfALwiqg@mail.gmail.com

src/backend/access/heap/vacuumlazy.c

index 0a9ebd22bd05828e6492f4ff7fc17c1164859b3e..442db3551b040e3743ad3d69d30f28dc1f2f74c3 100644 (file)
@@ -389,7 +389,11 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
        Assert(params->index_cleanup != VACOPTVALUE_UNSPECIFIED);
        Assert(params->truncate != VACOPTVALUE_UNSPECIFIED &&
                   params->truncate != VACOPTVALUE_AUTO);
-       Assert(!VacuumFailsafeActive);
+       /*
+        * While VacuumFailSafeActive is reset to false before calling this, we
+        * still need to reset it here due to recursive calls.
+        */
+       VacuumFailsafeActive = false;
        vacrel->consider_bypass_optimization = true;
        vacrel->do_index_vacuuming = true;
        vacrel->do_index_cleanup = true;