Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix mesurement of elapsed time during truncating heap in VACUUM.
authorFujii Masao <fujii@postgresql.org>
Wed, 19 Feb 2020 11:37:26 +0000 (20:37 +0900)
committerFujii Masao <fujii@postgresql.org>
Wed, 19 Feb 2020 11:39:02 +0000 (20:39 +0900)
VACUUM may truncate heap in several batches. The activity report
is logged for each batch, and contains the number of pages in the table
before and after the truncation, and also the elapsed time during
the truncation. Previously the elapsed time reported in each batch was
the total elapsed time since starting the truncation until finishing
each batch. For example, if the truncation was processed dividing into
three batches, the second batch reported the accumulated time elapsed
during both first and second batches. This is strange and confusing
because the number of pages in the table reported together is not
total. Instead, each batch should report the time elapsed during
only that batch.

The cause of this issue was that the resource usage snapshot was
initialized only at the beginning of the truncation and was never
reset later. This commit fixes the issue by changing VACUUM so that
the resource usage snapshot is reset at each batch.

Back-patch to all supported branches.

Reported-by: Tatsuhito Kasahara
Author: Tatsuhito Kasahara
Reviewed-by: Masahiko Sawada, Fujii Masao
Discussion: https://postgr.es/m/CAP0=ZVJsf=NvQuy+QXQZ7B=ZVLoDV_JzsVC1FRsF1G18i3zMGg@mail.gmail.com

src/backend/commands/vacuumlazy.c

index 5649a70800db3e4ab061edfb7bec4de142d0cb80..7c004185780d0183142ca23efba86d90b955522c 100644 (file)
@@ -1809,11 +1809,8 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats)
 {
    BlockNumber old_rel_pages = vacrelstats->rel_pages;
    BlockNumber new_rel_pages;
-   PGRUsage    ru0;
    int         lock_retry;
 
-   pg_rusage_init(&ru0);
-
    /* Report that we are now truncating */
    pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
                                 PROGRESS_VACUUM_PHASE_TRUNCATE);
@@ -1823,6 +1820,10 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats)
     */
    do
    {
+       PGRUsage    ru0;
+
+       pg_rusage_init(&ru0);
+
        /*
         * We need full exclusive lock on the relation in order to do
         * truncation. If we can't get it, give up rather than waiting --- we