=== Applying patches on top of PostgreSQL commit ID fd2b89854d93d70fe8c9a69d5b8fafd5b9302cfc === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Wed Aug 5 16:07:31 UTC 2026 On branch cf/6607 nothing to commit, working tree clean === using 'git am' to apply patch ./pg_stat_tablespace_final_v4.patch === Applying: Add pg_stat_tablespace statistics view Using index info to reconstruct a base tree... M doc/src/sgml/monitoring.sgml M src/backend/catalog/system_views.sql M src/backend/storage/buffer/bufmgr.c M src/backend/storage/file/fd.c M src/backend/utils/activity/Makefile M src/backend/utils/activity/meson.build M src/backend/utils/activity/pgstat.c M src/backend/utils/activity/pgstat_database.c M src/backend/utils/activity/pgstat_relation.c M src/backend/utils/adt/pgstatfuncs.c M src/include/catalog/pg_proc.dat M src/include/pgstat.h M src/include/utils/backend_status.h M src/include/utils/pgstat_internal.h M src/test/regress/expected/rules.out M src/test/regress/expected/stats.out M src/test/regress/sql/stats.sql Falling back to patching base and 3-way merge... Auto-merging src/test/regress/sql/stats.sql Auto-merging src/test/regress/expected/stats.out CONFLICT (content): Merge conflict in src/test/regress/expected/stats.out Auto-merging src/test/regress/expected/rules.out Auto-merging src/include/utils/pgstat_internal.h Auto-merging src/include/utils/backend_status.h Auto-merging src/include/pgstat.h Auto-merging src/include/catalog/pg_proc.dat 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_relation.c Auto-merging src/backend/utils/activity/pgstat_database.c Auto-merging src/backend/utils/activity/pgstat.c Auto-merging src/backend/utils/activity/meson.build Auto-merging src/backend/utils/activity/Makefile Auto-merging src/backend/storage/file/fd.c Auto-merging src/backend/storage/buffer/bufmgr.c CONFLICT (content): Merge conflict in src/backend/storage/buffer/bufmgr.c Auto-merging src/backend/catalog/system_views.sql Auto-merging doc/src/sgml/monitoring.sgml error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 Add pg_stat_tablespace statistics view 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". === using patch(1) to apply patch ./pg_stat_tablespace_final_v4.patch === patching file doc/src/sgml/monitoring.sgml Hunk #1 succeeded at 555 (offset 20 lines). Hunk #2 succeeded at 5744 (offset 480 lines). patching file src/backend/catalog/system_views.sql Hunk #1 succeeded at 1146 (offset 18 lines). patching file src/backend/commands/tablespace.c patching file src/backend/storage/buffer/bufmgr.c Hunk #1 succeeded at 1824 (offset 9 lines). Hunk #2 succeeded at 1834 with fuzz 2 (offset 10 lines). Hunk #3 succeeded at 1958 (offset 10 lines). Hunk #4 succeeded at 2160 (offset 9 lines). Hunk #5 succeeded at 2831 (offset 23 lines). Hunk #6 succeeded at 3055 (offset 23 lines). Hunk #7 succeeded at 4548 (offset 23 lines). Hunk #8 FAILED at 4618. 1 out of 8 hunks FAILED -- saving rejects to file src/backend/storage/buffer/bufmgr.c.rej patching file src/backend/storage/file/fd.c patching file src/backend/utils/activity/Makefile Hunk #1 succeeded at 33 (offset 1 line). patching file src/backend/utils/activity/meson.build Hunk #1 succeeded at 18 (offset 1 line). patching file src/backend/utils/activity/pgstat.c patching file src/backend/utils/activity/pgstat_database.c patching file src/backend/utils/activity/pgstat_relation.c Hunk #3 succeeded at 138 with fuzz 2 (offset 1 line). Hunk #4 succeeded at 712 (offset 2 lines). Hunk #5 succeeded at 756 (offset 2 lines). Hunk #6 succeeded at 792 (offset 2 lines). Hunk #7 succeeded at 903 (offset 2 lines). Hunk #8 succeeded at 943 (offset 2 lines). Hunk #9 succeeded at 953 (offset 2 lines). patching file src/backend/utils/activity/pgstat_tablespace.c patching file src/backend/utils/adt/pgstatfuncs.c Hunk #1 succeeded at 2001 (offset 36 lines). Hunk #2 FAILED at 1988. Hunk #3 succeeded at 2385 (offset 36 lines). 1 out of 3 hunks FAILED -- saving rejects to file src/backend/utils/adt/pgstatfuncs.c.rej patching file src/include/catalog/pg_proc.dat Hunk #1 succeeded at 6122 (offset 26 lines). patching file src/include/pgstat.h Hunk #3 succeeded at 799 (offset 10 lines). patching file src/include/utils/backend_status.h Hunk #1 succeeded at 315 (offset -8 lines). patching file src/include/utils/pgstat_internal.h Hunk #1 succeeded at 502 (offset -2 lines). Hunk #2 succeeded at 751 (offset 1 line). patching file src/include/utils/pgstat_kind.h patching file src/test/regress/expected/rules.out Hunk #1 succeeded at 2371 (offset 64 lines). patching file src/test/regress/expected/stats.out Hunk #1 FAILED at 1130. Hunk #2 succeeded at 2068 (offset 62 lines). 1 out of 2 hunks FAILED -- saving rejects to file src/test/regress/expected/stats.out.rej patching file src/test/regress/sql/stats.sql Hunk #1 succeeded at 1024 (offset 24 lines). Unstaged changes after reset: M doc/src/sgml/monitoring.sgml M src/backend/catalog/system_views.sql M src/backend/commands/tablespace.c M src/backend/storage/buffer/bufmgr.c M src/backend/storage/file/fd.c M src/backend/utils/activity/Makefile M src/backend/utils/activity/meson.build M src/backend/utils/activity/pgstat.c M src/backend/utils/activity/pgstat_database.c M src/backend/utils/activity/pgstat_relation.c M src/backend/utils/adt/pgstatfuncs.c M src/include/catalog/pg_proc.dat M src/include/pgstat.h M src/include/utils/backend_status.h M src/include/utils/pgstat_internal.h M src/include/utils/pgstat_kind.h M src/test/regress/expected/rules.out M src/test/regress/expected/stats.out M src/test/regress/sql/stats.sql Removing src/backend/storage/buffer/bufmgr.c.rej Removing src/backend/utils/activity/pgstat_tablespace.c Removing src/backend/utils/adt/pgstatfuncs.c.rej Removing src/test/regress/expected/stats.out.rej === using 'git apply' to apply patch ./pg_stat_tablespace_final_v4.patch === Applied patch to 'doc/src/sgml/monitoring.sgml' cleanly. Applied patch to 'src/backend/catalog/system_views.sql' cleanly. Applied patch to 'src/backend/commands/tablespace.c' cleanly. Applied patch to 'src/backend/storage/buffer/bufmgr.c' with conflicts. Applied patch to 'src/backend/storage/file/fd.c' cleanly. Applied patch to 'src/backend/utils/activity/Makefile' cleanly. Applied patch to 'src/backend/utils/activity/meson.build' cleanly. Applied patch to 'src/backend/utils/activity/pgstat.c' cleanly. Applied patch to 'src/backend/utils/activity/pgstat_database.c' cleanly. Applied patch to 'src/backend/utils/activity/pgstat_relation.c' cleanly. Falling back to direct application... Applied patch to 'src/backend/utils/adt/pgstatfuncs.c' with conflicts. Applied patch to 'src/include/catalog/pg_proc.dat' cleanly. Applied patch to 'src/include/pgstat.h' cleanly. Applied patch to 'src/include/utils/backend_status.h' cleanly. Applied patch to 'src/include/utils/pgstat_internal.h' cleanly. Applied patch to 'src/include/utils/pgstat_kind.h' cleanly. Applied patch to 'src/test/regress/expected/rules.out' cleanly. Applied patch to 'src/test/regress/expected/stats.out' with conflicts. Applied patch to 'src/test/regress/sql/stats.sql' cleanly. U src/backend/storage/buffer/bufmgr.c U src/backend/utils/adt/pgstatfuncs.c U src/test/regress/expected/stats.out diff --cc src/backend/storage/buffer/bufmgr.c index 169829eb020,678b3bd1b00..00000000000 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@@ -1829,12 -1821,17 +1830,18 @@@ WaitReadBuffers(ReadBuffersOperation *o needed_wait = true; /* - * The IO operation itself was already counted earlier, in - * AsyncReadBuffers(), this just accounts for the wait time. + * This just accounts for the wait time. The IO operation + * itself was already counted earlier in AsyncReadBuffers() -- + * either by us or by another backend if this is a foreign IO. */ + INSTR_TIME_SET_CURRENT(io_time); + INSTR_TIME_SUBTRACT(io_time, io_start); + pgstat_count_io_op_time(io_object, io_context, IOOP_READ, io_start, 0, 0); + + pgstat_count_tablespace_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time), + operation->smgr->smgr_rlocator.locator.spcOid); } else { @@@ -4621,9 -4618,16 +4641,20 @@@ FlushBuffer(BufferDesc *buf, SMgrRelati * When a strategy is not in use, the write can only be a "regular" write * of a dirty shared buffer (IOCONTEXT_NORMAL IOOP_WRITE). */ ++<<<<<<< ours + pgstat_count_io_op_time(io_object, io_context, ++======= + + INSTR_TIME_SET_CURRENT(io_time); + INSTR_TIME_SUBTRACT(io_time, io_start); + + pgstat_count_io_op_time(IOOBJECT_RELATION, io_context, ++>>>>>>> theirs IOOP_WRITE, io_start, 1, BLCKSZ); + pgstat_count_tablespace_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time), + reln->smgr_rlocator.locator.spcOid); + pgBufferUsage.shared_blks_written++; /* diff --cc src/backend/utils/adt/pgstatfuncs.c index 565d0e70768,3fb9c662db8..00000000000 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@@ -2027,7 -1994,7 +2030,11 @@@ pg_stat_reset_shared(PG_FUNCTION_ARGS ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("unrecognized reset target: \"%s\"", target), ++<<<<<<< ours + errhint("Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"lock\", \"recovery_prefetch\", \"slru\", or \"wal\"."))); ++======= + errhint("Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", \"wal\", or \"tablespace\"."))); ++>>>>>>> theirs PG_RETURN_VOID(); } diff --cc src/test/regress/expected/stats.out index e230356de13,bab3d465594..00000000000 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@@ -1180,7 -1130,7 +1180,11 @@@ SELECT stats_reset > :'wal_reset_ts'::t -- Test error case for reset_shared with unknown stats type SELECT pg_stat_reset_shared('unknown'); ERROR: unrecognized reset target: "unknown" ++<<<<<<< ours +HINT: Target must be "archiver", "bgwriter", "checkpointer", "io", "lock", "recovery_prefetch", "slru", or "wal". ++======= + HINT: Target must be "archiver", "bgwriter", "checkpointer", "io", "recovery_prefetch", "slru", "wal", or "tablespace". ++>>>>>>> theirs -- Test that reset works for pg_stat_database and pg_stat_database_conflicts -- Since pg_stat_database stats_reset starts out as NULL, reset it once first so that we -- have a baseline for comparison. The same for pg_stat_database_conflicts as it shares @@@ -2059,13 -2005,88 +2063,96 @@@ SELECT fastpath_exceeded > :fastpath_ex t (1 row) +SELECT fastpath_exceeded > :backend_fastpath_exceeded_before + FROM pg_stat_get_backend_lock(pg_backend_pid()) + WHERE locktype = 'relation'; + ?column? +---------- + t +(1 row) + DROP TABLE part_test; + -- Test pg_stat_tablespace + SELECT count(*) > 0 FROM pg_stat_tablespace; + ?column? + ---------- + t + (1 row) + + SELECT tablespace_name FROM pg_stat_tablespace WHERE tablespace_name IN ('pg_default', 'pg_global') ORDER BY tablespace_name; + tablespace_name + ----------------- + pg_default + pg_global + (2 rows) + + -- Test block and tuple stats in pg_stat_tablespace + SET track_io_timing = on; + CREATE TABLE test_tablespace_stats (a int); + INSERT INTO test_tablespace_stats SELECT generate_series(1, 100); + SELECT count(*) FROM test_tablespace_stats; + count + ------- + 100 + (1 row) + + UPDATE test_tablespace_stats SET a = a + 1 WHERE a > 50; + DELETE FROM test_tablespace_stats WHERE a > 90; + SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush + -------------------------- + + (1 row) + + SELECT blks_read > 0 AS has_blks_read, blks_hit > 0 AS has_blks_hit, blk_read_time > 0 AS has_blk_read_time, blk_write_time > 0 AS has_blk_write_time, tup_inserted > 0 AS has_tup_inserted, tup_updated > 0 AS has_tup_updated, tup_deleted > 0 AS has_tup_deleted, tup_returned > 0 AS has_tup_returned FROM pg_stat_tablespace WHERE tablespace_name = 'pg_default'; + has_blks_read | has_blks_hit | has_blk_read_time | has_blk_write_time | has_tup_inserted | has_tup_updated | has_tup_deleted | has_tup_returned + ---------------+--------------+-------------------+--------------------+------------------+-----------------+-----------------+------------------ + t | t | t | t | t | t | t | t + (1 row) + + DROP TABLE test_tablespace_stats; + -- Test temp file stats in pg_stat_tablespace + -- Use a sort that exceeds work_mem to force temp file usage + SET work_mem = '64kB'; + SELECT count(*) FROM (SELECT * FROM generate_series(1, 10000) AS s ORDER BY s DESC) AS foo; + count + ------- + 10000 + (1 row) + + RESET work_mem; + SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush + -------------------------- + + (1 row) + + -- We expect temp files to be in pg_default if not specified otherwise + SELECT temp_files > 0 AS has_temp_files, temp_bytes > 0 AS has_temp_bytes FROM pg_stat_tablespace WHERE tablespace_name = 'pg_default'; + has_temp_files | has_temp_bytes + ----------------+---------------- + t | t + (1 row) + + -- Test reset for pg_stat_tablespace + -- Ensure we have a timestamp to compare + SELECT pg_stat_reset_shared('tablespace'); + pg_stat_reset_shared + ---------------------- + + (1 row) + + SELECT stats_reset AS ts_reset_before FROM pg_stat_tablespace WHERE tablespace_name = 'pg_default' \gset + SELECT pg_stat_reset_shared('tablespace'); + pg_stat_reset_shared + ---------------------- + + (1 row) + + SELECT stats_reset > :'ts_reset_before'::timestamptz FROM pg_stat_tablespace WHERE tablespace_name = 'pg_default'; + ?column? + ---------- + t + (1 row) + -- End of Stats Test