From 33c5baff66bd90c96a4ce8da4884d2c0c2b0eb35 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 31 Jul 2024 20:56:11 -0400 Subject: [PATCH] Revert "Allow parallel workers to cope with a newly-created session user ID." This reverts commit 216201027d90e99a0a2b2d2efba85dc0aac94c62. 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. --- src/backend/access/transam/parallel.c | 12 ++++-------- src/backend/commands/variable.c | 10 ++-------- src/test/regress/expected/select_parallel.out | 18 ------------------ src/test/regress/sql/select_parallel.sql | 9 --------- 4 files changed, 6 insertions(+), 43 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index ad290b8506d..95ab3722d30 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -1401,6 +1401,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. */ @@ -1442,14 +1446,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 974280dd568..7fd3ca3a423 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 d2289858038..cdbaa4a7b61 100644 --- a/src/test/regress/expected/select_parallel.out +++ b/src/test/regress/expected/select_parallel.out @@ -1221,21 +1221,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 86eb50c8c37..43adb05b7a3 100644 --- a/src/test/regress/sql/select_parallel.sql +++ b/src/test/regress/sql/select_parallel.sql @@ -464,12 +464,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;