Improve the vacuum error context phase information.
authorAmit Kapila <akapila@postgresql.org>
Mon, 24 Aug 2020 02:46:19 +0000 (08:16 +0530)
committerAmit Kapila <akapila@postgresql.org>
Mon, 24 Aug 2020 02:46:19 +0000 (08:16 +0530)
We were displaying the wrong phase information for 'info' message in the
index clean up phase because we were switching to the previous phase a bit
early. We were also not displaying context information for heap phase
unless the block number is valid which is fine for error cases but for
messages at 'info' or lower error level it appears to be inconsistent with
index phase information.

Reported-by: Sawada Masahiko
Author: Sawada Masahiko
Reviewed-by: Amit Kapila
Backpatch-through: 13, where it was introduced
Discussion: https://postgr.es/m/CA+fd4k4HcbhPnCs7paRTw1K-AHin8y4xKomB9Ru0ATw0UeTy2w@mail.gmail.com

src/backend/access/heap/vacuumlazy.c

index 44e2224dd557bd693d6e0ee113c51ac893c6ad02..8de31bf071b8a47c3f2e42a5df496d0526ad7e97 100644 (file)
@@ -1662,6 +1662,9 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
    /* report that everything is scanned and vacuumed */
    pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
 
+   /* Clear the block number information */
+   vacrelstats->blkno = InvalidBlockNumber;
+
    pfree(frozen);
 
    /* save stats for use later */
@@ -1879,6 +1882,9 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats)
        npages++;
    }
 
+   /* Clear the block number information */
+   vacrelstats->blkno = InvalidBlockNumber;
+
    if (BufferIsValid(vmbuffer))
    {
        ReleaseBuffer(vmbuffer);
@@ -2496,30 +2502,30 @@ lazy_cleanup_index(Relation indrel,
 
    *stats = index_vacuum_cleanup(&ivinfo, *stats);
 
+   if (*stats)
+   {
+       if (IsParallelWorker())
+           msg = gettext_noop("index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker");
+       else
+           msg = gettext_noop("index \"%s\" now contains %.0f row versions in %u pages");
+
+       ereport(elevel,
+               (errmsg(msg,
+                       RelationGetRelationName(indrel),
+                       (*stats)->num_index_tuples,
+                       (*stats)->num_pages),
+                errdetail("%.0f index row versions were removed.\n"
+                          "%u index pages have been deleted, %u are currently reusable.\n"
+                          "%s.",
+                          (*stats)->tuples_removed,
+                          (*stats)->pages_deleted, (*stats)->pages_free,
+                          pg_rusage_show(&ru0))));
+   }
+
    /* Revert back to the old phase information for error traceback */
    restore_vacuum_error_info(vacrelstats, &saved_err_info);
    pfree(vacrelstats->indname);
    vacrelstats->indname = NULL;
-
-   if (!(*stats))
-       return;
-
-   if (IsParallelWorker())
-       msg = gettext_noop("index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker");
-   else
-       msg = gettext_noop("index \"%s\" now contains %.0f row versions in %u pages");
-
-   ereport(elevel,
-           (errmsg(msg,
-                   RelationGetRelationName(indrel),
-                   (*stats)->num_index_tuples,
-                   (*stats)->num_pages),
-            errdetail("%.0f index row versions were removed.\n"
-                      "%u index pages have been deleted, %u are currently reusable.\n"
-                      "%s.",
-                      (*stats)->tuples_removed,
-                      (*stats)->pages_deleted, (*stats)->pages_free,
-                      pg_rusage_show(&ru0))));
 }
 
 /*
@@ -3582,12 +3588,18 @@ vacuum_error_callback(void *arg)
            if (BlockNumberIsValid(errinfo->blkno))
                errcontext("while scanning block %u of relation \"%s.%s\"",
                           errinfo->blkno, errinfo->relnamespace, errinfo->relname);
+           else
+               errcontext("while scanning relation \"%s.%s\"",
+                          errinfo->relnamespace, errinfo->relname);
            break;
 
        case VACUUM_ERRCB_PHASE_VACUUM_HEAP:
            if (BlockNumberIsValid(errinfo->blkno))
                errcontext("while vacuuming block %u of relation \"%s.%s\"",
                           errinfo->blkno, errinfo->relnamespace, errinfo->relname);
+           else
+               errcontext("while vacuuming relation \"%s.%s\"",
+                          errinfo->relnamespace, errinfo->relname);
            break;
 
        case VACUUM_ERRCB_PHASE_VACUUM_INDEX: