mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
Add a new 'F' entry type for fixed-numbered stats in pgstats file
This new entry type is used for all the fixed-numbered statistics, making possible support for custom pluggable stats. In short, we need to be able to detect more easily if a stats kind exists or not when reading back its data from the pgstats file without a dependency on the order of the entries read. The kind ID of the stats is added to the data written. The data is written in the same fashion as previously, with the fixed-numbered stats first and the dshash entries next. The read part becomes more flexible, loading fixed-numbered stats into shared memory based on the new entry type found. Bump PGSTAT_FILE_FORMAT_ID. Reviewed-by: Bertrand Drouvot Discussion: https://postgr.es/m/Zot5bxoPYdS7yaoy@paquier.xyz
This commit is contained in:
parent
21471f18e9
commit
9e4664d950
@ -132,6 +132,7 @@
|
||||
* ---------
|
||||
*/
|
||||
#define PGSTAT_FILE_ENTRY_END 'E' /* end of file */
|
||||
#define PGSTAT_FILE_ENTRY_FIXED 'F' /* fixed-numbered stats entry */
|
||||
#define PGSTAT_FILE_ENTRY_NAME 'N' /* stats entry identified by name */
|
||||
#define PGSTAT_FILE_ENTRY_HASH 'S' /* stats entry identified by
|
||||
* PgStat_HashKey */
|
||||
@ -1396,6 +1397,9 @@ pgstat_write_statsfile(void)
|
||||
|
||||
pgstat_build_snapshot_fixed(kind);
|
||||
ptr = ((char *) &pgStatLocal.snapshot) + info->snapshot_ctl_off;
|
||||
|
||||
fputc(PGSTAT_FILE_ENTRY_FIXED, fpout);
|
||||
write_chunk_s(fpout, &kind);
|
||||
write_chunk(fpout, ptr, info->shared_data_len);
|
||||
}
|
||||
|
||||
@ -1537,25 +1541,9 @@ pgstat_read_statsfile(void)
|
||||
format_id != PGSTAT_FILE_FORMAT_ID)
|
||||
goto error;
|
||||
|
||||
/* Read various stats structs with fixed number of objects */
|
||||
for (int kind = PGSTAT_KIND_FIRST_VALID; kind <= PGSTAT_KIND_LAST; kind++)
|
||||
{
|
||||
char *ptr;
|
||||
const PgStat_KindInfo *info = pgstat_get_kind_info(kind);
|
||||
|
||||
if (!info->fixed_amount)
|
||||
continue;
|
||||
|
||||
Assert(info->shared_ctl_off != 0);
|
||||
|
||||
ptr = ((char *) shmem) + info->shared_ctl_off + info->shared_data_off;
|
||||
if (!read_chunk(fpin, ptr, info->shared_data_len))
|
||||
goto error;
|
||||
}
|
||||
|
||||
/*
|
||||
* We found an existing statistics file. Read it and put all the hash
|
||||
* table entries into place.
|
||||
* We found an existing statistics file. Read it and put all the stats
|
||||
* data into place.
|
||||
*/
|
||||
for (;;)
|
||||
{
|
||||
@ -1563,6 +1551,33 @@ pgstat_read_statsfile(void)
|
||||
|
||||
switch (t)
|
||||
{
|
||||
case PGSTAT_FILE_ENTRY_FIXED:
|
||||
{
|
||||
PgStat_Kind kind;
|
||||
const PgStat_KindInfo *info;
|
||||
char *ptr;
|
||||
|
||||
/* entry for fixed-numbered stats */
|
||||
if (!read_chunk_s(fpin, &kind))
|
||||
goto error;
|
||||
|
||||
if (!pgstat_is_kind_valid(kind))
|
||||
goto error;
|
||||
|
||||
info = pgstat_get_kind_info(kind);
|
||||
|
||||
if (!info->fixed_amount)
|
||||
goto error;
|
||||
|
||||
/* Load back stats into shared memory */
|
||||
ptr = ((char *) shmem) + info->shared_ctl_off +
|
||||
info->shared_data_off;
|
||||
|
||||
if (!read_chunk(fpin, ptr, info->shared_data_len))
|
||||
goto error;
|
||||
|
||||
break;
|
||||
}
|
||||
case PGSTAT_FILE_ENTRY_HASH:
|
||||
case PGSTAT_FILE_ENTRY_NAME:
|
||||
{
|
||||
|
@ -235,7 +235,7 @@ typedef struct PgStat_TableXactStatus
|
||||
* ------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BCAC
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BCAD
|
||||
|
||||
typedef struct PgStat_ArchiverStats
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user