Re: error context for vacuum to include block number - Mailing list pgsql-hackers

From Masahiko Sawada
Subject Re: error context for vacuum to include block number
Date
Msg-id CA+fd4k6-zFG=mvkZzgsLQZ3v+df5Bk_0d8tpSzcRV0u40dM0rw@mail.gmail.com
Whole thread Raw
In response to Re: error context for vacuum to include block number  (Amit Kapila <amit.kapila16@gmail.com>)
Responses Re: error context for vacuum to include block number  (Justin Pryzby <pryzby@telsasoft.com>)
List pgsql-hackers
On Wed, 25 Mar 2020 at 20:24, Amit Kapila <amit.kapila16@gmail.com> wrote:
>
> On Wed, Mar 25, 2020 at 3:42 PM Justin Pryzby <pryzby@telsasoft.com> wrote:
> >
> > Attached patch addressing these.
> >
>
> Thanks, you forgot to remove the below declaration which I have
> removed in attached.
>
> @@ -724,20 +758,20 @@ lazy_scan_heap(Relation onerel, VacuumParams
> *params, LVRelStats *vacrelstats,
>   PROGRESS_VACUUM_MAX_DEAD_TUPLES
>   };
>   int64 initprog_val[3];
> + ErrorContextCallback errcallback;
>
> Apart from this, I have ran pgindent and now I think it is in good
> shape.  Do you have any other comments?  Sawada-San, can you also
> check the attached patch and let me know if you have any additional
> comments.
>

Thank you for updating the patch! I have a question about the following code:

+        /* Update error traceback information */
+        olderrcbarg = *vacrelstats;
+        update_vacuum_error_cbarg(vacrelstats, VACUUM_ERRCB_PHASE_TRUNCATE,
+                                  vacrelstats->nonempty_pages, NULL, false);
+
         /*
          * Scan backwards from the end to verify that the end pages actually
          * contain no tuples.  This is *necessary*, not optional, because
          * other backends could have added tuples to these pages whilst we
          * were vacuuming.
          */
         new_rel_pages = count_nondeletable_pages(onerel, vacrelstats);
+        vacrelstats->blkno = new_rel_pages;

         if (new_rel_pages >= old_rel_pages)
         {
             /* can't do anything after all */
             UnlockRelation(onerel, AccessExclusiveLock);
             return;
         }

         /*
          * Okay to truncate.
          */
         RelationTruncate(onerel, new_rel_pages);

+        /* Revert back to the old phase information for error traceback */
+        update_vacuum_error_cbarg(vacrelstats,
+                                  olderrcbarg.phase,
+                                  olderrcbarg.blkno,
+                                  olderrcbarg.indname,
+                                  true);

vacrelstats->nonempty_pages is the last non-empty block while
new_rel_pages, the result of count_nondeletable_pages(), is the number
of blocks that we can truncate to in this attempt. Therefore
vacrelstats->nonempty_pages <= new_rel_pages. This means that we set a
lower block number to arguments and then set a higher block number
after count_nondeletable_pages, and then revert it back to
VACUUM_ERRCB_PHASE_SCAN_HEAP phase and the number of blocks of
relation before truncation, after RelationTruncate(). It can be
repeated until no more truncating can be done. Why do we need to
revert back to the scan heap phase? If we can use
vacrelstats->nonempty_pages in the error context message as the
remaining blocks after truncation I think we can update callback
arguments once at the beginning of lazy_truncate_heap() and don't
revert to the previous phase, and pop the error context after exiting.

Regards,

--
Masahiko Sawada            http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services



pgsql-hackers by date:

Previous
From: James Coleman
Date:
Subject: Re: improve transparency of bitmap-only heap scans
Next
From: Peter Eisentraut
Date:
Subject: Re: adding partitioned tables to publications