v1-0002-Maintain-publish_no_origin-in-output-plugin-priva.patch

application/octet-stream

Filename: v1-0002-Maintain-publish_no_origin-in-output-plugin-priva.patch
Type: application/octet-stream
Part: 2
Message: Move global variables of pgoutput to plugin private scope.

Patch

Format: format-patch
Series: patch v1-0002
Subject: Maintain publish_no_origin in output plugin private data
File+
src/backend/replication/pgoutput/pgoutput.c 5 4
src/include/replication/pgoutput.h 1 0
From 507d225e148e3e1ee642b7bf4e8b326f52aa474c Mon Sep 17 00:00:00 2001
From: Hou Zhijie <houzj.fnst@cn.fujitsu.com>
Date: Fri, 25 Aug 2023 17:29:35 +0800
Subject: [PATCH v1 2/3] Maintain publish_no_origin in output plugin private
 data

The pgoutput module uses a global variable(publish_no_origin) to cache the
action for the origin filter. But we only initialize publish_no_origin when
user specifies the "origin" in the output paramters which means we could refer
to an uninitialized variable if user didn't specify the paramter.

Besides, we don't reset the flag when shutting down the output plugin, so
subsequent retries may access the previous publish_no_origin value.

To improve it, the patch stores the map within the private data of the output
plugin so that it will get initialized and reset along with the output plugin
context.
---
 src/backend/replication/pgoutput/pgoutput.c | 9 +++++----
 src/include/replication/pgoutput.h          | 1 +
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index b3d515b59f..89789c298f 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -82,7 +82,6 @@ static void pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx,
 
 static bool publications_valid;
 static bool in_streaming;
-static bool publish_no_origin;
 
 static List *LoadPublications(List *pubnames);
 static void publication_invalidation_cb(Datum arg, int cacheid,
@@ -390,9 +389,9 @@ parse_output_parameters(List *options, PGOutputData *data)
 
 			data->origin = defGetString(defel);
 			if (pg_strcasecmp(data->origin, LOGICALREP_ORIGIN_NONE) == 0)
-				publish_no_origin = true;
+				data->publish_no_origin = true;
 			else if (pg_strcasecmp(data->origin, LOGICALREP_ORIGIN_ANY) == 0)
-				publish_no_origin = false;
+				data->publish_no_origin = false;
 			else
 				ereport(ERROR,
 						errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -1675,7 +1674,9 @@ static bool
 pgoutput_origin_filter(LogicalDecodingContext *ctx,
 					   RepOriginId origin_id)
 {
-	if (publish_no_origin && origin_id != InvalidRepOriginId)
+	PGOutputData *data = (PGOutputData *) ctx->output_plugin_private;
+
+	if (data->publish_no_origin && origin_id != InvalidRepOriginId)
 		return true;
 
 	return false;
diff --git a/src/include/replication/pgoutput.h b/src/include/replication/pgoutput.h
index b4a8015403..6f39e72252 100644
--- a/src/include/replication/pgoutput.h
+++ b/src/include/replication/pgoutput.h
@@ -30,6 +30,7 @@ typedef struct PGOutputData
 	bool		messages;
 	bool		two_phase;
 	char	   *origin;
+	bool		publish_no_origin;
 } PGOutputData;
 
 #endif							/* PGOUTPUT_H */
-- 
2.30.0.windows.2