=== Applying patches on top of PostgreSQL commit ID 9b917a93116e6b8aac7ed837ded27696f7232505 === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Thu Aug 6 12:18:43 UTC 2026 On branch cf/5947 nothing to commit, working tree clean === using 'git am' to apply patch ./v5-0001-Adding-per-backend-commit-and-rollback-counters.patch === Applying: Adding per backend commit and rollback counters Using index info to reconstruct a base tree... M src/backend/utils/activity/pgstat_backend.c M src/backend/utils/activity/pgstat_database.c M src/include/pgstat.h M src/include/utils/pgstat_internal.h Falling back to patching base and 3-way merge... Auto-merging src/include/utils/pgstat_internal.h CONFLICT (content): Merge conflict in src/include/utils/pgstat_internal.h Auto-merging src/include/pgstat.h CONFLICT (content): Merge conflict in src/include/pgstat.h Auto-merging src/backend/utils/activity/pgstat_database.c Auto-merging src/backend/utils/activity/pgstat_backend.c CONFLICT (content): Merge conflict in src/backend/utils/activity/pgstat_backend.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 Adding per backend commit and rollback counters 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 ./v5-0001-Adding-per-backend-commit-and-rollback-counters.patch === patching file src/backend/utils/activity/pgstat_backend.c Hunk #1 succeeded at 37 with fuzz 2. Hunk #2 succeeded at 49 (offset 1 line). Hunk #3 succeeded at 331 with fuzz 1 (offset 65 lines). Hunk #4 succeeded at 387 with fuzz 1 (offset 69 lines). Hunk #5 succeeded at 409 with fuzz 2 (offset 72 lines). patching file src/backend/utils/activity/pgstat_database.c patching file src/include/pgstat.h Hunk #1 FAILED at 523. Hunk #2 FAILED at 535. Hunk #3 succeeded at 854 (offset 10 lines). 2 out of 3 hunks FAILED -- saving rejects to file src/include/pgstat.h.rej patching file src/include/utils/pgstat_internal.h Hunk #1 FAILED at 707. 1 out of 1 hunk FAILED -- saving rejects to file src/include/utils/pgstat_internal.h.rej Unstaged changes after reset: M src/backend/utils/activity/pgstat_backend.c M src/backend/utils/activity/pgstat_database.c M src/include/pgstat.h Removing src/include/pgstat.h.rej Removing src/include/utils/pgstat_internal.h.rej === using 'git apply' to apply patch ./v5-0001-Adding-per-backend-commit-and-rollback-counters.patch === Applied patch to 'src/backend/utils/activity/pgstat_backend.c' with conflicts. Applied patch to 'src/backend/utils/activity/pgstat_database.c' cleanly. Applied patch to 'src/include/pgstat.h' with conflicts. Applied patch to 'src/include/utils/pgstat_internal.h' with conflicts. U src/backend/utils/activity/pgstat_backend.c U src/include/pgstat.h U src/include/utils/pgstat_internal.h diff --cc src/backend/utils/activity/pgstat_backend.c index b736b2ccc6f,42bfb9cd38f..00000000000 --- a/src/backend/utils/activity/pgstat_backend.c +++ b/src/backend/utils/activity/pgstat_backend.c @@@ -37,9 -37,8 +37,9 @@@ * reported within critical sections so we use static memory in order to avoid * memory allocation. */ - static PgStat_BackendPending PendingBackendStats; + PgStat_BackendPending PendingBackendStats; static bool backend_has_iostats = false; +static bool backend_has_lockstats = false; /* * WAL usage counters saved from pgWalUsage at the previous call to @@@ -297,33 -267,31 +302,61 @@@ pgstat_flush_backend_entry_wal(PgStat_E } /* ++<<<<<<< ours + * Flush out locally pending backend lock statistics. Locking is managed + * by the caller. + */ +static void +pgstat_flush_backend_entry_lock(PgStat_EntryRef *entry_ref) +{ + PgStatShared_Backend *shbackendent; + PgStat_PendingLock *bktype_shstats; + + if (!backend_has_lockstats) + return; + + shbackendent = (PgStatShared_Backend *) entry_ref->shared_stats; + bktype_shstats = &shbackendent->stats.lock_stats; + + for (int i = 0; i <= LOCKTAG_LAST_TYPE; i++) + { +#define LOCKSTAT_ACC(fld) \ + (bktype_shstats->stats[i].fld += PendingBackendStats.pending_lock.stats[i].fld) + LOCKSTAT_ACC(waits); + LOCKSTAT_ACC(wait_time); + LOCKSTAT_ACC(fastpath_exceeded); +#undef LOCKSTAT_ACC + } + + MemSet(&PendingBackendStats.pending_lock, 0, sizeof(PgStat_PendingLock)); + backend_has_lockstats = false; ++======= + * Flush out locally pending backend transaction statistics. Locking is managed + * by the caller. + */ + static void + pgstat_flush_backend_entry_xact(PgStat_EntryRef *entry_ref) + { + PgStatShared_Backend *shbackendent; + + /* + * This function can be called even if nothing at all has happened for + * transaction statistics. In this case, avoid unnecessarily modifying + * the stats entry. + */ + if (!backend_has_xactstats) + return; + + shbackendent = (PgStatShared_Backend *) entry_ref->shared_stats; + + shbackendent->stats.xact_commit += PendingBackendStats.pending_xact_commit; + shbackendent->stats.xact_rollback += PendingBackendStats.pending_xact_rollback; + + PendingBackendStats.pending_xact_commit = 0; + PendingBackendStats.pending_xact_rollback = 0; + + backend_has_xactstats = false; ++>>>>>>> theirs } /* @@@ -350,8 -318,8 +383,13 @@@ pgstat_flush_backend(bool nowait, uint3 pgstat_backend_wal_have_pending()) has_pending_data = true; ++<<<<<<< ours + /* Some lock data pending? */ + if ((flags & PGSTAT_BACKEND_FLUSH_LOCK) && backend_has_lockstats) ++======= + /* Some transaction data pending? */ + if ((flags & PGSTAT_BACKEND_FLUSH_XACT) && backend_has_xactstats) ++>>>>>>> theirs has_pending_data = true; if (!has_pending_data) @@@ -369,8 -337,8 +407,13 @@@ if (flags & PGSTAT_BACKEND_FLUSH_WAL) pgstat_flush_backend_entry_wal(entry_ref); ++<<<<<<< ours + if (flags & PGSTAT_BACKEND_FLUSH_LOCK) + pgstat_flush_backend_entry_lock(entry_ref); ++======= + if (flags & PGSTAT_BACKEND_FLUSH_XACT) + pgstat_flush_backend_entry_xact(entry_ref); ++>>>>>>> theirs pgstat_unlock_entry(entry_ref); diff --cc src/include/pgstat.h index 58a44857f13,5d73c4dfbcf..00000000000 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@@ -523,7 -523,8 +523,12 @@@ typedef struct PgStat_Backen TimestampTz stat_reset_timestamp; PgStat_BktypeIO io_stats; PgStat_WalCounters wal_counters; ++<<<<<<< ours + PgStat_PendingLock lock_stats; ++======= + PgStat_Counter xact_commit; + PgStat_Counter xact_rollback; ++>>>>>>> theirs } PgStat_Backend; /* --------- @@@ -538,10 -539,10 +543,17 @@@ typedef struct PgStat_BackendPendin PgStat_PendingIO pending_io; /* ++<<<<<<< ours + * Backend statistics store the same amount of lock data as + * PGSTAT_KIND_LOCK. + */ + PgStat_PendingLock pending_lock; ++======= + * Transaction statistics pending flush. + */ + PgStat_Counter pending_xact_commit; + PgStat_Counter pending_xact_rollback; ++>>>>>>> theirs } PgStat_BackendPending; /* diff --cc src/include/utils/pgstat_internal.h index b0a17691966,8077c65e938..00000000000 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@@ -707,8 -707,8 +707,13 @@@ extern void pgstat_archiver_snapshot_cb /* flags for pgstat_flush_backend() */ #define PGSTAT_BACKEND_FLUSH_IO (1 << 0) /* Flush I/O statistics */ #define PGSTAT_BACKEND_FLUSH_WAL (1 << 1) /* Flush WAL statistics */ ++<<<<<<< ours +#define PGSTAT_BACKEND_FLUSH_LOCK (1 << 2) /* Flush lock statistics */ +#define PGSTAT_BACKEND_FLUSH_ALL (PGSTAT_BACKEND_FLUSH_IO | PGSTAT_BACKEND_FLUSH_WAL | PGSTAT_BACKEND_FLUSH_LOCK) ++======= + #define PGSTAT_BACKEND_FLUSH_XACT (1 << 2) /* Flush xact statistics */ + #define PGSTAT_BACKEND_FLUSH_ALL (PGSTAT_BACKEND_FLUSH_IO | PGSTAT_BACKEND_FLUSH_WAL | PGSTAT_BACKEND_FLUSH_XACT) ++>>>>>>> theirs extern bool pgstat_flush_backend(bool nowait, uint32 flags); extern bool pgstat_backend_flush_cb(bool nowait);