Hello all,
While working on our internal tools that utilise replication, we
realised that a new parameter was added to the internal C function
corresponding to pg_replication_origin_session_setup.
However this parameter wasn't included in the user-facing API [1].

In 'src/backend/replication/logical/origin.c' at line 1359,
pg_replication_origin_session_setup function calls

    replorigin_session_setup(origin, 0);

where currently 0 is assigned to the acquired_by parameter of the
replorigin_session_setup.

I made this patch to the master which adds a way to control this
parameter by adding a new version of the
pg_replication_origin_session_setup function with user facing
parameters 'text int4' in place of the current 'text' while keeping
the existing variant
(ensuring backwards compatibility). Could someone take a look at it?

[1]: 
https://www.postgresql.org/docs/current/functions-admin.html#PG-REPLICATION-ORIGIN-SESSION-SETUP
---

Thanks for the help,
Doruk Yılmaz
From e78865ea41444999f1c8879be0f64928f21e43c6 Mon Sep 17 00:00:00 2001
From: Doruk <do...@mixrank.com>
Date: Mon, 12 Aug 2024 21:21:10 +0300
Subject: [PATCH] pg_replication_origin_session_setup new parameter

---
 src/backend/catalog/system_functions.sql |  2 ++
 src/backend/replication/logical/origin.c | 26 +++++++++++++++++++++++-
 src/include/catalog/pg_proc.dat          |  6 ++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql
index 623b9539b1..7dca2350dc 100644
--- a/src/backend/catalog/system_functions.sql
+++ b/src/backend/catalog/system_functions.sql
@@ -738,6 +738,8 @@ REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_reset() FROM public;
 
 REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_setup(text) FROM public;
 
+REVOKE EXECUTE ON FUNCTION pg_replication_origin_session_setup(text, integer) FROM public;
+
 REVOKE EXECUTE ON FUNCTION pg_replication_origin_xact_reset() FROM public;
 
 REVOKE EXECUTE ON FUNCTION pg_replication_origin_xact_setup(pg_lsn, timestamp with time zone) FROM public;
diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c
index 419e4814f0..208eed9e37 100644
--- a/src/backend/replication/logical/origin.c
+++ b/src/backend/replication/logical/origin.c
@@ -1347,7 +1347,7 @@ pg_replication_origin_oid(PG_FUNCTION_ARGS)
  * Setup a replication origin for this session.
  */
 Datum
-pg_replication_origin_session_setup(PG_FUNCTION_ARGS)
+pg_replication_origin_session_setup_nopid(PG_FUNCTION_ARGS)
 {
 	char	   *name;
 	RepOriginId origin;
@@ -1364,6 +1364,30 @@ pg_replication_origin_session_setup(PG_FUNCTION_ARGS)
 
 	PG_RETURN_VOID();
 }
+Datum
+pg_replication_origin_session_setup(PG_FUNCTION_ARGS)
+{
+	char	   *name;
+	RepOriginId origin;
+	int         pid;
+
+	replorigin_check_prerequisites(true, false);
+
+	name = text_to_cstring((text *) DatumGetPointer(PG_GETARG_DATUM(0)));
+	origin = replorigin_by_name(name, false);
+	if (PG_ARGISNULL(1)){
+		replorigin_session_setup(origin, 0);
+	} else {
+		pid = PG_GETARG_INT32(1);
+		replorigin_session_setup(origin, pid);
+	}
+
+	replorigin_session_origin = origin;
+
+	pfree(name);
+
+	PG_RETURN_VOID();
+}
 
 /*
  * Reset previously setup origin in this session
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 4abc6d9526..c68a0f895f 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -11949,6 +11949,12 @@
   descr => 'configure session to maintain replication progress tracking for the passed in origin',
   proname => 'pg_replication_origin_session_setup', provolatile => 'v',
   proparallel => 'u', prorettype => 'void', proargtypes => 'text',
+  prosrc => 'pg_replication_origin_session_setup_nopid' },
+
+{ oid => '6015',
+  descr => 'configure session to maintain replication progress tracking for the passed in origin',
+  proname => 'pg_replication_origin_session_setup', provolatile => 'v',
+  proparallel => 'u', prorettype => 'void', proargtypes => 'text int4',
   prosrc => 'pg_replication_origin_session_setup' },
 
 { oid => '6007', descr => 'teardown configured replication progress tracking',
-- 
2.39.2

Reply via email to