mirror of
https://github.com/postgres/postgres.git
synced 2025-05-31 03:21:24 +03:00
Add rmgrdesc README
In the README, briefly explain what rmgrdesc functions are, and why they are in a separate directory. Commit c03c2eae0a added some guidelines on the preferred output format; move that to the README too. Reviewed-by: Melanie Plageman, Peter Geoghegan Discussion: https://www.postgresql.org/message-id/9159daf7-f42d-781b-458f-1b2cf32cb256%40iki.fi
This commit is contained in:
parent
be8d4cb13c
commit
f0bd0b4489
61
src/backend/access/rmgrdesc/README
Normal file
61
src/backend/access/rmgrdesc/README
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
src/backend/access/rmgrdesc/README
|
||||||
|
|
||||||
|
WAL resource manager description functions
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
For debugging purposes, there is a "description function", or rmgrdesc
|
||||||
|
function, for each WAL resource manager. The rmgrdesc function parses the WAL
|
||||||
|
record and prints the contents of the WAL record in a somewhat human-readable
|
||||||
|
format.
|
||||||
|
|
||||||
|
The rmgrdesc functions for all resource managers are gathered in this
|
||||||
|
directory, because they are also used in the stand-alone pg_waldump program.
|
||||||
|
They could potentially be used by out-of-tree debugging tools too, although
|
||||||
|
neither the description functions nor the output format should be considered
|
||||||
|
part of a stable API
|
||||||
|
|
||||||
|
Guidelines for rmgrdesc output format
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
The goal of these guidelines is to avoid gratuitous inconsistencies across
|
||||||
|
each rmgr, and to allow users to parse desc output strings without too much
|
||||||
|
difficulty. This is not an API specification or an interchange format.
|
||||||
|
(Only heapam and nbtree desc routines follow these guidelines at present, in
|
||||||
|
any case.)
|
||||||
|
|
||||||
|
Record descriptions are similar to JSON style key/value objects. However,
|
||||||
|
there is no explicit "string" type/string escaping. Top-level { } brackets
|
||||||
|
should be omitted. For example:
|
||||||
|
|
||||||
|
snapshotConflictHorizon: 0, flags: 0x03
|
||||||
|
|
||||||
|
Record descriptions may contain variable-length arrays. For example:
|
||||||
|
|
||||||
|
nunused: 5, unused: [1, 2, 3, 4, 5]
|
||||||
|
|
||||||
|
Nested objects are supported via { } brackets. They generally appear inside
|
||||||
|
variable-length arrays. For example:
|
||||||
|
|
||||||
|
ndeleted: 0, nupdated: 1, deleted: [], updated: [{ off: 45, nptids: 1, ptids: [0] }]
|
||||||
|
|
||||||
|
Try to output things in an order that faithfully represents the order of
|
||||||
|
fields from the underlying physical WAL record struct. Key names should be
|
||||||
|
unique (at the same nesting level) to make parsing easy. It's a good idea if
|
||||||
|
the number of items in the array appears before the array.
|
||||||
|
|
||||||
|
It's okay for individual WAL record types to invent their own conventions.
|
||||||
|
For example, Heap2's PRUNE record descriptions use a custom array format for
|
||||||
|
the record's "redirected" field:
|
||||||
|
|
||||||
|
... redirected: [1->4, 5->9], dead: [10, 11], unused: [3, 7, 8]
|
||||||
|
|
||||||
|
Arguably the desc routine should be using object notation for this instead.
|
||||||
|
However, there is value in using a custom format when it conveys useful
|
||||||
|
information about the underlying physical data structures.
|
||||||
|
|
||||||
|
This ad-hoc format has the advantage of being close to the format used for
|
||||||
|
the "dead" and "unused" arrays (which follow the standard desc convention for
|
||||||
|
page offset number arrays). It suggests that the "redirected" elements shown
|
||||||
|
are just pairs of page offset numbers (which is how it really works).
|
||||||
|
|
||||||
|
rmgrdesc_utils.c contains some helper functions to print data in this format.
|
@ -16,6 +16,10 @@
|
|||||||
#include "access/rmgrdesc_utils.h"
|
#include "access/rmgrdesc_utils.h"
|
||||||
#include "storage/off.h"
|
#include "storage/off.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper function to print an array, in the format described in the
|
||||||
|
* README.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
array_desc(StringInfo buf, void *array, size_t elem_size, int count,
|
array_desc(StringInfo buf, void *array, size_t elem_size, int count,
|
||||||
void (*elem_desc) (StringInfo buf, void *elem, void *data),
|
void (*elem_desc) (StringInfo buf, void *elem, void *data),
|
||||||
|
@ -12,50 +12,6 @@
|
|||||||
#ifndef RMGRDESC_UTILS_H_
|
#ifndef RMGRDESC_UTILS_H_
|
||||||
#define RMGRDESC_UTILS_H_
|
#define RMGRDESC_UTILS_H_
|
||||||
|
|
||||||
/*
|
|
||||||
* Guidelines for rmgrdesc routine authors:
|
|
||||||
*
|
|
||||||
* The goal of these guidelines is to avoid gratuitous inconsistencies across
|
|
||||||
* each rmgr, and to allow users to parse desc output strings without too much
|
|
||||||
* difficulty. This is not an API specification or an interchange format.
|
|
||||||
* (Only heapam and nbtree desc routines follow these guidelines at present,
|
|
||||||
* in any case.)
|
|
||||||
*
|
|
||||||
* Record descriptions are similar to JSON style key/value objects. However,
|
|
||||||
* there is no explicit "string" type/string escaping. Top-level { } brackets
|
|
||||||
* should be omitted. For example:
|
|
||||||
*
|
|
||||||
* snapshotConflictHorizon: 0, flags: 0x03
|
|
||||||
*
|
|
||||||
* Record descriptions may contain variable-length arrays. For example:
|
|
||||||
*
|
|
||||||
* nunused: 5, unused: [1, 2, 3, 4, 5]
|
|
||||||
*
|
|
||||||
* Nested objects are supported via { } brackets. They generally appear
|
|
||||||
* inside variable-length arrays. For example:
|
|
||||||
*
|
|
||||||
* ndeleted: 0, nupdated: 1, deleted: [], updated: [{ off: 45, nptids: 1, ptids: [0] }]
|
|
||||||
*
|
|
||||||
* Try to output things in an order that faithfully represents the order of
|
|
||||||
* fields from the underlying physical WAL record struct. Key names should be
|
|
||||||
* unique (at the same nesting level) to make parsing easy. It's a good idea
|
|
||||||
* if the number of items in the array appears before the array.
|
|
||||||
*
|
|
||||||
* It's okay for individual WAL record types to invent their own conventions.
|
|
||||||
* For example, Heap2's PRUNE record descriptions use a custom array format
|
|
||||||
* for the record's "redirected" field:
|
|
||||||
*
|
|
||||||
* ... redirected: [1->4, 5->9], dead: [10, 11], unused: [3, 7, 8]
|
|
||||||
*
|
|
||||||
* Arguably the desc routine should be using object notation for this instead.
|
|
||||||
* However, there is value in using a custom format when it conveys useful
|
|
||||||
* information about the underlying physical data structures.
|
|
||||||
*
|
|
||||||
* This ad-hoc format has the advantage of being close to the format used for
|
|
||||||
* the "dead" and "unused" arrays (which follow the standard desc convention
|
|
||||||
* for page offset number arrays). It suggests that the "redirected" elements
|
|
||||||
* shown are just pairs of page offset numbers (which is how it really works).
|
|
||||||
*/
|
|
||||||
extern void array_desc(StringInfo buf, void *array, size_t elem_size, int count,
|
extern void array_desc(StringInfo buf, void *array, size_t elem_size, int count,
|
||||||
void (*elem_desc) (StringInfo buf, void *elem, void *data),
|
void (*elem_desc) (StringInfo buf, void *elem, void *data),
|
||||||
void *data);
|
void *data);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user