mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Revert "Allow parallel workers to cope with a newly-created session user ID."
This reverts commit4853630537. 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 bugf5f30c22eintended 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:
		@@ -1402,6 +1402,10 @@ ParallelWorkerMain(Datum main_arg)
 | 
				
			|||||||
	libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false);
 | 
						libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false);
 | 
				
			||||||
	StartTransactionCommand();
 | 
						StartTransactionCommand();
 | 
				
			||||||
	RestoreLibraryState(libraryspace);
 | 
						RestoreLibraryState(libraryspace);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Restore GUC values from launching backend. */
 | 
				
			||||||
 | 
						gucspace = shm_toc_lookup(toc, PARALLEL_KEY_GUC, false);
 | 
				
			||||||
 | 
						RestoreGUCState(gucspace);
 | 
				
			||||||
	CommitTransactionCommand();
 | 
						CommitTransactionCommand();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Crank up a transaction state appropriate to a parallel worker. */
 | 
						/* Crank up a transaction state appropriate to a parallel worker. */
 | 
				
			||||||
@@ -1443,14 +1447,6 @@ ParallelWorkerMain(Datum main_arg)
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	InvalidateSystemCaches();
 | 
						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
 | 
						 * Restore current role id.  Skip verifying whether session user is
 | 
				
			||||||
	 * allowed to become this role and blindly restore the leader's state for
 | 
						 * allowed to become this role and blindly restore the leader's state for
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
					 * 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.
 | 
					 * 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,
 | 
					 * As in check_transaction_read_only, allow it if not inside a transaction.
 | 
				
			||||||
 * or if restoring state in a parallel worker.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
bool
 | 
					bool
 | 
				
			||||||
check_XactIsoLevel(int *newval, void **extra, GucSource source)
 | 
					check_XactIsoLevel(int *newval, void **extra, GucSource source)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int			newXactIsoLevel = *newval;
 | 
						int			newXactIsoLevel = *newval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (newXactIsoLevel != XactIsoLevel &&
 | 
						if (newXactIsoLevel != XactIsoLevel && IsTransactionState())
 | 
				
			||||||
		IsTransactionState() && !InitializingParallelWorker)
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (FirstSnapshotSet)
 | 
							if (FirstSnapshotSet)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@@ -563,10 +561,6 @@ check_XactIsoLevel(int *newval, void **extra, GucSource source)
 | 
				
			|||||||
bool
 | 
					bool
 | 
				
			||||||
check_transaction_deferrable(bool *newval, void **extra, GucSource source)
 | 
					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())
 | 
						if (IsSubTransaction())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		GUC_check_errcode(ERRCODE_ACTIVE_SQL_TRANSACTION);
 | 
							GUC_check_errcode(ERRCODE_ACTIVE_SQL_TRANSACTION);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1219,21 +1219,3 @@ SELECT 1 FROM tenk1_vw_sec
 | 
				
			|||||||
(9 rows)
 | 
					(9 rows)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rollback;
 | 
					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;
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -462,12 +462,3 @@ SELECT 1 FROM tenk1_vw_sec
 | 
				
			|||||||
  WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100;
 | 
					  WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rollback;
 | 
					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;
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user