Re: Pluggable cumulative statistics
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Cc: pgsql-hackers@lists.postgresql.org
Date: 2024-06-21T04:28:11Z
Lists: pgsql-hackers
On Fri, Jun 21, 2024 at 01:09:10PM +0900, Kyotaro Horiguchi wrote: > At Thu, 13 Jun 2024 16:59:50 +0900, Michael Paquier <michael@paquier.xyz> wrote in >> * The kind IDs may change across restarts, meaning that any stats data >> associated to a custom kind is stored with the *name* of the custom >> stats kind. Depending on the discussion happening here, I'd be open >> to use the same concept as custom RMGRs, where custom kind IDs are >> "reserved", fixed in time, and tracked in the Postgres wiki. It is >> cheaper to store the stats this way, as well, while managing conflicts >> across extensions available in the community ecosystem. > > I prefer to avoid having a central database if possible. I was thinking the same originally, but the experience with custom RMGRs has made me change my mind. There are more of these than I thought originally: https://wiki.postgresql.org/wiki/CustomWALResourceManagers > If we don't intend to move stats data alone out of a cluster for use > in another one, can't we store the relationship between stats names > and numeric IDs (or index numbers) in a separate file, which is loaded > just before and synced just after extension preloading finishes? Yeah, I've implemented a prototype that does exactly something like that with a restriction on the stats name to NAMEDATALEN, except that I've added the kind ID <-> kind name mapping at the beginning of the main stats file. At the end, it still felt weird and over-engineered to me, like the v1 prototype of upthread, because we finish with a strange mix when reloading the dshash where the builtin ID are handled with fixed values, with more code paths required when doing the serialize callback dance for stats kinds like replication slots, because the custom kinds need to update their hash keys to the new values based on the ID/name mapping stored at the beginning of the file itself. The equation complicates itself a bit more once you'd try to add more ways to write some stats kinds to other places, depending on what a custom kind wants to achieve. I can see the benefits of both approaches, still fixing the IDs in time leads to a lot of simplicity in this infra, which is very appealing on its own before tackling the next issues where I would rely on the proposed APIs. -- Michael
Commits
-
injection_points: Add some fixed-numbered statistics
- f68cd847fa40 18.0 landed
-
injection_points: Add some cumulative stats for injection points
- 75534436a477 18.0 landed
-
Add helper routines to retrieve data for custom fixed-numbered pgstats
- 2eff9e678d35 18.0 landed
-
Introduce pluggable APIs for Cumulative Statistics
- 7949d9594582 18.0 landed
-
Switch PgStat_Kind from an enum to a uint32 type
- 3188a4582a8c 18.0 landed
-
Improve comment of pgstat_read_statsfile()
- 72c0b24b2ddd 18.0 landed
-
Add a new 'F' entry type for fixed-numbered stats in pgstats file
- 9e4664d950c1 18.0 landed
-
Add PgStat_KindInfo.init_shmem_cb
- 21471f18e9d9 18.0 landed
-
Use pgstat_kind_infos to write fixed shared statistics
- b68b29bc8fec 18.0 landed
-
Replace hardcoded identifiers of pgstats file by #defines
- 9fd02525793f 18.0 landed