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

This reverts commit 4853630537.

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.
This commit is contained in:
Tom Lane 2024-07-31 20:55:25 -04:00
parent 4853630537
commit afbf32fa1a
4 changed files with 6 additions and 43 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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;