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;