mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-04 00:02:52 -05:00 
			
		
		
		
	Provide DSM segment to ExecXXXInitializeWorker functions.
Previously, executor nodes running in parallel worker processes didn't have access to the dsm_segment object used for parallel execution. In order to support resource management based on DSM segment lifetime, they need that. So create a ParallelWorkerContext object to hold it and pass it to all InitializeWorker functions. Author: Thomas Munro Reviewed-By: Andres Freund Discussion: https://postgr.es/m/CAEepm=2W=cOkiZxcg6qiFQP-dHUe09aqTrEMM7yJDrHMhDv_RA@mail.gmail.com
This commit is contained in:
		
							parent
							
								
									09a777447a
								
							
						
					
					
						commit
						7082e614c0
					
				@ -1122,7 +1122,7 @@ ExecParallelReportInstrumentation(PlanState *planstate,
 | 
			
		||||
 * is allocated and initialized by executor; that is, after ExecutorStart().
 | 
			
		||||
 */
 | 
			
		||||
static bool
 | 
			
		||||
ExecParallelInitializeWorker(PlanState *planstate, shm_toc *toc)
 | 
			
		||||
ExecParallelInitializeWorker(PlanState *planstate, ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	if (planstate == NULL)
 | 
			
		||||
		return false;
 | 
			
		||||
@ -1131,40 +1131,44 @@ ExecParallelInitializeWorker(PlanState *planstate, shm_toc *toc)
 | 
			
		||||
	{
 | 
			
		||||
		case T_SeqScanState:
 | 
			
		||||
			if (planstate->plan->parallel_aware)
 | 
			
		||||
				ExecSeqScanInitializeWorker((SeqScanState *) planstate, toc);
 | 
			
		||||
				ExecSeqScanInitializeWorker((SeqScanState *) planstate, pwcxt);
 | 
			
		||||
			break;
 | 
			
		||||
		case T_IndexScanState:
 | 
			
		||||
			if (planstate->plan->parallel_aware)
 | 
			
		||||
				ExecIndexScanInitializeWorker((IndexScanState *) planstate, toc);
 | 
			
		||||
				ExecIndexScanInitializeWorker((IndexScanState *) planstate,
 | 
			
		||||
											  pwcxt);
 | 
			
		||||
			break;
 | 
			
		||||
		case T_IndexOnlyScanState:
 | 
			
		||||
			if (planstate->plan->parallel_aware)
 | 
			
		||||
				ExecIndexOnlyScanInitializeWorker((IndexOnlyScanState *) planstate, toc);
 | 
			
		||||
				ExecIndexOnlyScanInitializeWorker((IndexOnlyScanState *) planstate,
 | 
			
		||||
												  pwcxt);
 | 
			
		||||
			break;
 | 
			
		||||
		case T_ForeignScanState:
 | 
			
		||||
			if (planstate->plan->parallel_aware)
 | 
			
		||||
				ExecForeignScanInitializeWorker((ForeignScanState *) planstate,
 | 
			
		||||
												toc);
 | 
			
		||||
												pwcxt);
 | 
			
		||||
			break;
 | 
			
		||||
		case T_CustomScanState:
 | 
			
		||||
			if (planstate->plan->parallel_aware)
 | 
			
		||||
				ExecCustomScanInitializeWorker((CustomScanState *) planstate,
 | 
			
		||||
											   toc);
 | 
			
		||||
											   pwcxt);
 | 
			
		||||
			break;
 | 
			
		||||
		case T_BitmapHeapScanState:
 | 
			
		||||
			if (planstate->plan->parallel_aware)
 | 
			
		||||
				ExecBitmapHeapInitializeWorker((BitmapHeapScanState *) planstate, toc);
 | 
			
		||||
				ExecBitmapHeapInitializeWorker((BitmapHeapScanState *) planstate,
 | 
			
		||||
											   pwcxt);
 | 
			
		||||
			break;
 | 
			
		||||
		case T_SortState:
 | 
			
		||||
			/* even when not parallel-aware */
 | 
			
		||||
			ExecSortInitializeWorker((SortState *) planstate, toc);
 | 
			
		||||
			ExecSortInitializeWorker((SortState *) planstate, pwcxt);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return planstate_tree_walker(planstate, ExecParallelInitializeWorker, toc);
 | 
			
		||||
	return planstate_tree_walker(planstate, ExecParallelInitializeWorker,
 | 
			
		||||
								 pwcxt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -1194,6 +1198,7 @@ ParallelQueryMain(dsm_segment *seg, shm_toc *toc)
 | 
			
		||||
	int			instrument_options = 0;
 | 
			
		||||
	void	   *area_space;
 | 
			
		||||
	dsa_area   *area;
 | 
			
		||||
	ParallelWorkerContext pwcxt;
 | 
			
		||||
 | 
			
		||||
	/* Get fixed-size state. */
 | 
			
		||||
	fpes = shm_toc_lookup(toc, PARALLEL_KEY_EXECUTOR_FIXED, false);
 | 
			
		||||
@ -1231,7 +1236,9 @@ ParallelQueryMain(dsm_segment *seg, shm_toc *toc)
 | 
			
		||||
		RestoreParamExecParams(paramexec_space, queryDesc->estate);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	ExecParallelInitializeWorker(queryDesc->planstate, toc);
 | 
			
		||||
	pwcxt.toc = toc;
 | 
			
		||||
	pwcxt.seg = seg;
 | 
			
		||||
	ExecParallelInitializeWorker(queryDesc->planstate, &pwcxt);
 | 
			
		||||
 | 
			
		||||
	/* Pass down any tuple bound */
 | 
			
		||||
	ExecSetTupleBound(fpes->tuples_needed, queryDesc->planstate);
 | 
			
		||||
 | 
			
		||||
@ -1102,12 +1102,13 @@ ExecBitmapHeapReInitializeDSM(BitmapHeapScanState *node,
 | 
			
		||||
 * ----------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ExecBitmapHeapInitializeWorker(BitmapHeapScanState *node, shm_toc *toc)
 | 
			
		||||
ExecBitmapHeapInitializeWorker(BitmapHeapScanState *node,
 | 
			
		||||
							   ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	ParallelBitmapHeapState *pstate;
 | 
			
		||||
	Snapshot	snapshot;
 | 
			
		||||
 | 
			
		||||
	pstate = shm_toc_lookup(toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	pstate = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	node->pstate = pstate;
 | 
			
		||||
 | 
			
		||||
	snapshot = RestoreSnapshot(pstate->phs_snapshot_data);
 | 
			
		||||
 | 
			
		||||
@ -210,7 +210,8 @@ ExecCustomScanReInitializeDSM(CustomScanState *node, ParallelContext *pcxt)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ExecCustomScanInitializeWorker(CustomScanState *node, shm_toc *toc)
 | 
			
		||||
ExecCustomScanInitializeWorker(CustomScanState *node,
 | 
			
		||||
							   ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	const CustomExecMethods *methods = node->methods;
 | 
			
		||||
 | 
			
		||||
@ -219,8 +220,8 @@ ExecCustomScanInitializeWorker(CustomScanState *node, shm_toc *toc)
 | 
			
		||||
		int			plan_node_id = node->ss.ps.plan->plan_node_id;
 | 
			
		||||
		void	   *coordinate;
 | 
			
		||||
 | 
			
		||||
		coordinate = shm_toc_lookup(toc, plan_node_id, false);
 | 
			
		||||
		methods->InitializeWorkerCustomScan(node, toc, coordinate);
 | 
			
		||||
		coordinate = shm_toc_lookup(pwcxt->toc, plan_node_id, false);
 | 
			
		||||
		methods->InitializeWorkerCustomScan(node, pwcxt->toc, coordinate);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -359,7 +359,8 @@ ExecForeignScanReInitializeDSM(ForeignScanState *node, ParallelContext *pcxt)
 | 
			
		||||
 * ----------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ExecForeignScanInitializeWorker(ForeignScanState *node, shm_toc *toc)
 | 
			
		||||
ExecForeignScanInitializeWorker(ForeignScanState *node,
 | 
			
		||||
								ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	FdwRoutine *fdwroutine = node->fdwroutine;
 | 
			
		||||
 | 
			
		||||
@ -368,8 +369,8 @@ ExecForeignScanInitializeWorker(ForeignScanState *node, shm_toc *toc)
 | 
			
		||||
		int			plan_node_id = node->ss.ps.plan->plan_node_id;
 | 
			
		||||
		void	   *coordinate;
 | 
			
		||||
 | 
			
		||||
		coordinate = shm_toc_lookup(toc, plan_node_id, false);
 | 
			
		||||
		fdwroutine->InitializeWorkerForeignScan(node, toc, coordinate);
 | 
			
		||||
		coordinate = shm_toc_lookup(pwcxt->toc, plan_node_id, false);
 | 
			
		||||
		fdwroutine->InitializeWorkerForeignScan(node, pwcxt->toc, coordinate);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -678,11 +678,12 @@ ExecIndexOnlyScanReInitializeDSM(IndexOnlyScanState *node,
 | 
			
		||||
 * ----------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ExecIndexOnlyScanInitializeWorker(IndexOnlyScanState *node, shm_toc *toc)
 | 
			
		||||
ExecIndexOnlyScanInitializeWorker(IndexOnlyScanState *node,
 | 
			
		||||
								  ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	ParallelIndexScanDesc piscan;
 | 
			
		||||
 | 
			
		||||
	piscan = shm_toc_lookup(toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	piscan = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	node->ioss_ScanDesc =
 | 
			
		||||
		index_beginscan_parallel(node->ss.ss_currentRelation,
 | 
			
		||||
								 node->ioss_RelationDesc,
 | 
			
		||||
 | 
			
		||||
@ -1716,11 +1716,12 @@ ExecIndexScanReInitializeDSM(IndexScanState *node,
 | 
			
		||||
 * ----------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ExecIndexScanInitializeWorker(IndexScanState *node, shm_toc *toc)
 | 
			
		||||
ExecIndexScanInitializeWorker(IndexScanState *node,
 | 
			
		||||
							  ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	ParallelIndexScanDesc piscan;
 | 
			
		||||
 | 
			
		||||
	piscan = shm_toc_lookup(toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	piscan = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	node->iss_ScanDesc =
 | 
			
		||||
		index_beginscan_parallel(node->ss.ss_currentRelation,
 | 
			
		||||
								 node->iss_RelationDesc,
 | 
			
		||||
 | 
			
		||||
@ -348,11 +348,12 @@ ExecSeqScanReInitializeDSM(SeqScanState *node,
 | 
			
		||||
 * ----------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ExecSeqScanInitializeWorker(SeqScanState *node, shm_toc *toc)
 | 
			
		||||
ExecSeqScanInitializeWorker(SeqScanState *node,
 | 
			
		||||
							ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	ParallelHeapScanDesc pscan;
 | 
			
		||||
 | 
			
		||||
	pscan = shm_toc_lookup(toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	pscan = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false);
 | 
			
		||||
	node->ss.ss_currentScanDesc =
 | 
			
		||||
		heap_beginscan_parallel(node->ss.ss_currentRelation, pscan);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -420,10 +420,10 @@ ExecSortReInitializeDSM(SortState *node, ParallelContext *pcxt)
 | 
			
		||||
 * ----------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
ExecSortInitializeWorker(SortState *node, shm_toc *toc)
 | 
			
		||||
ExecSortInitializeWorker(SortState *node, ParallelWorkerContext *pwcxt)
 | 
			
		||||
{
 | 
			
		||||
	node->shared_info =
 | 
			
		||||
		shm_toc_lookup(toc, node->ss.ps.plan->plan_node_id, true);
 | 
			
		||||
		shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, true);
 | 
			
		||||
	node->am_worker = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -45,6 +45,12 @@ typedef struct ParallelContext
 | 
			
		||||
	ParallelWorkerInfo *worker;
 | 
			
		||||
} ParallelContext;
 | 
			
		||||
 | 
			
		||||
typedef struct ParallelWorkerContext
 | 
			
		||||
{
 | 
			
		||||
	dsm_segment *seg;
 | 
			
		||||
	shm_toc    *toc;
 | 
			
		||||
} ParallelWorkerContext;
 | 
			
		||||
 | 
			
		||||
extern volatile bool ParallelMessagePending;
 | 
			
		||||
extern int	ParallelWorkerNumber;
 | 
			
		||||
extern bool InitializingParallelWorker;
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,6 @@ extern void ExecBitmapHeapInitializeDSM(BitmapHeapScanState *node,
 | 
			
		||||
extern void ExecBitmapHeapReInitializeDSM(BitmapHeapScanState *node,
 | 
			
		||||
							  ParallelContext *pcxt);
 | 
			
		||||
extern void ExecBitmapHeapInitializeWorker(BitmapHeapScanState *node,
 | 
			
		||||
							   shm_toc *toc);
 | 
			
		||||
							   ParallelWorkerContext *pwcxt);
 | 
			
		||||
 | 
			
		||||
#endif							/* NODEBITMAPHEAPSCAN_H */
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ extern void ExecCustomScanInitializeDSM(CustomScanState *node,
 | 
			
		||||
extern void ExecCustomScanReInitializeDSM(CustomScanState *node,
 | 
			
		||||
							  ParallelContext *pcxt);
 | 
			
		||||
extern void ExecCustomScanInitializeWorker(CustomScanState *node,
 | 
			
		||||
							   shm_toc *toc);
 | 
			
		||||
							   ParallelWorkerContext *pwcxt);
 | 
			
		||||
extern void ExecShutdownCustomScan(CustomScanState *node);
 | 
			
		||||
 | 
			
		||||
#endif							/* NODECUSTOM_H */
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@ extern void ExecForeignScanInitializeDSM(ForeignScanState *node,
 | 
			
		||||
extern void ExecForeignScanReInitializeDSM(ForeignScanState *node,
 | 
			
		||||
							   ParallelContext *pcxt);
 | 
			
		||||
extern void ExecForeignScanInitializeWorker(ForeignScanState *node,
 | 
			
		||||
								shm_toc *toc);
 | 
			
		||||
								ParallelWorkerContext *pwcxt);
 | 
			
		||||
extern void ExecShutdownForeignScan(ForeignScanState *node);
 | 
			
		||||
 | 
			
		||||
#endif							/* NODEFOREIGNSCAN_H */
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,6 @@ extern void ExecIndexOnlyScanInitializeDSM(IndexOnlyScanState *node,
 | 
			
		||||
extern void ExecIndexOnlyScanReInitializeDSM(IndexOnlyScanState *node,
 | 
			
		||||
								 ParallelContext *pcxt);
 | 
			
		||||
extern void ExecIndexOnlyScanInitializeWorker(IndexOnlyScanState *node,
 | 
			
		||||
								  shm_toc *toc);
 | 
			
		||||
								  ParallelWorkerContext *pwcxt);
 | 
			
		||||
 | 
			
		||||
#endif							/* NODEINDEXONLYSCAN_H */
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,8 @@ extern void ExecReScanIndexScan(IndexScanState *node);
 | 
			
		||||
extern void ExecIndexScanEstimate(IndexScanState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecIndexScanInitializeDSM(IndexScanState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecIndexScanReInitializeDSM(IndexScanState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecIndexScanInitializeWorker(IndexScanState *node, shm_toc *toc);
 | 
			
		||||
extern void ExecIndexScanInitializeWorker(IndexScanState *node,
 | 
			
		||||
							  ParallelWorkerContext *pwcxt);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * These routines are exported to share code with nodeIndexonlyscan.c and
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ extern void ExecReScanSeqScan(SeqScanState *node);
 | 
			
		||||
extern void ExecSeqScanEstimate(SeqScanState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecSeqScanInitializeDSM(SeqScanState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecSeqScanReInitializeDSM(SeqScanState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecSeqScanInitializeWorker(SeqScanState *node, shm_toc *toc);
 | 
			
		||||
extern void ExecSeqScanInitializeWorker(SeqScanState *node,
 | 
			
		||||
							ParallelWorkerContext *pwcxt);
 | 
			
		||||
 | 
			
		||||
#endif							/* NODESEQSCAN_H */
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ extern void ExecReScanSort(SortState *node);
 | 
			
		||||
extern void ExecSortEstimate(SortState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecSortInitializeDSM(SortState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecSortReInitializeDSM(SortState *node, ParallelContext *pcxt);
 | 
			
		||||
extern void ExecSortInitializeWorker(SortState *node, shm_toc *toc);
 | 
			
		||||
extern void ExecSortInitializeWorker(SortState *node, ParallelWorkerContext *pwcxt);
 | 
			
		||||
extern void ExecSortRetrieveInstrumentation(SortState *node);
 | 
			
		||||
 | 
			
		||||
#endif							/* NODESORT_H */
 | 
			
		||||
 | 
			
		||||
@ -1534,6 +1534,7 @@ ParallelHeapScanDesc
 | 
			
		||||
ParallelIndexScanDesc
 | 
			
		||||
ParallelSlot
 | 
			
		||||
ParallelState
 | 
			
		||||
ParallelWorkerContext
 | 
			
		||||
ParallelWorkerInfo
 | 
			
		||||
Param
 | 
			
		||||
ParamExecData
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user