diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index aa196754cb2..9eeda36001f 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -7945,8 +7945,8 @@ FROM pg_stat_get_backend_idset() AS backendid; The total number of databases which will be processed. Only the - launcher process has this value set, the worker processes have this - set to NULL. + launcher process has this value set when enabling data checksums; + otherwise this is set to NULL. @@ -7958,8 +7958,8 @@ FROM pg_stat_get_backend_idset() AS backendid; The number of databases which have been processed. Only the launcher - process has this value set, the worker processes have this set to - NULL. + process has this value set when enabling data checksums; otherwise + this is set to NULL. diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 8f129baec90..4427b2232b0 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1482,7 +1482,7 @@ CREATE VIEW pg_stat_progress_data_checksums AS WHEN 4 THEN 'done' END AS phase, CASE S.param2 WHEN -1 THEN NULL ELSE S.param2 END AS databases_total, - S.param3 AS databases_done, + CASE S.param3 WHEN -1 THEN NULL ELSE S.param3 END AS databases_done, CASE S.param4 WHEN -1 THEN NULL ELSE S.param4 END AS relations_total, CASE S.param5 WHEN -1 THEN NULL ELSE S.param5 END AS relations_done, CASE S.param6 WHEN -1 THEN NULL ELSE S.param6 END AS blocks_total, diff --git a/src/backend/postmaster/datachecksum_state.c b/src/backend/postmaster/datachecksum_state.c index 68557c16cb9..bec110105df 100644 --- a/src/backend/postmaster/datachecksum_state.c +++ b/src/backend/postmaster/datachecksum_state.c @@ -391,6 +391,7 @@ static void FreeDatabaseList(List *dblist); static DataChecksumsWorkerResult ProcessDatabase(DataChecksumsWorkerDatabase *db); static bool ProcessAllDatabases(void); static bool ProcessSingleRelationFork(Relation reln, ForkNumber forkNum, BufferAccessStrategy strategy); +static void ResetDataChecksumsProgressCounters(void); static void launcher_cancel_handler(SIGNAL_ARGS); static void WaitForAllTransactionsToFinish(void); @@ -698,7 +699,19 @@ ProcessSingleRelationFork(Relation reln, ForkNumber forkNum, BufferAccessStrateg snprintf(activity, sizeof(activity) - 1, "processing: %s.%s (%s, %u blocks)", (relns ? relns : ""), RelationGetRelationName(reln), forkNames[forkNum], numblocks); pgstat_report_activity(STATE_RUNNING, activity); - pgstat_progress_update_param(PROGRESS_DATACHECKSUMS_BLOCKS_TOTAL, numblocks); + { + const int index[] = { + PROGRESS_DATACHECKSUMS_BLOCKS_TOTAL, + PROGRESS_DATACHECKSUMS_BLOCKS_DONE + }; + + int64 vals[2]; + + vals[0] = numblocks; + vals[1] = 0; + + pgstat_progress_update_multi_param(2, index, vals); + } if (relns) pfree(relns); @@ -764,6 +777,29 @@ ProcessSingleRelationFork(Relation reln, ForkNumber forkNum, BufferAccessStrateg return true; } +/* + * Initialize all data checksum progress counters to be displayed as NULL. + */ +static void +ResetDataChecksumsProgressCounters(void) +{ + const int index[] = { + PROGRESS_DATACHECKSUMS_DBS_TOTAL, + PROGRESS_DATACHECKSUMS_DBS_DONE, + PROGRESS_DATACHECKSUMS_RELS_TOTAL, + PROGRESS_DATACHECKSUMS_RELS_DONE, + PROGRESS_DATACHECKSUMS_BLOCKS_TOTAL, + PROGRESS_DATACHECKSUMS_BLOCKS_DONE, + }; + + int64 vals[lengthof(index)]; + + for (int i = 0; i < lengthof(index); i++) + vals[i] = -1; + + pgstat_progress_update_multi_param(lengthof(index), index, vals); +} + /* * ProcessSingleRelationByOid * Process a single relation based on oid. @@ -1142,6 +1178,7 @@ again: pgstat_progress_start_command(PROGRESS_COMMAND_DATACHECKSUMS, InvalidOid); + ResetDataChecksumsProgressCounters(); if (operation == ENABLE_DATACHECKSUMS) { @@ -1269,23 +1306,14 @@ ProcessAllDatabases(void) const int index[] = { PROGRESS_DATACHECKSUMS_DBS_TOTAL, PROGRESS_DATACHECKSUMS_DBS_DONE, - PROGRESS_DATACHECKSUMS_RELS_TOTAL, - PROGRESS_DATACHECKSUMS_RELS_DONE, - PROGRESS_DATACHECKSUMS_BLOCKS_TOTAL, - PROGRESS_DATACHECKSUMS_BLOCKS_DONE, }; - int64 vals[6]; + int64 vals[2]; vals[0] = list_length(DatabaseList); vals[1] = 0; - /* translated to NULL */ - vals[2] = -1; - vals[3] = -1; - vals[4] = -1; - vals[5] = -1; - pgstat_progress_update_multi_param(6, index, vals); + pgstat_progress_update_multi_param(2, index, vals); } foreach_ptr(DataChecksumsWorkerDatabase, db, DatabaseList) @@ -1581,6 +1609,7 @@ DataChecksumsWorkerMain(Datum arg) /* worker will have a separate entry in pg_stat_progress_data_checksums */ pgstat_progress_start_command(PROGRESS_COMMAND_DATACHECKSUMS, InvalidOid); + ResetDataChecksumsProgressCounters(); /* * Get a list of all temp tables present as we start in this database. We diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 475f5683e1c..dd4502923b1 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2115,7 +2115,10 @@ pg_stat_progress_data_checksums| SELECT s.pid, WHEN '-1'::integer THEN NULL::bigint ELSE s.param2 END AS databases_total, - s.param3 AS databases_done, + CASE s.param3 + WHEN '-1'::integer THEN NULL::bigint + ELSE s.param3 + END AS databases_done, CASE s.param4 WHEN '-1'::integer THEN NULL::bigint ELSE s.param4