Re: add checkpoint stats of snapshot and mapping files of pg_logical dir

From: Andres Freund <andres(at)anarazel(dot)de>
To: Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)com>
Cc: Nathan Bossart <nathandbossart(at)gmail(dot)com>, Michael Paquier <michael(at)paquier(dot)xyz>, Cary Huang <cary(dot)huang(at)highgo(dot)ca>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: add checkpoint stats of snapshot and mapping files of pg_logical dir
Date: 2022-03-18 23:09:44
Message-ID: 20220318230944.dzrr25jdvcvgp4fx@alap3.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 2022-03-18 13:32:52 +0530, Bharath Rupireddy wrote:
> @@ -6115,46 +6116,81 @@ LogCheckpointEnd(bool restartpoint)
> CheckpointStats.ckpt_sync_rels;
> average_msecs = (long) ((average_sync_time + 999) / 1000);
>
> + initStringInfo(&logmsg);
> +
> if (restartpoint)
> - ereport(LOG,
> - (errmsg("restartpoint complete: wrote %d buffers (%.1f%%); "
> - "%d WAL file(s) added, %d removed, %d recycled; "
> - "write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; "
> - "sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; "
> - "distance=%d kB, estimate=%d kB",
> - CheckpointStats.ckpt_bufs_written,
> - (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers,
> - CheckpointStats.ckpt_segs_added,
> - CheckpointStats.ckpt_segs_removed,
> - CheckpointStats.ckpt_segs_recycled,
> - write_msecs / 1000, (int) (write_msecs % 1000),
> - sync_msecs / 1000, (int) (sync_msecs % 1000),
> - total_msecs / 1000, (int) (total_msecs % 1000),
> - CheckpointStats.ckpt_sync_rels,
> - longest_msecs / 1000, (int) (longest_msecs % 1000),
> - average_msecs / 1000, (int) (average_msecs % 1000),
> - (int) (PrevCheckPointDistance / 1024.0),
> - (int) (CheckPointDistanceEstimate / 1024.0))));
> + appendStringInfo(&logmsg,
> + _("restartpoint complete: wrote %d buffers (%.1f%%); "
> + "%d WAL file(s) added, %d removed, %d recycled; "
> + "write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; "
> + "sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; "
> + "distance=%d kB, estimate=%d kB"),
> + CheckpointStats.ckpt_bufs_written,
> + (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers,
> + CheckpointStats.ckpt_segs_added,
> + CheckpointStats.ckpt_segs_removed,
> + CheckpointStats.ckpt_segs_recycled,
> + write_msecs / 1000, (int) (write_msecs % 1000),
> + sync_msecs / 1000, (int) (sync_msecs % 1000),
> + total_msecs / 1000, (int) (total_msecs % 1000),
> + CheckpointStats.ckpt_sync_rels,
> + longest_msecs / 1000, (int) (longest_msecs % 1000),
> + average_msecs / 1000, (int) (average_msecs % 1000),
> + (int) (PrevCheckPointDistance / 1024.0),
> + (int) (CheckPointDistanceEstimate / 1024.0));
> else
> - ereport(LOG,
> - (errmsg("checkpoint complete: wrote %d buffers (%.1f%%); "
> - "%d WAL file(s) added, %d removed, %d recycled; "
> - "write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; "
> - "sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; "
> - "distance=%d kB, estimate=%d kB",
> - CheckpointStats.ckpt_bufs_written,
> - (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers,
> - CheckpointStats.ckpt_segs_added,
> - CheckpointStats.ckpt_segs_removed,
> - CheckpointStats.ckpt_segs_recycled,
> - write_msecs / 1000, (int) (write_msecs % 1000),
> - sync_msecs / 1000, (int) (sync_msecs % 1000),
> - total_msecs / 1000, (int) (total_msecs % 1000),
> - CheckpointStats.ckpt_sync_rels,
> - longest_msecs / 1000, (int) (longest_msecs % 1000),
> - average_msecs / 1000, (int) (average_msecs % 1000),
> - (int) (PrevCheckPointDistance / 1024.0),
> - (int) (CheckPointDistanceEstimate / 1024.0))));
> + appendStringInfo(&logmsg,
> + _("checkpoint complete: wrote %d buffers (%.1f%%); "
> + "%d WAL file(s) added, %d removed, %d recycled; "
> + "write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; "
> + "sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; "
> + "distance=%d kB, estimate=%d kB"),
> + CheckpointStats.ckpt_bufs_written,
> + (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers,
> + CheckpointStats.ckpt_segs_added,
> + CheckpointStats.ckpt_segs_removed,
> + CheckpointStats.ckpt_segs_recycled,
> + write_msecs / 1000, (int) (write_msecs % 1000),
> + sync_msecs / 1000, (int) (sync_msecs % 1000),
> + total_msecs / 1000, (int) (total_msecs % 1000),
> + CheckpointStats.ckpt_sync_rels,
> + longest_msecs / 1000, (int) (longest_msecs % 1000),
> + average_msecs / 1000, (int) (average_msecs % 1000),
> + (int) (PrevCheckPointDistance / 1024.0),
> + (int) (CheckPointDistanceEstimate / 1024.0));

before we further change this (as done in this patch) we should deduplicate
these huge statements in a separate patch / commit.

> + if (CheckpointStats.repl_snap_files_rmvd_cnt > 0)
> + {
> + long t_msecs;
> +
> + t_msecs = TimestampDifferenceMilliseconds(CheckpointStats.repl_snap_start_t,
> + CheckpointStats.repl_snap_end_t);
> +
> + appendStringInfo(&logmsg,
> + _("; logical decoding snapshot file(s) removed=" UINT64_FORMAT ", time=%ld.%03d s, cutoff LSN=%X/%X"),
> + CheckpointStats.repl_snap_files_rmvd_cnt,
> + t_msecs / 1000, (int) (t_msecs % 1000),
> + LSN_FORMAT_ARGS(CheckpointStats.repl_snap_cutoff_lsn));
> + }

As discussed in a bunch of other threads, we typically prefer to cast to long
long and use %ll instead of using UINT64_FORMAT these days.

> + if (CheckpointStats.repl_map_files_rmvd_cnt ||
> + CheckpointStats.repl_map_files_syncd_cnt > 0)
> + {
> + long t_msecs;
> +
> + t_msecs = TimestampDifferenceMilliseconds(CheckpointStats.repl_snap_start_t,
> + CheckpointStats.repl_snap_end_t);
> +
> + appendStringInfo(&logmsg,
> + _("; logical decoding rewrite mapping file(s) removed=" UINT64_FORMAT ", synced=" UINT64_FORMAT ", time=%ld.%03d s, cutoff LSN=%X/%X"),
> + CheckpointStats.repl_map_files_rmvd_cnt,
> + CheckpointStats.repl_map_files_syncd_cnt,
> + t_msecs / 1000, (int) (t_msecs % 1000),
> + LSN_FORMAT_ARGS(CheckpointStats.repl_map_cutoff_lsn));
> + }
> +
> + ereport(LOG, errmsg_internal("%s", logmsg.data));
> + pfree(logmsg.data);
> }

This practically doubles the size of the log message - doesn't that seem a bit
disproportionate? Can we make this more dense? "logical decoding rewrite
mapping file(s) removed=" and "logical decoding snapshot file(s) removed=" is
quite long.

Greetings,

Andres Freund

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andres Freund 2022-03-18 23:14:30 Re: Fix unsigned output for signed values in SLRU error reporting
Previous Message Andres Freund 2022-03-18 22:45:03 Re: Adding CI to our tree