mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Report index vacuum progress.
This commit adds two columns: indexes_total and indexes_processed, to pg_stat_progress_vacuum system view to show the index vacuum progress. These numbers are reported in the "vacuuming indexes" and "cleaning up indexes" phases. This uses the new parallel message type for progress reporting added by be06506e7. Bump catversion because this changes the definition of pg_stat_progress_vacuum. Author: Sami Imseih Reviewed by: Masahiko Sawada, Michael Paquier, Nathan Bossart, Andres Freund Discussion: https://www.postgresql.org/message-id/flat/5478DFCD-2333-401A-B2F0-0D186AB09228@amazon.com
This commit is contained in:
@ -2319,6 +2319,17 @@ lazy_vacuum_all_indexes(LVRelState *vacrel)
|
||||
{
|
||||
bool allindexes = true;
|
||||
double old_live_tuples = vacrel->rel->rd_rel->reltuples;
|
||||
const int progress_start_index[] = {
|
||||
PROGRESS_VACUUM_PHASE,
|
||||
PROGRESS_VACUUM_INDEXES_TOTAL
|
||||
};
|
||||
const int progress_end_index[] = {
|
||||
PROGRESS_VACUUM_INDEXES_TOTAL,
|
||||
PROGRESS_VACUUM_INDEXES_PROCESSED,
|
||||
PROGRESS_VACUUM_NUM_INDEX_VACUUMS
|
||||
};
|
||||
int64 progress_start_val[2];
|
||||
int64 progress_end_val[3];
|
||||
|
||||
Assert(vacrel->nindexes > 0);
|
||||
Assert(vacrel->do_index_vacuuming);
|
||||
@ -2331,9 +2342,13 @@ lazy_vacuum_all_indexes(LVRelState *vacrel)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Report that we are now vacuuming indexes */
|
||||
pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
|
||||
PROGRESS_VACUUM_PHASE_VACUUM_INDEX);
|
||||
/*
|
||||
* Report that we are now vacuuming indexes and the number of indexes to
|
||||
* vacuum.
|
||||
*/
|
||||
progress_start_val[0] = PROGRESS_VACUUM_PHASE_VACUUM_INDEX;
|
||||
progress_start_val[1] = vacrel->nindexes;
|
||||
pgstat_progress_update_multi_param(2, progress_start_index, progress_start_val);
|
||||
|
||||
if (!ParallelVacuumIsActive(vacrel))
|
||||
{
|
||||
@ -2346,6 +2361,10 @@ lazy_vacuum_all_indexes(LVRelState *vacrel)
|
||||
old_live_tuples,
|
||||
vacrel);
|
||||
|
||||
/* Report the number of indexes vacuumed */
|
||||
pgstat_progress_update_param(PROGRESS_VACUUM_INDEXES_PROCESSED,
|
||||
idx + 1);
|
||||
|
||||
if (lazy_check_wraparound_failsafe(vacrel))
|
||||
{
|
||||
/* Wraparound emergency -- end current index scan */
|
||||
@ -2380,14 +2399,17 @@ lazy_vacuum_all_indexes(LVRelState *vacrel)
|
||||
Assert(allindexes || VacuumFailsafeActive);
|
||||
|
||||
/*
|
||||
* Increase and report the number of index scans.
|
||||
* Increase and report the number of index scans. Also, we reset
|
||||
* PROGRESS_VACUUM_INDEXES_TOTAL and PROGRESS_VACUUM_INDEXES_PROCESSED.
|
||||
*
|
||||
* We deliberately include the case where we started a round of bulk
|
||||
* deletes that we weren't able to finish due to the failsafe triggering.
|
||||
*/
|
||||
vacrel->num_index_scans++;
|
||||
pgstat_progress_update_param(PROGRESS_VACUUM_NUM_INDEX_VACUUMS,
|
||||
vacrel->num_index_scans);
|
||||
progress_end_val[0] = 0;
|
||||
progress_end_val[1] = 0;
|
||||
progress_end_val[2] = vacrel->num_index_scans;
|
||||
pgstat_progress_update_multi_param(3, progress_end_index, progress_end_val);
|
||||
|
||||
return allindexes;
|
||||
}
|
||||
@ -2624,6 +2646,12 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel)
|
||||
|
||||
if (unlikely(vacuum_xid_failsafe_check(&vacrel->cutoffs)))
|
||||
{
|
||||
const int progress_index[] = {
|
||||
PROGRESS_VACUUM_INDEXES_TOTAL,
|
||||
PROGRESS_VACUUM_INDEXES_PROCESSED
|
||||
};
|
||||
int64 progress_val[2] = {0, 0};
|
||||
|
||||
VacuumFailsafeActive = true;
|
||||
|
||||
/*
|
||||
@ -2638,6 +2666,9 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel)
|
||||
vacrel->do_index_cleanup = false;
|
||||
vacrel->do_rel_truncate = false;
|
||||
|
||||
/* Reset the progress counters */
|
||||
pgstat_progress_update_multi_param(2, progress_index, progress_val);
|
||||
|
||||
ereport(WARNING,
|
||||
(errmsg("bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans",
|
||||
vacrel->dbname, vacrel->relnamespace, vacrel->relname,
|
||||
@ -2664,13 +2695,27 @@ lazy_cleanup_all_indexes(LVRelState *vacrel)
|
||||
{
|
||||
double reltuples = vacrel->new_rel_tuples;
|
||||
bool estimated_count = vacrel->scanned_pages < vacrel->rel_pages;
|
||||
const int progress_start_index[] = {
|
||||
PROGRESS_VACUUM_PHASE,
|
||||
PROGRESS_VACUUM_INDEXES_TOTAL
|
||||
};
|
||||
const int progress_end_index[] = {
|
||||
PROGRESS_VACUUM_INDEXES_TOTAL,
|
||||
PROGRESS_VACUUM_INDEXES_PROCESSED
|
||||
};
|
||||
int64 progress_start_val[2];
|
||||
int64 progress_end_val[2] = {0, 0};
|
||||
|
||||
Assert(vacrel->do_index_cleanup);
|
||||
Assert(vacrel->nindexes > 0);
|
||||
|
||||
/* Report that we are now cleaning up indexes */
|
||||
pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
|
||||
PROGRESS_VACUUM_PHASE_INDEX_CLEANUP);
|
||||
/*
|
||||
* Report that we are now cleaning up indexes and the number of indexes to
|
||||
* cleanup.
|
||||
*/
|
||||
progress_start_val[0] = PROGRESS_VACUUM_PHASE_INDEX_CLEANUP;
|
||||
progress_start_val[1] = vacrel->nindexes;
|
||||
pgstat_progress_update_multi_param(2, progress_start_index, progress_start_val);
|
||||
|
||||
if (!ParallelVacuumIsActive(vacrel))
|
||||
{
|
||||
@ -2682,6 +2727,10 @@ lazy_cleanup_all_indexes(LVRelState *vacrel)
|
||||
vacrel->indstats[idx] =
|
||||
lazy_cleanup_one_index(indrel, istat, reltuples,
|
||||
estimated_count, vacrel);
|
||||
|
||||
/* Report the number of indexes cleaned up */
|
||||
pgstat_progress_update_param(PROGRESS_VACUUM_INDEXES_PROCESSED,
|
||||
idx + 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -2691,6 +2740,9 @@ lazy_cleanup_all_indexes(LVRelState *vacrel)
|
||||
vacrel->num_index_scans,
|
||||
estimated_count);
|
||||
}
|
||||
|
||||
/* Reset the progress counters */
|
||||
pgstat_progress_update_multi_param(2, progress_end_index, progress_end_val);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user