mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Allow parallel custom and foreign scans.
This patch doesn't put the new infrastructure to use anywhere, and indeed it's not clear how it could ever be used for something like postgres_fdw which has to send an SQL query and wait for a reply, but there might be FDWs or custom scan providers that are CPU-bound, so let's give them a way to join club parallel. KaiGai Kohei, reviewed by me.
This commit is contained in:
@ -282,3 +282,65 @@ ExecReScanForeignScan(ForeignScanState *node)
|
||||
|
||||
ExecScanReScan(&node->ss);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecForeignScanEstimate
|
||||
*
|
||||
* Informs size of the parallel coordination information, if any
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecForeignScanEstimate(ForeignScanState *node, ParallelContext *pcxt)
|
||||
{
|
||||
FdwRoutine *fdwroutine = node->fdwroutine;
|
||||
|
||||
if (fdwroutine->EstimateDSMForeignScan)
|
||||
{
|
||||
node->pscan_len = fdwroutine->EstimateDSMForeignScan(node, pcxt);
|
||||
shm_toc_estimate_chunk(&pcxt->estimator, node->pscan_len);
|
||||
shm_toc_estimate_keys(&pcxt->estimator, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecForeignScanInitializeDSM
|
||||
*
|
||||
* Initialize the parallel coordination information
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecForeignScanInitializeDSM(ForeignScanState *node, ParallelContext *pcxt)
|
||||
{
|
||||
FdwRoutine *fdwroutine = node->fdwroutine;
|
||||
|
||||
if (fdwroutine->InitializeDSMForeignScan)
|
||||
{
|
||||
int plan_node_id = node->ss.ps.plan->plan_node_id;
|
||||
void *coordinate;
|
||||
|
||||
coordinate = shm_toc_allocate(pcxt->toc, node->pscan_len);
|
||||
fdwroutine->InitializeDSMForeignScan(node, pcxt, coordinate);
|
||||
shm_toc_insert(pcxt->toc, plan_node_id, coordinate);
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecForeignScanInitializeDSM
|
||||
*
|
||||
* Initialization according to the parallel coordination information
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecForeignScanInitializeWorker(ForeignScanState *node, shm_toc *toc)
|
||||
{
|
||||
FdwRoutine *fdwroutine = node->fdwroutine;
|
||||
|
||||
if (fdwroutine->InitializeWorkerForeignScan)
|
||||
{
|
||||
int plan_node_id = node->ss.ps.plan->plan_node_id;
|
||||
void *coordinate;
|
||||
|
||||
coordinate = shm_toc_lookup(toc, plan_node_id);
|
||||
fdwroutine->InitializeWorkerForeignScan(node, toc, coordinate);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user