aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2024-07-31 20:56:30 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2024-07-31 20:56:30 -0400
commit41fb45a482a4643e5ed44aa66f52f1512cb57ce3 (patch)
tree87a4b9632350c0f442bd550d1dfc4fe9cee6b9b1
parent68855c03878c0c90227e24533ca40127da3578cd (diff)
downloadpostgresql-41fb45a482a4643e5ed44aa66f52f1512cb57ce3.tar.gz
postgresql-41fb45a482a4643e5ed44aa66f52f1512cb57ce3.zip
Revert "Allow parallel workers to cope with a newly-created session user ID."
This reverts commit 68855c03878c0c90227e24533ca40127da3578cd. 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.
-rw-r--r--src/backend/access/transam/parallel.c12
-rw-r--r--src/backend/commands/variable.c10
-rw-r--r--src/test/regress/expected/select_parallel.out18
-rw-r--r--src/test/regress/sql/select_parallel.sql9
4 files changed, 6 insertions, 43 deletions
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index 9c68d401430..f357804fda0 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -1367,6 +1367,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. */
@@ -1409,14 +1413,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
* current role.
diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c
index 46a2be1be62..16fa68c18c6 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 27e155e87d3..49f54d640a1 100644
--- a/src/test/regress/expected/select_parallel.out
+++ b/src/test/regress/expected/select_parallel.out
@@ -1174,21 +1174,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 35bc8bc4956..5a01a98b268 100644
--- a/src/test/regress/sql/select_parallel.sql
+++ b/src/test/regress/sql/select_parallel.sql
@@ -454,12 +454,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;