From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 1 Aug 2024 00:55:51 +0000 (-0400)
Subject: Revert "Allow parallel workers to cope with a newly-created session user ID."
X-Git-Tag: REL_14_13~6
X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=5f851b8bd070c599e537cc8a09a237b2a42f2fbc;p=postgresql.git

Revert "Allow parallel workers to cope with a newly-created session user ID."

This reverts commit 97380d4803d1f9188a1436c6fe7ecd7db285c55c.

Some buildfarm animals are failing with "cannot change
"client_encoding" during a parallel operation".  It looks like
assign_client_encoding is unhappy at being asked to roll back a
client_encoding setting after a parallel worker encounters a
failure.  There must be more to it though: why didn't I see this
during local testing?  In any case, it's clear that moving the
RestoreGUCState() call is not as side-effect-free as I thought.
Given that the bug f5f30c22e intended to fix has gone unreported
for years, it's not something that's urgent to fix; I'm not
willing to risk messing with it further with only days to our
next release wrap.
---

diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index 7d8966cc206..8ce95ab190b 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -1402,6 +1402,10 @@ ParallelWorkerMain(Datum main_arg)
 	libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false);
 	StartTransactionCommand();
 	RestoreLibraryState(libraryspace);
+
+	/* Restore GUC values from launching backend. */
+	gucspace = shm_toc_lookup(toc, PARALLEL_KEY_GUC, false);
+	RestoreGUCState(gucspace);
 	CommitTransactionCommand();
 
 	/* Crank up a transaction state appropriate to a parallel worker. */
@@ -1443,14 +1447,6 @@ ParallelWorkerMain(Datum main_arg)
 	 */
 	InvalidateSystemCaches();
 
-	/*
-	 * Restore GUC values from launching backend.  We can't do this earlier,
-	 * because GUC check hooks that do catalog lookups need to see the same
-	 * database state as the leader.
-	 */
-	gucspace = shm_toc_lookup(toc, PARALLEL_KEY_GUC, false);
-	RestoreGUCState(gucspace);
-
 	/*
 	 * Restore current role id.  Skip verifying whether session user is
 	 * allowed to become this role and blindly restore the leader's state for
diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c
index a10ea7da0b4..0c85679420c 100644
--- a/src/backend/commands/variable.c
+++ b/src/backend/commands/variable.c
@@ -519,16 +519,14 @@ check_transaction_read_only(bool *newval, void **extra, GucSource source)
  * We allow idempotent changes at any time, but otherwise this can only be
  * changed in a toplevel transaction that has not yet taken a snapshot.
  *
- * As in check_transaction_read_only, allow it if not inside a transaction,
- * or if restoring state in a parallel worker.
+ * As in check_transaction_read_only, allow it if not inside a transaction.
  */
 bool
 check_XactIsoLevel(int *newval, void **extra, GucSource source)
 {
 	int			newXactIsoLevel = *newval;
 
-	if (newXactIsoLevel != XactIsoLevel &&
-		IsTransactionState() && !InitializingParallelWorker)
+	if (newXactIsoLevel != XactIsoLevel && IsTransactionState())
 	{
 		if (FirstSnapshotSet)
 		{
@@ -563,10 +561,6 @@ check_XactIsoLevel(int *newval, void **extra, GucSource source)
 bool
 check_transaction_deferrable(bool *newval, void **extra, GucSource source)
 {
-	/* Just accept the value when restoring state in a parallel worker */
-	if (InitializingParallelWorker)
-		return true;
-
 	if (IsSubTransaction())
 	{
 		GUC_check_errcode(ERRCODE_ACTIVE_SQL_TRANSACTION);
diff --git a/src/test/regress/expected/select_parallel.out b/src/test/regress/expected/select_parallel.out
index 3c6887fcb97..91f74fe47a3 100644
--- a/src/test/regress/expected/select_parallel.out
+++ b/src/test/regress/expected/select_parallel.out
@@ -1219,21 +1219,3 @@ SELECT 1 FROM tenk1_vw_sec
 (9 rows)
 
 rollback;
--- test that a newly-created session role propagates to workers.
-begin;
-create role regress_parallel_worker;
-set session authorization regress_parallel_worker;
-select current_setting('session_authorization');
-     current_setting     
--------------------------
- regress_parallel_worker
-(1 row)
-
-set force_parallel_mode = 1;
-select current_setting('session_authorization');
-     current_setting     
--------------------------
- regress_parallel_worker
-(1 row)
-
-rollback;
diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sql
index 11d861584ef..62fb68c7a04 100644
--- a/src/test/regress/sql/select_parallel.sql
+++ b/src/test/regress/sql/select_parallel.sql
@@ -462,12 +462,3 @@ SELECT 1 FROM tenk1_vw_sec
   WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100;
 
 rollback;
-
--- test that a newly-created session role propagates to workers.
-begin;
-create role regress_parallel_worker;
-set session authorization regress_parallel_worker;
-select current_setting('session_authorization');
-set force_parallel_mode = 1;
-select current_setting('session_authorization');
-rollback;