PS_enum_for_cache.diff
application/octet-stream
Filename: PS_enum_for_cache.diff
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/replication/logical/logicalctl.c | 12 | 12 |
| src/include/access/xlog.h | 10 | 3 |
diff --git a/src/backend/replication/logical/logicalctl.c b/src/backend/replication/logical/logicalctl.c
index a081c7a..4eaf12a 100644
--- a/src/backend/replication/logical/logicalctl.c
+++ b/src/backend/replication/logical/logicalctl.c
@@ -63,6 +63,7 @@
#include "postgres.h"
+#include "access/xlog.h"
#include "access/xloginsert.h"
#include "catalog/pg_control.h"
#include "miscadmin.h"
@@ -107,15 +108,12 @@ static LogicalDecodingCtlData *LogicalDecodingCtl = NULL;
bool XLogLogicalInfo = false;
/*
- * A transaction local cache of XLogLogicalInfo:
- * -1: not cached yet, need to check XLogLogicalInfo.
- * 0: cached, XLogLogicalInfo is disabled.
- * 1: cached, XLogLogicalInfo is enabled.
- * The cache is set when checking XLogLogicalInfoActive() for the first time
- * in the transaction and kept until the transaction end. Once the flag value
- * is cached, this cache is used simply by casting to a boolean.
+ * A transaction local cache of XLogLogicalInfo. The cache value is set when
+ * checking XLogLogicalInfoActive() for the first time in the transaction and
+ * kept until the transaction end.
*/
-int XLogLogicalInfoXactCache = -1;
+XLogLogicalInfoXactCacheEnum
+ XLogLogicalInfoXactCache = CACHE_XLOGLOGICALINFO_UNASSIGNED;
static void update_xlog_logical_info(void);
static void abort_logical_decoding_activation(int code, Datum arg);
@@ -232,7 +230,7 @@ IsXLogLogicalInfoEnabled(void)
bool
CheckXLogLogicalInfo(void)
{
- Assert(XLogLogicalInfoXactCache == -1);
+ Assert(XLogLogicalInfoXactCache == CACHE_XLOGLOGICALINFO_UNASSIGNED);
/* Returns the current state if we're out of the transaction */
if (!IsTransactionState())
@@ -242,9 +240,11 @@ CheckXLogLogicalInfo(void)
* Cache the current state so as to return the same result within the same
* transaction.
*/
- XLogLogicalInfoXactCache = (int) XLogLogicalInfo;
+ XLogLogicalInfoXactCache = XLogLogicalInfo ?
+ CACHE_XLOGLOGICALINFO_ENABLED :
+ CACHE_XLOGLOGICALINFO_DISABLED;
- return XLogLogicalInfoXactCache;
+ return XLogLogicalInfo;
}
/*
@@ -253,7 +253,7 @@ CheckXLogLogicalInfo(void)
void
AtEOXact_LogicalCtl(void)
{
- XLogLogicalInfoXactCache = -1;
+ XLogLogicalInfoXactCache = CACHE_XLOGLOGICALINFO_UNASSIGNED;
}
/*
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index 957be89..4a7385b 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -96,8 +96,15 @@ typedef enum RecoveryState
extern PGDLLIMPORT int wal_level;
+typedef enum XLogLogicalInfoXactCacheEnum
+{
+ CACHE_XLOGLOGICALINFO_UNASSIGNED,
+ CACHE_XLOGLOGICALINFO_DISABLED,
+ CACHE_XLOGLOGICALINFO_ENABLED
+} XLogLogicalInfoXactCacheEnum;
+
extern PGDLLEXPORT bool XLogLogicalInfo;
-extern PGDLLEXPORT int XLogLogicalInfoXactCache;
+extern PGDLLEXPORT XLogLogicalInfoXactCacheEnum XLogLogicalInfoXactCache;
/* Is WAL archiving enabled (always or only while server is running normally)? */
#define XLogArchivingActive() \
@@ -139,9 +146,9 @@ extern PGDLLEXPORT int XLogLogicalInfoXactCache;
*/
#define XLogLogicalInfoActive() \
(wal_level >= WAL_LEVEL_LOGICAL || \
- (XLogLogicalInfoXactCache < 0 ? \
+ ((XLogLogicalInfoXactCache == CACHE_XLOGLOGICALINFO_UNASSIGNED) ? \
CheckXLogLogicalInfo() : \
- (bool) XLogLogicalInfoXactCache))
+ (XLogLogicalInfoXactCache == CACHE_XLOGLOGICALINFO_ENABLED)))
#ifdef WAL_DEBUG
extern PGDLLIMPORT bool XLOG_DEBUG;