=== Applying patches on top of PostgreSQL commit ID 5941946d0934b9eccb0d5bfebd40b155249a0130 === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Wed Mar 19 20:20:25 UTC 2025 On branch cf/5007 nothing to commit, working tree clean === using 'git am' to apply patch ./v6-0001-Clear-padding-in-PgStat_HashKey-keys.patch === Applying: Clear padding in PgStat_HashKey keys Using index info to reconstruct a base tree... M src/backend/utils/activity/pgstat.c M src/backend/utils/activity/pgstat_shmem.c Falling back to patching base and 3-way merge... Auto-merging src/backend/utils/activity/pgstat_shmem.c Auto-merging src/backend/utils/activity/pgstat.c No changes -- Patch already applied. === using 'git am' to apply patch ./v6-0002-Provide-relfilenode-statistics.patch === Applying: Provide relfilenode statistics Using index info to reconstruct a base tree... M src/backend/access/rmgrdesc/xactdesc.c M src/backend/catalog/storage.c M src/backend/catalog/system_functions.sql M src/backend/catalog/system_views.sql M src/backend/postmaster/checkpointer.c M src/backend/storage/buffer/bufmgr.c M src/backend/storage/smgr/md.c M src/backend/utils/activity/pgstat.c M src/backend/utils/activity/pgstat_database.c M src/backend/utils/activity/pgstat_function.c M src/backend/utils/activity/pgstat_relation.c M src/backend/utils/activity/pgstat_replslot.c M src/backend/utils/activity/pgstat_shmem.c M src/backend/utils/activity/pgstat_subscription.c M src/backend/utils/activity/pgstat_xact.c M src/backend/utils/adt/pgstatfuncs.c M src/include/access/tableam.h M src/include/access/xact.h M src/include/catalog/pg_proc.dat M src/include/pgstat.h M src/include/utils/pgstat_internal.h M src/test/recovery/t/029_stats_restart.pl M src/test/recovery/t/030_stats_cleanup_replica.pl M src/test/regress/expected/rules.out M src/test/regress/expected/stats.out M src/test/regress/sql/stats.sql M src/test/subscription/t/026_stats.pl M src/tools/pgindent/typedefs.list Falling back to patching base and 3-way merge... Auto-merging src/tools/pgindent/typedefs.list Auto-merging src/test/subscription/t/026_stats.pl Auto-merging src/test/regress/sql/stats.sql Auto-merging src/test/regress/expected/stats.out Auto-merging src/test/regress/expected/rules.out Auto-merging src/test/recovery/t/030_stats_cleanup_replica.pl Auto-merging src/test/recovery/t/029_stats_restart.pl CONFLICT (content): Merge conflict in src/test/recovery/t/029_stats_restart.pl Auto-merging src/include/utils/pgstat_internal.h Auto-merging src/include/pgstat.h CONFLICT (content): Merge conflict in src/include/pgstat.h Auto-merging src/include/catalog/pg_proc.dat Auto-merging src/include/access/xact.h Auto-merging src/include/access/tableam.h Auto-merging src/backend/utils/adt/pgstatfuncs.c CONFLICT (content): Merge conflict in src/backend/utils/adt/pgstatfuncs.c Auto-merging src/backend/utils/activity/pgstat_xact.c Auto-merging src/backend/utils/activity/pgstat_subscription.c Auto-merging src/backend/utils/activity/pgstat_shmem.c Auto-merging src/backend/utils/activity/pgstat_replslot.c Auto-merging src/backend/utils/activity/pgstat_relation.c Auto-merging src/backend/utils/activity/pgstat_function.c Auto-merging src/backend/utils/activity/pgstat_database.c Auto-merging src/backend/utils/activity/pgstat.c CONFLICT (content): Merge conflict in src/backend/utils/activity/pgstat.c Auto-merging src/backend/storage/smgr/md.c Auto-merging src/backend/storage/buffer/bufmgr.c Auto-merging src/backend/postmaster/checkpointer.c Auto-merging src/backend/catalog/system_views.sql Auto-merging src/backend/catalog/system_functions.sql Auto-merging src/backend/catalog/storage.c Auto-merging src/backend/access/rmgrdesc/xactdesc.c error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 Provide relfilenode statistics When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". Unstaged changes after reset: M src/backend/access/rmgrdesc/xactdesc.c M src/backend/catalog/storage.c M src/backend/catalog/system_functions.sql M src/backend/catalog/system_views.sql M src/backend/postmaster/checkpointer.c M src/backend/storage/buffer/bufmgr.c M src/backend/storage/smgr/md.c M src/backend/utils/activity/pgstat.c M src/backend/utils/activity/pgstat_database.c M src/backend/utils/activity/pgstat_function.c M src/backend/utils/activity/pgstat_relation.c M src/backend/utils/activity/pgstat_replslot.c M src/backend/utils/activity/pgstat_shmem.c M src/backend/utils/activity/pgstat_subscription.c M src/backend/utils/activity/pgstat_xact.c M src/backend/utils/adt/pgstatfuncs.c M src/include/access/tableam.h M src/include/access/xact.h M src/include/catalog/pg_proc.dat M src/include/pgstat.h M src/include/utils/pgstat_internal.h M src/test/recovery/t/029_stats_restart.pl M src/test/recovery/t/030_stats_cleanup_replica.pl M src/test/regress/expected/rules.out M src/test/regress/expected/stats.out M src/test/regress/sql/stats.sql M src/test/subscription/t/026_stats.pl M src/tools/pgindent/typedefs.list === using patch(1) to apply patch ./v6-0002-Provide-relfilenode-statistics.patch === patch: unrecognized option `--no-backup-if-mismatch' usage: patch [-bCcEeflNnRstuv] [-B backup-prefix] [-D symbol] [-d directory] [-F max-fuzz] [-i patchfile] [-o out-file] [-p strip-count] [-r rej-name] [-V t | nil | never | none] [-x number] [-z backup-ext] [--posix] [origfile [patchfile]] patch >>>>>> theirs partial_flush |= pgstat_flush_pending_entries(nowait); - /* flush of fixed-numbered stats */ + /* flush of other stats kinds */ for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++) { const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); @@@ -1352,7 -1345,8 +1371,12 @@@ pgstat_delete_pending_entry(PgStat_Entr } /* ++<<<<<<< ours + * Flush out pending variable-numbered stats. ++======= + * Flush out pending stats for database objects (databases, relations, relfilenodes, + * functions). ++>>>>>>> theirs */ static bool pgstat_flush_pending_entries(bool nowait) diff --cc src/backend/utils/adt/pgstatfuncs.c index 662ce46cbc2,d7cc55c9936..00000000000 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@@ -106,33 -106,29 +106,59 @@@ PG_STAT_GET_RELENTRY_INT64(tuples_updat /* pg_stat_get_vacuum_count */ PG_STAT_GET_RELENTRY_INT64(vacuum_count) ++<<<<<<< ours +#define PG_STAT_GET_RELENTRY_FLOAT8(stat) \ +Datum \ +CppConcat(pg_stat_get_,stat)(PG_FUNCTION_ARGS) \ +{ \ + Oid relid = PG_GETARG_OID(0); \ + double result; \ + PgStat_StatTabEntry *tabentry; \ + \ + if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL) \ + result = 0; \ + else \ + result = (double) (tabentry->stat); \ + \ + PG_RETURN_FLOAT8(result); \ +} + +/* pg_stat_get_total_vacuum_time */ +PG_STAT_GET_RELENTRY_FLOAT8(total_vacuum_time) + +/* pg_stat_get_total_autovacuum_time */ +PG_STAT_GET_RELENTRY_FLOAT8(total_autovacuum_time) + +/* pg_stat_get_total_analyze_time */ +PG_STAT_GET_RELENTRY_FLOAT8(total_analyze_time) + +/* pg_stat_get_total_autoanalyze_time */ +PG_STAT_GET_RELENTRY_FLOAT8(total_autoanalyze_time) ++======= + #define PG_STAT_GET_RELFILEENTRY_INT64(stat) \ + Datum \ + CppConcat(pg_stat_get_relfilenode_,stat)(PG_FUNCTION_ARGS) \ + { \ + Oid dboid = PG_GETARG_OID(0); \ + Oid spcOid = PG_GETARG_OID(1); \ + RelFileNumber relfile = PG_GETARG_OID(2); \ + int64 result; \ + PgStat_StatRelFileNodeEntry *relfileentry; \ + \ + if ((relfileentry = pgstat_fetch_stat_relfilenodeentry(dboid, spcOid, relfile)) == NULL) \ + result = 0; \ + else \ + result = (int64) (relfileentry->stat); \ + \ + PG_RETURN_INT64(result); \ + } + + /* pg_stat_get_relfilenode_blocks_written */ + PG_STAT_GET_RELFILEENTRY_INT64(blocks_written) + + /* pg_stat_get_blocks_written */ + PG_STAT_GET_RELENTRY_INT64(blocks_written) ++>>>>>>> theirs #define PG_STAT_GET_RELENTRY_TIMESTAMPTZ(stat) \ Datum \ diff --cc src/include/pgstat.h index 5bfe19e66be,ecfbb7cace0..00000000000 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@@ -15,11 -16,11 +15,17 @@@ #include "portability/instr_time.h" #include "postmaster/pgarch.h" /* for MAX_XFN_CHARS */ #include "replication/conflict.h" ++<<<<<<< ours +#include "utils/backend_progress.h" /* for backward compatibility */ /* IWYU pragma: export */ +#include "utils/backend_status.h" /* for backward compatibility */ /* IWYU pragma: export */ +#include "utils/pgstat_kind.h" ++======= + #include "storage/relfilelocator.h" + #include "utils/backend_progress.h" /* for backward compatibility */ + #include "utils/backend_status.h" /* for backward compatibility */ ++>>>>>>> theirs #include "utils/relcache.h" -#include "utils/wait_event.h" /* for backward compatibility */ +#include "utils/wait_event.h" /* for backward compatibility */ /* IWYU pragma: export */ /* ---------- @@@ -33,6 -34,62 +39,65 @@@ /* Default directory to store temporary statistics data in */ #define PG_STAT_TMP_DIR "pg_stat_tmp" ++<<<<<<< ours ++======= + /* The types of statistics entries */ + #define PgStat_Kind uint32 + + /* Range of IDs allowed, for built-in and custom kinds */ + #define PGSTAT_KIND_MIN 1 /* Minimum ID allowed */ + #define PGSTAT_KIND_MAX 256 /* Maximum ID allowed */ + + /* use 0 for INVALID, to catch zero-initialized data */ + #define PGSTAT_KIND_INVALID 0 + + /* stats for variable-numbered objects */ + #define PGSTAT_KIND_DATABASE 1 /* database-wide statistics */ + #define PGSTAT_KIND_RELATION 2 /* per-table statistics */ + #define PGSTAT_KIND_RELFILENODE 3 /* per-relfilenode statistics */ + #define PGSTAT_KIND_FUNCTION 4 /* per-function statistics */ + #define PGSTAT_KIND_REPLSLOT 5 /* per-slot statistics */ + #define PGSTAT_KIND_SUBSCRIPTION 6 /* per-subscription statistics */ + + /* stats for fixed-numbered objects */ + #define PGSTAT_KIND_ARCHIVER 7 + #define PGSTAT_KIND_BGWRITER 8 + #define PGSTAT_KIND_CHECKPOINTER 9 + #define PGSTAT_KIND_IO 10 + #define PGSTAT_KIND_SLRU 11 + #define PGSTAT_KIND_WAL 12 + + #define PGSTAT_KIND_BUILTIN_MIN PGSTAT_KIND_DATABASE + #define PGSTAT_KIND_BUILTIN_MAX PGSTAT_KIND_WAL + #define PGSTAT_KIND_BUILTIN_SIZE (PGSTAT_KIND_BUILTIN_MAX + 1) + + /* Custom stats kinds */ + + /* Range of IDs allowed for custom stats kinds */ + #define PGSTAT_KIND_CUSTOM_MIN 128 + #define PGSTAT_KIND_CUSTOM_MAX PGSTAT_KIND_MAX + #define PGSTAT_KIND_CUSTOM_SIZE (PGSTAT_KIND_CUSTOM_MAX - PGSTAT_KIND_CUSTOM_MIN + 1) + + /* + * PgStat_Kind to use for extensions that require an ID, but are still in + * development and have not reserved their own unique kind ID yet. See: + * https://wiki.postgresql.org/wiki/CustomCumulativeStats + */ + #define PGSTAT_KIND_EXPERIMENTAL 128 + + static inline bool + pgstat_is_kind_builtin(PgStat_Kind kind) + { + return kind >= PGSTAT_KIND_BUILTIN_MIN && kind <= PGSTAT_KIND_BUILTIN_MAX; + } + + static inline bool + pgstat_is_kind_custom(PgStat_Kind kind) + { + return kind >= PGSTAT_KIND_CUSTOM_MIN && kind <= PGSTAT_KIND_CUSTOM_MAX; + } + ++>>>>>>> theirs /* Values for track_functions GUC variable --- order is significant! */ typedef enum TrackFunctionsLevel { @@@ -448,22 -464,16 +514,33 @@@ typedef struct PgStat_StatTabEntr PgStat_Counter analyze_count; TimestampTz last_autoanalyze_time; /* autovacuum initiated */ PgStat_Counter autoanalyze_count; + + PgStat_Counter total_vacuum_time; /* times in milliseconds */ + PgStat_Counter total_autovacuum_time; + PgStat_Counter total_analyze_time; + PgStat_Counter total_autoanalyze_time; } PgStat_StatTabEntry; ++<<<<<<< ours +/* ------ + * PgStat_WalCounters WAL activity data gathered from WalUsage + * + * This stores all the counters and data gathered from WalUsage for WAL + * activity statistics, separated into its own structure so as this can be + * shared across multiple Stats structures. + * ------ + */ +typedef struct PgStat_WalCounters ++======= + typedef struct PgStat_StatRelFileNodeEntry + { + PgStat_Counter blocks_fetched; + PgStat_Counter blocks_hit; + PgStat_Counter blocks_written; + } PgStat_StatRelFileNodeEntry; + + typedef struct PgStat_WalStats ++>>>>>>> theirs { PgStat_Counter wal_records; PgStat_Counter wal_fpi; @@@ -659,12 -636,15 +736,16 @@@ extern void pgstat_assoc_relation(Relat extern void pgstat_unlink_relation(Relation rel); extern void pgstat_report_vacuum(Oid tableoid, bool shared, - PgStat_Counter livetuples, PgStat_Counter deadtuples); + PgStat_Counter livetuples, PgStat_Counter deadtuples, + TimestampTz starttime); extern void pgstat_report_analyze(Relation rel, PgStat_Counter livetuples, PgStat_Counter deadtuples, - bool resetcounter); + bool resetcounter, TimestampTz starttime); + extern void pgstat_report_relfilenode_blks_written(RelFileLocator locator); + extern void pgstat_report_relfilenode_buffer_read(Relation reln); + extern void pgstat_report_relfilenode_buffer_hit(Relation reln); + /* * If stats are enabled, but pending data hasn't been prepared yet, call * pgstat_assoc_relation() to do so. See its comment for why this is done diff --cc src/test/recovery/t/029_stats_restart.pl index 021e2bf361f,4c83a0c1679..00000000000 --- a/src/test/recovery/t/029_stats_restart.pl +++ b/src/test/recovery/t/029_stats_restart.pl @@@ -54,11 -39,11 +54,17 @@@ my $tableoid = $node->safe_psql($db_und trigger_funcrel_stat(); # verify stats objects exist ++<<<<<<< ours +$sect = "initial"; +is(have_stats('database', $dboid, 0), 't', "$sect: db stats do exist"); +is(have_stats('function', $dboid, $funcoid), ++======= + my $sect = "initial"; + is(have_stats('database', $dboid, 0, 0), 't', "$sect: db stats do exist"); + is(have_stats('function', $dboid, $funcoid, 0), ++>>>>>>> theirs 't', "$sect: function stats do exist"); - is(have_stats('relation', $dboid, $tableoid), + is(have_stats('relation', $dboid, $tableoid, 0), 't', "$sect: relation stats do exist"); # regular shutdown