mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Add num_done counter to the pg_stat_checkpointer view.
Checkpoints can be skipped when the server is idle. The existing num_timed and num_requested counters in pg_stat_checkpointer track both completed and skipped checkpoints, but there was no way to count only the completed ones. This commit introduces the num_done counter, which tracks only completed checkpoints, making it easier to see how many were actually performed. Bump catalog version. Author: Anton A. Melnikov Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/9ea77f40-818d-4841-9dee-158ac8f6e690@oss.nttdata.com
This commit is contained in:
@@ -6878,8 +6878,11 @@ update_checkpoint_display(int flags, bool restartpoint, bool reset)
|
||||
* In this case, we only insert an XLOG_CHECKPOINT_SHUTDOWN record, and it's
|
||||
* both the record marking the completion of the checkpoint and the location
|
||||
* from which WAL replay would begin if needed.
|
||||
*
|
||||
* Returns true if a new checkpoint was performed, or false if it was skipped
|
||||
* because the system was idle.
|
||||
*/
|
||||
void
|
||||
bool
|
||||
CreateCheckPoint(int flags)
|
||||
{
|
||||
bool shutdown;
|
||||
@@ -6971,7 +6974,7 @@ CreateCheckPoint(int flags)
|
||||
END_CRIT_SECTION();
|
||||
ereport(DEBUG1,
|
||||
(errmsg_internal("checkpoint skipped because system is idle")));
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7353,6 +7356,8 @@ CreateCheckPoint(int flags)
|
||||
CheckpointStats.ckpt_segs_added,
|
||||
CheckpointStats.ckpt_segs_removed,
|
||||
CheckpointStats.ckpt_segs_recycled);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1138,6 +1138,7 @@ CREATE VIEW pg_stat_checkpointer AS
|
||||
SELECT
|
||||
pg_stat_get_checkpointer_num_timed() AS num_timed,
|
||||
pg_stat_get_checkpointer_num_requested() AS num_requested,
|
||||
pg_stat_get_checkpointer_num_performed() AS num_done,
|
||||
pg_stat_get_checkpointer_restartpoints_timed() AS restartpoints_timed,
|
||||
pg_stat_get_checkpointer_restartpoints_requested() AS restartpoints_req,
|
||||
pg_stat_get_checkpointer_restartpoints_performed() AS restartpoints_done,
|
||||
|
||||
@@ -460,10 +460,7 @@ CheckpointerMain(char *startup_data, size_t startup_data_len)
|
||||
* Do the checkpoint.
|
||||
*/
|
||||
if (!do_restartpoint)
|
||||
{
|
||||
CreateCheckPoint(flags);
|
||||
ckpt_performed = true;
|
||||
}
|
||||
ckpt_performed = CreateCheckPoint(flags);
|
||||
else
|
||||
ckpt_performed = CreateRestartPoint(flags);
|
||||
|
||||
@@ -484,7 +481,7 @@ CheckpointerMain(char *startup_data, size_t startup_data_len)
|
||||
|
||||
ConditionVariableBroadcast(&CheckpointerShmem->done_cv);
|
||||
|
||||
if (ckpt_performed)
|
||||
if (!do_restartpoint)
|
||||
{
|
||||
/*
|
||||
* Note we record the checkpoint start time not end time as
|
||||
@@ -493,18 +490,32 @@ CheckpointerMain(char *startup_data, size_t startup_data_len)
|
||||
*/
|
||||
last_checkpoint_time = now;
|
||||
|
||||
if (do_restartpoint)
|
||||
PendingCheckpointerStats.restartpoints_performed++;
|
||||
if (ckpt_performed)
|
||||
PendingCheckpointerStats.num_performed++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* We were not able to perform the restartpoint (checkpoints
|
||||
* throw an ERROR in case of error). Most likely because we
|
||||
* have not received any new checkpoint WAL records since the
|
||||
* last restartpoint. Try again in 15 s.
|
||||
*/
|
||||
last_checkpoint_time = now - CheckPointTimeout + 15;
|
||||
if (ckpt_performed)
|
||||
{
|
||||
/*
|
||||
* The same as for checkpoint. Please see the
|
||||
* corresponding comment.
|
||||
*/
|
||||
last_checkpoint_time = now;
|
||||
|
||||
PendingCheckpointerStats.restartpoints_performed++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* We were not able to perform the restartpoint
|
||||
* (checkpoints throw an ERROR in case of error). Most
|
||||
* likely because we have not received any new checkpoint
|
||||
* WAL records since the last restartpoint. Try again in
|
||||
* 15 s.
|
||||
*/
|
||||
last_checkpoint_time = now - CheckPointTimeout + 15;
|
||||
}
|
||||
}
|
||||
|
||||
ckpt_active = false;
|
||||
|
||||
@@ -49,6 +49,7 @@ pgstat_report_checkpointer(void)
|
||||
#define CHECKPOINTER_ACC(fld) stats_shmem->stats.fld += PendingCheckpointerStats.fld
|
||||
CHECKPOINTER_ACC(num_timed);
|
||||
CHECKPOINTER_ACC(num_requested);
|
||||
CHECKPOINTER_ACC(num_performed);
|
||||
CHECKPOINTER_ACC(restartpoints_timed);
|
||||
CHECKPOINTER_ACC(restartpoints_requested);
|
||||
CHECKPOINTER_ACC(restartpoints_performed);
|
||||
@@ -127,6 +128,7 @@ pgstat_checkpointer_snapshot_cb(void)
|
||||
#define CHECKPOINTER_COMP(fld) pgStatLocal.snapshot.checkpointer.fld -= reset.fld;
|
||||
CHECKPOINTER_COMP(num_timed);
|
||||
CHECKPOINTER_COMP(num_requested);
|
||||
CHECKPOINTER_COMP(num_performed);
|
||||
CHECKPOINTER_COMP(restartpoints_timed);
|
||||
CHECKPOINTER_COMP(restartpoints_requested);
|
||||
CHECKPOINTER_COMP(restartpoints_performed);
|
||||
|
||||
@@ -1191,6 +1191,12 @@ pg_stat_get_checkpointer_num_requested(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->num_requested);
|
||||
}
|
||||
|
||||
Datum
|
||||
pg_stat_get_checkpointer_num_performed(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->num_performed);
|
||||
}
|
||||
|
||||
Datum
|
||||
pg_stat_get_checkpointer_restartpoints_timed(PG_FUNCTION_ARGS)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user