public inbox for [email protected]help / color / mirror / Atom feed
[PATCH] Fix misuses of RelationNeedsWAL 22+ messages / 2 participants [nested] [flat]
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH] Fix misuses of RelationNeedsWAL @ 2021-01-13 06:52 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Kyotaro Horiguchi @ 2021-01-13 06:52 UTC (permalink / raw) The definition of the macro RelationNeedsWAL has been changed by c6b92041d3 to include conditions related to the WAL-skip optimization but some uses of the macro are not relevant to the optimization. That misuses are harmless for now as they are only executed while wal_level >= replica or WAL-skipping is inactive. However, this should be corrected to prevent future hazard. --- src/backend/catalog/pg_publication.c | 2 +- src/backend/optimizer/util/plancat.c | 2 +- src/include/utils/rel.h | 15 +++++++++++---- src/include/utils/snapmgr.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index 5f8e1c64e1..f3060a4cf1 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -67,7 +67,7 @@ check_publication_add_relation(Relation targetrel) errdetail("System tables cannot be added to publications."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationNeedsWAL(targetrel)) + if (!RelationIsWalLogged(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("table \"%s\" cannot be replicated", diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index da322b453e..0500efcdb9 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -126,7 +126,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, relation = table_open(relationObjectId, NoLock); /* Temporary and unlogged relations are inaccessible during recovery. */ - if (!RelationNeedsWAL(relation) && RecoveryInProgress()) + if (!RelationIsWalLogged(relation) && RecoveryInProgress()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary or unlogged relations during recovery"))); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 10b63982c0..810806a542 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -552,16 +552,23 @@ typedef struct ViewOptions (relation)->rd_smgr->smgr_targblock = (targblock); \ } while (0) +/* + * RelationIsPermanent + * True if relation is WAL-logged. + */ +#define RelationIsWalLogged(relation) \ + ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) + /* * RelationNeedsWAL - * True if relation needs WAL. + * True if relation needs WAL at the time. * * Returns false if wal_level = minimal and this relation is created or * truncated in the current transaction. See "Skipping WAL for New * RelFileNode" in src/backend/access/transam/README. */ #define RelationNeedsWAL(relation) \ - ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \ + (RelationIsWalLogged(relation) && \ (XLogIsNeeded() || \ (relation->rd_createSubid == InvalidSubTransactionId && \ relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId))) @@ -619,7 +626,7 @@ typedef struct ViewOptions */ #define RelationIsAccessibleInLogicalDecoding(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation))) /* @@ -635,7 +642,7 @@ typedef struct ViewOptions */ #define RelationIsLogicallyLogged(relation) \ (XLogLogicalInfoActive() && \ - RelationNeedsWAL(relation) && \ + RelationIsWalLogged(relation) && \ !IsCatalogRelation(relation)) /* routines in utils/cache/relcache.c */ diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 579be352c5..7be922a9f1 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -37,7 +37,7 @@ */ #define RelationAllowsEarlyPruning(rel) \ ( \ - RelationNeedsWAL(rel) \ + RelationIsWalLogged(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ ) -- 2.27.0 ----Next_Part(Wed_Jan_13_16_07_05_2021_621)---- ^ permalink raw reply [nested|flat] 22+ messages in thread
* Re: cleanup patches for incremental backup @ 2024-01-09 18:18 Robert Haas <[email protected]> 0 siblings, 0 replies; 22+ messages in thread From: Robert Haas @ 2024-01-09 18:18 UTC (permalink / raw) To: PostgreSQL Hackers <[email protected]>; Jakub Wartak <[email protected]> Hello again, I have now committed 0001. I got some off-list review of 0004; specifically, Michael Paquier said it looked OK, and Tom Lane found another bug. So I've added a fix for that in what's now 0003. Here's v2. I plan to commit the rest of this fairly soon if there are no comments. ...Robert Attachments: [application/octet-stream] v2-0002-Add-new-pg_walsummary-tool.patch (21.9K, ../../CA+TgmoYAwqmj+xyFc1R5XsB62iR2zDiYckr8Hf2f8biJ7k1sEw@mail.gmail.com/2-v2-0002-Add-new-pg_walsummary-tool.patch) download | inline diff: From 044d7a5e49bee75ee47dc943c758d0e660055156 Mon Sep 17 00:00:00 2001 From: Robert Haas <[email protected]> Date: Wed, 20 Dec 2023 15:52:59 -0500 Subject: [PATCH v2 2/3] Add new pg_walsummary tool. This can dump the contents of the WAL summary files found in pg_wal/summaries. Normally, this shouldn't really be something anyone needs to do, but it may be needed for debugging problems with incremental backup, or could possibly be used in some useful way by external tools. --- doc/src/sgml/ref/allfiles.sgml | 1 + doc/src/sgml/ref/pg_walsummary.sgml | 122 +++++++++++ doc/src/sgml/reference.sgml | 1 + src/bin/Makefile | 1 + src/bin/meson.build | 1 + src/bin/pg_walsummary/.gitignore | 1 + src/bin/pg_walsummary/Makefile | 48 +++++ src/bin/pg_walsummary/meson.build | 30 +++ src/bin/pg_walsummary/nls.mk | 6 + src/bin/pg_walsummary/pg_walsummary.c | 280 ++++++++++++++++++++++++++ src/bin/pg_walsummary/t/001_basic.pl | 19 ++ src/bin/pg_walsummary/t/002_blocks.pl | 88 ++++++++ src/tools/pgindent/typedefs.list | 2 + 13 files changed, 600 insertions(+) create mode 100644 doc/src/sgml/ref/pg_walsummary.sgml create mode 100644 src/bin/pg_walsummary/.gitignore create mode 100644 src/bin/pg_walsummary/Makefile create mode 100644 src/bin/pg_walsummary/meson.build create mode 100644 src/bin/pg_walsummary/nls.mk create mode 100644 src/bin/pg_walsummary/pg_walsummary.c create mode 100644 src/bin/pg_walsummary/t/001_basic.pl create mode 100644 src/bin/pg_walsummary/t/002_blocks.pl diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml index fda4690eab..4a42999b18 100644 --- a/doc/src/sgml/ref/allfiles.sgml +++ b/doc/src/sgml/ref/allfiles.sgml @@ -219,6 +219,7 @@ Complete list of usable sgml source files in this directory. <!ENTITY pgtesttiming SYSTEM "pgtesttiming.sgml"> <!ENTITY pgupgrade SYSTEM "pgupgrade.sgml"> <!ENTITY pgwaldump SYSTEM "pg_waldump.sgml"> +<!ENTITY pgwalsummary SYSTEM "pg_walsummary.sgml"> <!ENTITY postgres SYSTEM "postgres-ref.sgml"> <!ENTITY psqlRef SYSTEM "psql-ref.sgml"> <!ENTITY reindexdb SYSTEM "reindexdb.sgml"> diff --git a/doc/src/sgml/ref/pg_walsummary.sgml b/doc/src/sgml/ref/pg_walsummary.sgml new file mode 100644 index 0000000000..93e265ead7 --- /dev/null +++ b/doc/src/sgml/ref/pg_walsummary.sgml @@ -0,0 +1,122 @@ +<!-- +doc/src/sgml/ref/pg_walsummary.sgml +PostgreSQL documentation +--> + +<refentry id="app-pgwalsummary"> + <indexterm zone="app-pgwalsummary"> + <primary>pg_walsummary</primary> + </indexterm> + + <refmeta> + <refentrytitle><application>pg_walsummary</application></refentrytitle> + <manvolnum>1</manvolnum> + <refmiscinfo>Application</refmiscinfo> + </refmeta> + + <refnamediv> + <refname>pg_walsummary</refname> + <refpurpose>print contents of WAL summary files</refpurpose> + </refnamediv> + + <refsynopsisdiv> + <cmdsynopsis> + <command>pg_walsummary</command> + <arg rep="repeat" choice="opt"><replaceable>option</replaceable></arg> + <arg rep="repeat"><replaceable>file</replaceable></arg> + </cmdsynopsis> + </refsynopsisdiv> + + <refsect1> + <title>Description</title> + <para> + <application>pg_walsummary</application> is used to print the contents of + WAL summary files. These binary files are found with the + <literal>pg_wal/summaries</literal> subdirectory of the data directory, + and can be converted to text using this tool. This is not ordinarily + necessary, since WAL summary files primarily exist to support + <link linkend="backup-incremental-backup">incremental backup</link>, + but it may be useful for debugging purposes. + </para> + + <para> + A WAL summary file is indexed by tablespace OID, relation OID, and relation + fork. For each relation fork, it stores the list of blocks that were + modified by WAL within the range summarized in the file. It can also + store a "limit block," which is 0 if the relation fork was created or + truncated within the relevant WAL range, and otherwise the shortest length + to which the relation fork was truncated. If the relation fork was not + created, deleted, or truncated within the relevant WAL range, the limit + block is undefined or infinite and will not be printed by this tool. + </para> + </refsect1> + + <refsect1> + <title>Options</title> + + <para> + <variablelist> + <varlistentry> + <term><option>-i</option></term> + <term><option>--indivudual</option></term> + <listitem> + <para> + By default, <literal>pg_walsummary</literal> prints one line of output + for each range of one or more consecutive modified blocks. This can + make the output a lot briefer, since a relation where all blocks from + 0 through 999 were modified will produce only one line of output rather + than 1000 separate lines. This option requests a separate line of + output for every modified block. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-q</option></term> + <term><option>--quiet</option></term> + <listitem> + <para> + Do not print any output, except for errors. This can be useful + when you want to know whether a WAL summary file can be successfully + parsed but don't care about the contents. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-?</option></term> + <term><option>--help</option></term> + <listitem> + <para> + Shows help about <application>pg_walsummary</application> command line + arguments, and exits. + </para> + </listitem> + </varlistentry> + + </variablelist> + </para> + + </refsect1> + + <refsect1> + <title>Environment</title> + + <para> + The environment variable <envar>PG_COLOR</envar> specifies whether to use + color in diagnostic messages. Possible values are + <literal>always</literal>, <literal>auto</literal> and + <literal>never</literal>. + </para> + </refsect1> + + <refsect1> + <title>See Also</title> + + <simplelist type="inline"> + <member><xref linkend="app-pgbasebackup"/></member> + <member><xref linkend="app-pgcombinebackup"/></member> + </simplelist> + </refsect1> + +</refentry> diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml index a07d2b5e01..aa94f6adf6 100644 --- a/doc/src/sgml/reference.sgml +++ b/doc/src/sgml/reference.sgml @@ -289,6 +289,7 @@ &pgtesttiming; &pgupgrade; &pgwaldump; + &pgwalsummary; &postgres; </reference> diff --git a/src/bin/Makefile b/src/bin/Makefile index 117ffdab6a..fc789da17b 100644 --- a/src/bin/Makefile +++ b/src/bin/Makefile @@ -31,6 +31,7 @@ SUBDIRS = \ pg_upgrade \ pg_verifybackup \ pg_waldump \ + pg_walsummary \ pgbench \ psql \ scripts diff --git a/src/bin/meson.build b/src/bin/meson.build index f292752c5c..aa60ebaa30 100644 --- a/src/bin/meson.build +++ b/src/bin/meson.build @@ -17,6 +17,7 @@ subdir('pg_test_timing') subdir('pg_upgrade') subdir('pg_verifybackup') subdir('pg_waldump') +subdir('pg_walsummary') subdir('pgbench') subdir('pgevent') subdir('psql') diff --git a/src/bin/pg_walsummary/.gitignore b/src/bin/pg_walsummary/.gitignore new file mode 100644 index 0000000000..d71ec192fa --- /dev/null +++ b/src/bin/pg_walsummary/.gitignore @@ -0,0 +1 @@ +pg_walsummary diff --git a/src/bin/pg_walsummary/Makefile b/src/bin/pg_walsummary/Makefile new file mode 100644 index 0000000000..2c24bc6db5 --- /dev/null +++ b/src/bin/pg_walsummary/Makefile @@ -0,0 +1,48 @@ +#------------------------------------------------------------------------- +# +# Makefile for src/bin/pg_walsummary +# +# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/bin/pg_walsummary/Makefile +# +#------------------------------------------------------------------------- + +PGFILEDESC = "pg_walsummary - print contents of WAL summary files" +PGAPPICON=win32 + +subdir = src/bin/pg_walsummary +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils + +OBJS = \ + $(WIN32RES) \ + pg_walsummary.o + +all: pg_walsummary + +pg_walsummary: $(OBJS) | submake-libpgport submake-libpgfeutils + $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + + +install: all installdirs + $(INSTALL_PROGRAM) pg_walsummary$(X) '$(DESTDIR)$(bindir)/pg_walsummary$(X)' + +installdirs: + $(MKDIR_P) '$(DESTDIR)$(bindir)' + +uninstall: + rm -f '$(DESTDIR)$(bindir)/pg_walsummary$(X)' + +clean distclean maintainer-clean: + rm -f pg_walsummary$(X) $(OBJS) + +check: + $(prove_check) + +installcheck: + $(prove_installcheck) diff --git a/src/bin/pg_walsummary/meson.build b/src/bin/pg_walsummary/meson.build new file mode 100644 index 0000000000..f886a4cb36 --- /dev/null +++ b/src/bin/pg_walsummary/meson.build @@ -0,0 +1,30 @@ +# Copyright (c) 2022-2023, PostgreSQL Global Development Group + +pg_walsummary_sources = files( + 'pg_walsummary.c', +) + +if host_system == 'windows' + pg_walsummary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'pg_walsummary', + '--FILEDESC', 'pg_walsummary - print contents of WAL summary files',]) +endif + +pg_walsummary = executable('pg_walsummary', + pg_walsummary_sources, + dependencies: [frontend_code], + kwargs: default_bin_args, +) +bin_targets += pg_walsummary + +tests += { + 'name': 'pg_walsummary', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_basic.pl', + 't/002_blocks.pl', + ], + } +} diff --git a/src/bin/pg_walsummary/nls.mk b/src/bin/pg_walsummary/nls.mk new file mode 100644 index 0000000000..f411dcfe9e --- /dev/null +++ b/src/bin/pg_walsummary/nls.mk @@ -0,0 +1,6 @@ +# src/bin/pg_combinebackup/nls.mk +CATALOG_NAME = pg_walsummary +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ + pg_walsummary.c +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) +GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_walsummary/pg_walsummary.c b/src/bin/pg_walsummary/pg_walsummary.c new file mode 100644 index 0000000000..0c0225eeb8 --- /dev/null +++ b/src/bin/pg_walsummary/pg_walsummary.c @@ -0,0 +1,280 @@ +/*------------------------------------------------------------------------- + * + * pg_walsummary.c + * Prints the contents of WAL summary files. + * + * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/bin/pg_walsummary/pg_walsummary.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include <fcntl.h> +#include <limits.h> + +#include "common/blkreftable.h" +#include "common/logging.h" +#include "fe_utils/option_utils.h" +#include "lib/stringinfo.h" +#include "getopt_long.h" + +typedef struct ws_options +{ + bool individual; + bool quiet; +} ws_options; + +typedef struct ws_file_info +{ + int fd; + char *filename; +} ws_file_info; + +static BlockNumber *block_buffer = NULL; +static unsigned block_buffer_size = 512; /* Initial size. */ + +static void dump_one_relation(ws_options *opt, RelFileLocator *rlocator, + ForkNumber forknum, BlockNumber limit_block, + BlockRefTableReader *reader); +static void help(const char *progname); +static int compare_block_numbers(const void *a, const void *b); +static int walsummary_read_callback(void *callback_arg, void *data, + int length); +static void walsummary_error_callback(void *callback_arg, char *fmt,...) pg_attribute_printf(2, 3); + +/* + * Main program. + */ +int +main(int argc, char *argv[]) +{ + static struct option long_options[] = { + {"individual", no_argument, NULL, 'i'}, + {"quiet", no_argument, NULL, 'q'}, + {NULL, 0, NULL, 0} + }; + + const char *progname; + int optindex; + int c; + ws_options opt; + + memset(&opt, 0, sizeof(ws_options)); + + pg_logging_init(argv[0]); + progname = get_progname(argv[0]); + handle_help_version_opts(argc, argv, progname, help); + + /* process command-line options */ + while ((c = getopt_long(argc, argv, "f:iqw:", + long_options, &optindex)) != -1) + { + switch (c) + { + case 'i': + opt.individual = true; + break; + case 'q': + opt.quiet = true; + break; + default: + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + } + + if (optind >= argc) + { + pg_log_error("%s: no input files specified", progname); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + while (optind < argc) + { + ws_file_info ws; + BlockRefTableReader *reader; + RelFileLocator rlocator; + ForkNumber forknum; + BlockNumber limit_block; + + ws.filename = argv[optind++]; + if ((ws.fd = open(ws.filename, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", ws.filename); + + reader = CreateBlockRefTableReader(walsummary_read_callback, &ws, + ws.filename, + walsummary_error_callback, NULL); + while (BlockRefTableReaderNextRelation(reader, &rlocator, &forknum, + &limit_block)) + dump_one_relation(&opt, &rlocator, forknum, limit_block, reader); + + DestroyBlockRefTableReader(reader); + close(ws.fd); + } + + exit(0); +} + +/* + * Dump details for one relation. + */ +static void +dump_one_relation(ws_options *opt, RelFileLocator *rlocator, + ForkNumber forknum, BlockNumber limit_block, + BlockRefTableReader *reader) +{ + unsigned i = 0; + unsigned nblocks; + BlockNumber startblock = InvalidBlockNumber; + BlockNumber endblock = InvalidBlockNumber; + + /* Dump limit block, if any. */ + if (limit_block != InvalidBlockNumber) + printf("TS %u, DB %u, REL %u, FORK %s: limit %u\n", + rlocator->spcOid, rlocator->dbOid, rlocator->relNumber, + forkNames[forknum], limit_block); + + /* If we haven't allocated a block buffer yet, do that now. */ + if (block_buffer == NULL) + block_buffer = palloc_array(BlockNumber, block_buffer_size); + + /* Try to fill the block buffer. */ + nblocks = BlockRefTableReaderGetBlocks(reader, + block_buffer, + block_buffer_size); + + /* If we filled the block buffer completely, we must enlarge it. */ + while (nblocks >= block_buffer_size) + { + unsigned new_size; + + /* Double the size, being careful about overflow. */ + new_size = block_buffer_size * 2; + if (new_size < block_buffer_size) + new_size = PG_UINT32_MAX; + block_buffer = repalloc_array(block_buffer, BlockNumber, new_size); + + /* Try to fill the newly-allocated space. */ + nblocks += + BlockRefTableReaderGetBlocks(reader, + block_buffer + block_buffer_size, + new_size - block_buffer_size); + + /* Save the new size for later calls. */ + block_buffer_size = new_size; + } + + /* If we don't need to produce any output, skip the rest of this. */ + if (opt->quiet) + return; + + /* + * Sort the returned block numbers. If the block reference table was using + * the bitmap representation for a given chunk, the block numbers in that + * chunk will already be sorted, but when the array-of-offsets + * representation is used, we can receive block numbers here out of order. + */ + qsort(block_buffer, nblocks, sizeof(BlockNumber), compare_block_numbers); + + /* Dump block references. */ + while (i < nblocks) + { + /* + * Find the next range of blocks to print, but if --individual was + * specified, then consider each block a separate range. + */ + startblock = endblock = block_buffer[i++]; + if (!opt->individual) + { + while (i < nblocks && block_buffer[i] == endblock + 1) + { + endblock++; + i++; + } + } + + /* Format this range of block numbers as a string. */ + if (startblock == endblock) + printf("TS %u, DB %u, REL %u, FORK %s: block %u\n", + rlocator->spcOid, rlocator->dbOid, rlocator->relNumber, + forkNames[forknum], startblock); + else + printf("TS %u, DB %u, REL %u, FORK %s: blocks %u..%u\n", + rlocator->spcOid, rlocator->dbOid, rlocator->relNumber, + forkNames[forknum], startblock, endblock); + } +} + +/* + * Quicksort comparator for block numbers. + */ +static int +compare_block_numbers(const void *a, const void *b) +{ + BlockNumber aa = *(BlockNumber *) a; + BlockNumber bb = *(BlockNumber *) b; + + if (aa > bb) + return 1; + else if (aa == bb) + return 0; + else + return -1; +} + +/* + * Error callback. + */ +void +walsummary_error_callback(void *callback_arg, char *fmt,...) +{ + va_list ap; + + va_start(ap, fmt); + pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, fmt, ap); + va_end(ap); + + exit(1); +} + +/* + * Read callback. + */ +int +walsummary_read_callback(void *callback_arg, void *data, int length) +{ + ws_file_info *ws = callback_arg; + int rc; + + if ((rc = read(ws->fd, data, length)) < 0) + pg_fatal("could not read file \"%s\": %m", ws->filename); + + return rc; +} + +/* + * help + * + * Prints help page for the program + * + * progname: the name of the executed program, such as "pg_walsummary" + */ +static void +help(const char *progname) +{ + printf(_("%s prints the contents of a WAL summary file.\n\n"), progname); + printf(_("Usage:\n")); + printf(_(" %s [OPTION]... FILE...\n"), progname); + printf(_("\nOptions:\n")); + printf(_(" -i, --individual list block numbers individually, not as ranges\n")); + printf(_(" -q, --quiet don't print anything, just parse the files\n")); + printf(_(" -?, --help show this help, then exit\n")); + + printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); + printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); +} diff --git a/src/bin/pg_walsummary/t/001_basic.pl b/src/bin/pg_walsummary/t/001_basic.pl new file mode 100644 index 0000000000..10a232a150 --- /dev/null +++ b/src/bin/pg_walsummary/t/001_basic.pl @@ -0,0 +1,19 @@ +# Copyright (c) 2021-2023, PostgreSQL Global Development Group + +use strict; +use warnings; +use PostgreSQL::Test::Utils; +use Test::More; + +my $tempdir = PostgreSQL::Test::Utils::tempdir; + +program_help_ok('pg_walsummary'); +program_version_ok('pg_walsummary'); +program_options_handling_ok('pg_walsummary'); + +command_fails_like( + ['pg_walsummary'], + qr/no input files specified/, + 'input files must be specified'); + +done_testing(); diff --git a/src/bin/pg_walsummary/t/002_blocks.pl b/src/bin/pg_walsummary/t/002_blocks.pl new file mode 100644 index 0000000000..170976f9e2 --- /dev/null +++ b/src/bin/pg_walsummary/t/002_blocks.pl @@ -0,0 +1,88 @@ +# Copyright (c) 2021-2023, PostgreSQL Global Development Group + +use strict; +use warnings; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Set up a new database instance. +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init(has_archiving => 1, allows_streaming => 1); +$node1->append_conf('postgresql.conf', 'summarize_wal = on'); +$node1->start; + +# See what's been summarized up until now. +my $progress = $node1->safe_psql('postgres', <<EOM); +SELECT summarized_tli, summarized_lsn FROM pg_get_wal_summarizer_state() +EOM +my ($summarized_tli, $summarized_lsn) = split(/\|/, $progress); +note("before insert, summarized TLI $summarized_tli through $summarized_lsn"); + +# Create a table and insert a few test rows into it. VACUUM FREEZE it so that +# autovacuum doesn't induce any future modifications unexpectedly. Then +# trigger a checkpoint. +$node1->safe_psql('postgres', <<EOM); +CREATE TABLE mytable (a int, b text); +INSERT INTO mytable +SELECT + g, random()::text||random()::text||random()::text||random()::text +FROM + generate_series(1, 400) g; +VACUUM FREEZE; +CHECKPOINT; +EOM + +# Wait for a new summary to show up. +$node1->poll_query_until('postgres', <<EOM); +SELECT EXISTS ( + SELECT * from pg_available_wal_summaries() + WHERE tli = $summarized_tli AND end_lsn > '$summarized_lsn' +) +EOM + +# Again check the progress of WAL summarization. +$progress = $node1->safe_psql('postgres', <<EOM); +SELECT summarized_tli, summarized_lsn FROM pg_get_wal_summarizer_state() +EOM +($summarized_tli, $summarized_lsn) = split(/\|/, $progress); +note("after insert, summarized TLI $summarized_tli through $summarized_lsn"); + +# Update a row in the first block of the table and trigger a checkpoint. +$node1->safe_psql('postgres', <<EOM); +UPDATE mytable SET b = 'abcdefghijklmnopqrstuvwxyz' WHERE a = 2; +CHECKPOINT; +EOM + +# Again wait for a new summary to show up. +$node1->poll_query_until('postgres', <<EOM); +SELECT EXISTS ( + SELECT * from pg_available_wal_summaries() + WHERE tli = $summarized_tli AND end_lsn > '$summarized_lsn' +) +EOM + +# Figure out the exact details for the new sumamry file. +my $details = $node1->safe_psql('postgres', <<EOM); +SELECT tli, start_lsn, end_lsn from pg_available_wal_summaries() + WHERE tli = $summarized_tli AND end_lsn > '$summarized_lsn' +EOM +my ($tli, $start_lsn, $end_lsn) = split(/\|/, $details); +note("examining summary for TLI $tli from $start_lsn to $end_lsn"); + +# Reconstruct the full pathname for the WAL summary file. +my $filename = sprintf "%s/pg_wal/summaries/%08s%08s%08s%08s%08s.summary", + $node1->data_dir, $tli, + split(m@/@, $start_lsn), + split(m@/@, $end_lsn); +ok(-f $filename, "WAL summary file exists"); + +# Run pg_walsummary on it. We expect block 0 to be modified, but block 1 +# to be unmodified, so the output should say block 0, not block 0..1 or +# similar. +my ($stdout, $stderr) = run_command([ 'pg_walsummary', $filename ]); +like($stdout, qr/FORK main: block 0$/m, "stdout shows block 0 modified"); +is($stderr, '', 'stderr is empty'); + +done_testing(); diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 5fd46b7bd1..f582eb59e7 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -4039,3 +4039,5 @@ cb_tablespace_mapping manifest_data manifest_writer rfile +ws_options +ws_file_info -- 2.39.3 (Apple Git-145) [application/octet-stream] v2-0003-Repair-various-defects-in-dc212340058b4e7ecfc5a7a.patch (6.3K, ../../CA+TgmoYAwqmj+xyFc1R5XsB62iR2zDiYckr8Hf2f8biJ7k1sEw@mail.gmail.com/3-v2-0003-Repair-various-defects-in-dc212340058b4e7ecfc5a7a.patch) download | inline diff: From a866596debade4226ed8480838af124f262414fd Mon Sep 17 00:00:00 2001 From: Robert Haas <[email protected]> Date: Tue, 9 Jan 2024 13:12:43 -0500 Subject: [PATCH v2 3/3] Repair various defects in dc212340058b4e7ecfc5a7a81ec50e7a207bf288. pg_combinebackup had various problems: * strncpy was used in various places where should be used instead, to avoid any possibility of the result not being \0-terminated. * scan_for_existing_tablespaces() failed to close the directory, and an error when opening the directory was reported with the wrong pathname. * write_reconstructed_file() contained some redundant and therefore dead code. * flush_manifest() didn't check the result of pg_checksum_update() as we do in other places, and misused a local pathname variable that shouldn't exist at all. In pg_basebackup, the wrong variable name was used in one place, due to a copy and paste that was not properly adjusted. In blkreftable.c, the loop incorrectly doubled chunkno instead of max_chunks. Per Coverity and subsequent code inspection by me and by Tom Lane. --- src/bin/pg_basebackup/pg_basebackup.c | 2 +- src/bin/pg_combinebackup/pg_combinebackup.c | 15 +++++++++------ src/bin/pg_combinebackup/reconstruct.c | 5 ++--- src/bin/pg_combinebackup/write_manifest.c | 10 +++++----- src/common/blkreftable.c | 2 +- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index b734cce5d4..3b3cc242e0 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -709,7 +709,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ? "pg_xlog" : "pg_wal"); - if (pg_mkdir_p(statusdir, pg_dir_create_mode) != 0 && + if (pg_mkdir_p(summarydir, pg_dir_create_mode) != 0 && errno != EEXIST) pg_fatal("could not create directory \"%s\": %m", summarydir); } diff --git a/src/bin/pg_combinebackup/pg_combinebackup.c b/src/bin/pg_combinebackup/pg_combinebackup.c index 6027e241f3..31ead7f405 100644 --- a/src/bin/pg_combinebackup/pg_combinebackup.c +++ b/src/bin/pg_combinebackup/pg_combinebackup.c @@ -773,8 +773,8 @@ process_directory_recursively(Oid tsoid, */ if (relative_path == NULL) { - strncpy(ifulldir, input_directory, MAXPGPATH); - strncpy(ofulldir, output_directory, MAXPGPATH); + strlcpy(ifulldir, input_directory, MAXPGPATH); + strlcpy(ofulldir, output_directory, MAXPGPATH); if (OidIsValid(tsoid)) snprintf(manifest_prefix, MAXPGPATH, "pg_tblspc/%u/", tsoid); else @@ -855,7 +855,7 @@ process_directory_recursively(Oid tsoid, /* Append new pathname component to relative path. */ if (relative_path == NULL) - strncpy(new_relative_path, de->d_name, MAXPGPATH); + strlcpy(new_relative_path, de->d_name, MAXPGPATH); else snprintf(new_relative_path, MAXPGPATH, "%s/%s", relative_path, de->d_name); @@ -1131,7 +1131,7 @@ scan_for_existing_tablespaces(char *pathname, cb_options *opt) pg_log_debug("scanning \"%s\"", pg_tblspc); if ((dir = opendir(pg_tblspc)) == NULL) - pg_fatal("could not open directory \"%s\": %m", pathname); + pg_fatal("could not open directory \"%s\": %m", pg_tblspc); while (errno = 0, (de = readdir(dir)) != NULL) { @@ -1203,8 +1203,8 @@ scan_for_existing_tablespaces(char *pathname, cb_options *opt) { if (strcmp(tsmap->old_dir, link_target) == 0) { - strncpy(ts->old_dir, tsmap->old_dir, MAXPGPATH); - strncpy(ts->new_dir, tsmap->new_dir, MAXPGPATH); + strlcpy(ts->old_dir, tsmap->old_dir, MAXPGPATH); + strlcpy(ts->new_dir, tsmap->new_dir, MAXPGPATH); ts->in_place = false; break; } @@ -1238,6 +1238,9 @@ scan_for_existing_tablespaces(char *pathname, cb_options *opt) tslist = ts; } + if (closedir(dir) != 0) + pg_fatal("could not close directory \"%s\": %m", pg_tblspc); + return tslist; } diff --git a/src/bin/pg_combinebackup/reconstruct.c b/src/bin/pg_combinebackup/reconstruct.c index b835ec363e..873d307902 100644 --- a/src/bin/pg_combinebackup/reconstruct.c +++ b/src/bin/pg_combinebackup/reconstruct.c @@ -577,13 +577,12 @@ write_reconstructed_file(char *input_filename, { if (current_block == start_of_range) appendStringInfo(&debug_buf, " %u:%s@" UINT64_FORMAT, - current_block, - s == NULL ? "ZERO" : s->filename, + current_block, s->filename, (uint64) offsetmap[current_block]); else appendStringInfo(&debug_buf, " %u-%u:%s@" UINT64_FORMAT, start_of_range, current_block, - s == NULL ? "ZERO" : s->filename, + s->filename, (uint64) offsetmap[current_block]); } diff --git a/src/bin/pg_combinebackup/write_manifest.c b/src/bin/pg_combinebackup/write_manifest.c index 608e84f3b4..01deb82cc9 100644 --- a/src/bin/pg_combinebackup/write_manifest.c +++ b/src/bin/pg_combinebackup/write_manifest.c @@ -241,8 +241,6 @@ escape_json(StringInfo buf, const char *str) static void flush_manifest(manifest_writer *mwriter) { - char pathname[MAXPGPATH]; - if (mwriter->fd == -1 && (mwriter->fd = open(mwriter->pathname, O_WRONLY | O_CREAT | O_EXCL | PG_BINARY, @@ -260,13 +258,15 @@ flush_manifest(manifest_writer *mwriter) pg_fatal("could not write \"%s\": %m", mwriter->pathname); else pg_fatal("could not write file \"%s\": wrote only %d of %d bytes", - pathname, (int) wb, mwriter->buf.len); + mwriter->pathname, (int) wb, mwriter->buf.len); } - if (mwriter->still_checksumming) + if (mwriter->still_checksumming && pg_checksum_update(&mwriter->manifest_ctx, (uint8 *) mwriter->buf.data, - mwriter->buf.len); + mwriter->buf.len) < 0) + pg_fatal("could not update checksum of file \"%s\"", + mwriter->pathname); resetStringInfo(&mwriter->buf); } } diff --git a/src/common/blkreftable.c b/src/common/blkreftable.c index bf0b563a38..20c80c779e 100644 --- a/src/common/blkreftable.c +++ b/src/common/blkreftable.c @@ -988,7 +988,7 @@ BlockRefTableEntryMarkBlockModified(BlockRefTableEntry *entry, */ max_chunks = Max(16, entry->nchunks); while (max_chunks < chunkno + 1) - chunkno *= 2; + max_chunks *= 2; Assert(max_chunks > chunkno); extra_chunks = max_chunks - entry->nchunks; -- 2.39.3 (Apple Git-145) [application/octet-stream] v2-0001-Add-new-function-pg_get_wal_summarizer_state.patch (8.7K, ../../CA+TgmoYAwqmj+xyFc1R5XsB62iR2zDiYckr8Hf2f8biJ7k1sEw@mail.gmail.com/4-v2-0001-Add-new-function-pg_get_wal_summarizer_state.patch) download | inline diff: From 46e4a46be8d8a53db903d815cb306c9a3dc75d14 Mon Sep 17 00:00:00 2001 From: Robert Haas <[email protected]> Date: Thu, 4 Jan 2024 13:37:41 -0500 Subject: [PATCH v2 1/3] Add new function pg_get_wal_summarizer_state(). This makes it possible to access information about the progress of WAL summarization from SQL. The previously-added functions pg_available_wal_summaries() and pg_wal_summary_contents() only examine on-disk state, but this function exposes information from the server's shared memory. XXX. Bump catversion. --- doc/src/sgml/func.sgml | 28 +++++++++++ src/backend/backup/walsummaryfuncs.c | 39 ++++++++++++++++ src/backend/postmaster/walsummarizer.c | 65 ++++++++++++++++++++++++++ src/include/catalog/pg_proc.dat | 9 ++++ src/include/postmaster/walsummarizer.h | 4 ++ 5 files changed, 145 insertions(+) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index de78d58d4b..0f7d409e60 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -26554,6 +26554,34 @@ SELECT collation for ('foo' COLLATE "de_DE"); <literal>relblocknumber</literal> will be zero. </para></entry> </row> + + <row> + <entry role="func_table_entry"><para role="func_signature"> + <indexterm> + <primary>pg_get_wal_summarizer_state</primary> + </indexterm> + <function>pg_get_wal_summarizer_state</function> () + <returnvalue>record</returnvalue> + ( <parameter>summarized_tli</parameter> <type>bigint</type>, + <parameter>summarized_lsn</parameter> <type>pg_lsn</type>, + <parameter>pending_lsn</parameter> <type>pg_lsn</type>, + <parameter>summarizer_pid</parameter> <type>int</type> ) + </para> + <para> + Returns information about the progress of the WAL summarizer. If the + WAL summarizer has never run since the instance was started, then + <literal>summarized_tli</literal> and <literal>summarized_lsn</literal> + will be <literal>0</literal> and <literal>0/0</literal> respectively; + otherwise, they will be the TLI and ending LSN of the last WAL summary + file written to disk. If the WAL summarizer is currently running, + <literal>pending_lsn</literal> will be the ending LSN of the last + record that it has consumed, which must always be greater than or + equal to <literal>summarized_lsn</literal>; if the WAL summarizer is + not running, it will be equal to <literal>summarized_lsn</literal>. + <literal>summarized_pid</literal> is the PID of the WAL summarizer + process, if it is running, and otherwise NULL. + </para></entry> + </row> </tbody> </tgroup> </table> diff --git a/src/backend/backup/walsummaryfuncs.c b/src/backend/backup/walsummaryfuncs.c index 89c660c696..f082488b33 100644 --- a/src/backend/backup/walsummaryfuncs.c +++ b/src/backend/backup/walsummaryfuncs.c @@ -16,11 +16,13 @@ #include "common/blkreftable.h" #include "funcapi.h" #include "miscadmin.h" +#include "postmaster/walsummarizer.h" #include "utils/fmgrprotos.h" #include "utils/pg_lsn.h" #define NUM_WS_ATTS 3 #define NUM_SUMMARY_ATTS 6 +#define NUM_STATE_ATTS 4 #define MAX_BLOCKS_PER_CALL 256 /* @@ -167,3 +169,40 @@ pg_wal_summary_contents(PG_FUNCTION_ARGS) return (Datum) 0; } + +/* + * Returns information about the state of the WAL summarizer process. + */ +Datum +pg_get_wal_summarizer_state(PG_FUNCTION_ARGS) +{ + Datum values[NUM_STATE_ATTS]; + bool nulls[NUM_STATE_ATTS]; + TimeLineID summarized_tli; + XLogRecPtr summarized_lsn; + XLogRecPtr pending_lsn; + int summarizer_pid; + TupleDesc tupdesc; + HeapTuple htup; + + GetWalSummarizerState(&summarized_tli, &summarized_lsn, &pending_lsn, + &summarizer_pid); + + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); + + memset(nulls, 0, sizeof(nulls)); + + values[0] = Int64GetDatum((int64) summarized_tli); + values[1] = LSNGetDatum(summarized_lsn); + values[2] = LSNGetDatum(pending_lsn); + + if (summarizer_pid < 0) + nulls[3] = true; + else + values[3] = Int32GetDatum(summarizer_pid); + + htup = heap_form_tuple(tupdesc, values, nulls); + + PG_RETURN_DATUM(HeapTupleGetDatum(htup)); +} diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c index f828cc436a..7287f07529 100644 --- a/src/backend/postmaster/walsummarizer.c +++ b/src/backend/postmaster/walsummarizer.c @@ -142,6 +142,7 @@ static XLogRecPtr redo_pointer_at_last_summary_removal = InvalidXLogRecPtr; bool summarize_wal = false; int wal_summary_keep_time = 10 * 24 * 60; +static void WalSummarizerShutdown(int code, Datum arg); static XLogRecPtr GetLatestLSN(TimeLineID *tli); static void HandleWalSummarizerInterrupts(void); static XLogRecPtr SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, @@ -245,6 +246,7 @@ WalSummarizerMain(void) pqsignal(SIGUSR2, SIG_IGN); /* not used */ /* Advertise ourselves. */ + on_shmem_exit(WalSummarizerShutdown, (Datum) 0); LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); WalSummarizerCtl->summarizer_pgprocno = MyProc->pgprocno; LWLockRelease(WALSummarizerLock); @@ -417,6 +419,57 @@ WalSummarizerMain(void) } } +/* + * Get information about the state of the WAL summarizer. + */ +void +GetWalSummarizerState(TimeLineID *summarized_tli, XLogRecPtr *summarized_lsn, + XLogRecPtr *pending_lsn, int *summarizer_pid) +{ + LWLockAcquire(WALSummarizerLock, LW_SHARED); + if (!WalSummarizerCtl->initialized) + { + /* + * If initialized is false, the rest of the structure contents are + * undefined. + */ + *summarized_tli = 0; + *summarized_lsn = InvalidXLogRecPtr; + *pending_lsn = InvalidXLogRecPtr; + *summarizer_pid = -1; + } + else + { + int summarizer_pgprocno = WalSummarizerCtl->summarizer_pgprocno; + + *summarized_tli = WalSummarizerCtl->summarized_tli; + *summarized_lsn = WalSummarizerCtl->summarized_lsn; + if (summarizer_pgprocno == INVALID_PGPROCNO) + { + /* + * If the summarizer has exited, the fact that it had processed + * beyond summarized_lsn is irrelevant now. + */ + *pending_lsn = WalSummarizerCtl->summarized_lsn; + *summarizer_pid = -1; + } + else + { + *pending_lsn = WalSummarizerCtl->pending_lsn; + + /* + * We're not fussed about inexact answers here, since they could + * become stale instantly, so we don't bother taking the lock, but + * make sure that invalid PID values are normalized to -1. + */ + *summarizer_pid = GetPGProcByNumber(summarizer_pgprocno)->pid; + if (*summarizer_pid <= 0) + *summarizer_pid = -1; + } + } + LWLockRelease(WALSummarizerLock); +} + /* * Get the oldest LSN in this server's timeline history that has not yet been * summarized. @@ -622,6 +675,18 @@ WaitForWalSummarization(XLogRecPtr lsn, long timeout, XLogRecPtr *pending_lsn) return summarized_lsn; } +/* + * On exit, update shared memory to make it clear that we're no longer + * running. + */ +static void +WalSummarizerShutdown(int code, Datum arg) +{ + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + WalSummarizerCtl->summarizer_pgprocno = INVALID_PGPROCNO; + LWLockRelease(WALSummarizerLock); +} + /* * Get the latest LSN that is eligible to be summarized, and set *tli to the * corresponding timeline. diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 7979392776..58811a6530 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -12142,5 +12142,14 @@ proargmodes => '{i,i,i,o,o,o,o,o,o}', proargnames => '{tli,start_lsn,end_lsn,relfilenode,reltablespace,reldatabase,relforknumber,relblocknumber,is_limit_block}', prosrc => 'pg_wal_summary_contents' }, +{ oid => '8438', + descr => 'WAL summarizer state', + proname => 'pg_get_wal_summarizer_state', + provolatile => 'v', proparallel => 's', + prorettype => 'record', proargtypes => '', + proallargtypes => '{int8,pg_lsn,pg_lsn,int4}', + proargmodes => '{o,o,o,o}', + proargnames => '{summarized_tli,summarized_lsn,pending_lsn,summarizer_pid}', + prosrc => 'pg_get_wal_summarizer_state' }, ] diff --git a/src/include/postmaster/walsummarizer.h b/src/include/postmaster/walsummarizer.h index 75cb1d709f..d6e61b59ac 100644 --- a/src/include/postmaster/walsummarizer.h +++ b/src/include/postmaster/walsummarizer.h @@ -23,6 +23,10 @@ extern Size WalSummarizerShmemSize(void); extern void WalSummarizerShmemInit(void); extern void WalSummarizerMain(void) pg_attribute_noreturn(); +extern void GetWalSummarizerState(TimeLineID *summarized_tli, + XLogRecPtr *summarized_lsn, + XLogRecPtr *pending_lsn, + int *summarizer_pid); extern XLogRecPtr GetOldestUnsummarizedLSN(TimeLineID *tli, bool *lsn_is_exact, bool reset_pending_lsn); -- 2.39.3 (Apple Git-145) ^ permalink raw reply [nested|flat] 22+ messages in thread
end of thread, other threads:[~2024-01-09 18:18 UTC | newest] Thread overview: 22+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2021-01-13 06:52 [PATCH] Fix misuses of RelationNeedsWAL Kyotaro Horiguchi <[email protected]> 2024-01-09 18:18 Re: cleanup patches for incremental backup Robert Haas <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox