LCOV - code coverage report
Current view: top level - src/backend/utils/activity - pgstat_checkpointer.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 100.0 % 52 52
Test Date: 2026-03-10 01:14:48 Functions: 100.0 % 5 5
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* -------------------------------------------------------------------------
       2              :  *
       3              :  * pgstat_checkpointer.c
       4              :  *    Implementation of checkpoint statistics.
       5              :  *
       6              :  * This file contains the implementation of checkpoint statistics. It is kept
       7              :  * separate from pgstat.c to enforce the line between the statistics access /
       8              :  * storage implementation and the details about individual types of
       9              :  * statistics.
      10              :  *
      11              :  * Copyright (c) 2001-2026, PostgreSQL Global Development Group
      12              :  *
      13              :  * IDENTIFICATION
      14              :  *    src/backend/utils/activity/pgstat_checkpointer.c
      15              :  * -------------------------------------------------------------------------
      16              :  */
      17              : 
      18              : #include "postgres.h"
      19              : 
      20              : #include "utils/memutils.h"
      21              : #include "utils/pgstat_internal.h"
      22              : 
      23              : 
      24              : PgStat_CheckpointerStats PendingCheckpointerStats = {0};
      25              : 
      26              : 
      27              : /*
      28              :  * Report checkpointer and IO statistics
      29              :  */
      30              : void
      31        12601 : pgstat_report_checkpointer(void)
      32              : {
      33        12601 :     PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer;
      34              : 
      35              :     Assert(!pgStatLocal.shmem->is_shutdown);
      36              :     pgstat_assert_is_up();
      37              : 
      38              :     /*
      39              :      * This function can be called even if nothing at all has happened. In
      40              :      * this case, avoid unnecessarily modifying the stats entry.
      41              :      */
      42        12601 :     if (pg_memory_is_all_zeros(&PendingCheckpointerStats,
      43              :                                sizeof(struct PgStat_CheckpointerStats)))
      44         7179 :         return;
      45              : 
      46         5422 :     pgstat_begin_changecount_write(&stats_shmem->changecount);
      47              : 
      48              : #define CHECKPOINTER_ACC(fld) stats_shmem->stats.fld += PendingCheckpointerStats.fld
      49         5422 :     CHECKPOINTER_ACC(num_timed);
      50         5422 :     CHECKPOINTER_ACC(num_requested);
      51         5422 :     CHECKPOINTER_ACC(num_performed);
      52         5422 :     CHECKPOINTER_ACC(restartpoints_timed);
      53         5422 :     CHECKPOINTER_ACC(restartpoints_requested);
      54         5422 :     CHECKPOINTER_ACC(restartpoints_performed);
      55         5422 :     CHECKPOINTER_ACC(write_time);
      56         5422 :     CHECKPOINTER_ACC(sync_time);
      57         5422 :     CHECKPOINTER_ACC(buffers_written);
      58         5422 :     CHECKPOINTER_ACC(slru_written);
      59              : #undef CHECKPOINTER_ACC
      60              : 
      61         5422 :     pgstat_end_changecount_write(&stats_shmem->changecount);
      62              : 
      63              :     /*
      64              :      * Clear out the statistics buffer, so it can be re-used.
      65              :      */
      66        65064 :     MemSet(&PendingCheckpointerStats, 0, sizeof(PendingCheckpointerStats));
      67              : 
      68              :     /*
      69              :      * Report IO statistics
      70              :      */
      71         5422 :     pgstat_flush_io(false);
      72              : }
      73              : 
      74              : /*
      75              :  * pgstat_fetch_stat_checkpointer() -
      76              :  *
      77              :  * Support function for the SQL-callable pgstat* functions. Returns
      78              :  * a pointer to the checkpointer statistics struct.
      79              :  */
      80              : PgStat_CheckpointerStats *
      81           24 : pgstat_fetch_stat_checkpointer(void)
      82              : {
      83           24 :     pgstat_snapshot_fixed(PGSTAT_KIND_CHECKPOINTER);
      84              : 
      85           24 :     return &pgStatLocal.snapshot.checkpointer;
      86              : }
      87              : 
      88              : void
      89         1156 : pgstat_checkpointer_init_shmem_cb(void *stats)
      90              : {
      91         1156 :     PgStatShared_Checkpointer *stats_shmem = (PgStatShared_Checkpointer *) stats;
      92              : 
      93         1156 :     LWLockInitialize(&stats_shmem->lock, LWTRANCHE_PGSTATS_DATA);
      94         1156 : }
      95              : 
      96              : void
      97          242 : pgstat_checkpointer_reset_all_cb(TimestampTz ts)
      98              : {
      99          242 :     PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer;
     100              : 
     101              :     /* see explanation above PgStatShared_Checkpointer for the reset protocol */
     102          242 :     LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
     103          242 :     pgstat_copy_changecounted_stats(&stats_shmem->reset_offset,
     104          242 :                                     &stats_shmem->stats,
     105              :                                     sizeof(stats_shmem->stats),
     106              :                                     &stats_shmem->changecount);
     107          242 :     stats_shmem->stats.stat_reset_timestamp = ts;
     108          242 :     LWLockRelease(&stats_shmem->lock);
     109          242 : }
     110              : 
     111              : void
     112          744 : pgstat_checkpointer_snapshot_cb(void)
     113              : {
     114          744 :     PgStatShared_Checkpointer *stats_shmem = &pgStatLocal.shmem->checkpointer;
     115          744 :     PgStat_CheckpointerStats *reset_offset = &stats_shmem->reset_offset;
     116              :     PgStat_CheckpointerStats reset;
     117              : 
     118          744 :     pgstat_copy_changecounted_stats(&pgStatLocal.snapshot.checkpointer,
     119          744 :                                     &stats_shmem->stats,
     120              :                                     sizeof(stats_shmem->stats),
     121              :                                     &stats_shmem->changecount);
     122              : 
     123          744 :     LWLockAcquire(&stats_shmem->lock, LW_SHARED);
     124          744 :     memcpy(&reset, reset_offset, sizeof(stats_shmem->stats));
     125          744 :     LWLockRelease(&stats_shmem->lock);
     126              : 
     127              :     /* compensate by reset offsets */
     128              : #define CHECKPOINTER_COMP(fld) pgStatLocal.snapshot.checkpointer.fld -= reset.fld;
     129          744 :     CHECKPOINTER_COMP(num_timed);
     130          744 :     CHECKPOINTER_COMP(num_requested);
     131          744 :     CHECKPOINTER_COMP(num_performed);
     132          744 :     CHECKPOINTER_COMP(restartpoints_timed);
     133          744 :     CHECKPOINTER_COMP(restartpoints_requested);
     134          744 :     CHECKPOINTER_COMP(restartpoints_performed);
     135          744 :     CHECKPOINTER_COMP(write_time);
     136          744 :     CHECKPOINTER_COMP(sync_time);
     137          744 :     CHECKPOINTER_COMP(buffers_written);
     138          744 :     CHECKPOINTER_COMP(slru_written);
     139              : #undef CHECKPOINTER_COMP
     140          744 : }
        

Generated by: LCOV version 2.0-1