diff options
| author | Robert Haas | 2015-09-29 01:55:57 +0000 |
|---|---|---|
| committer | Robert Haas | 2015-09-29 01:55:57 +0000 |
| commit | d1b7c1ffe72e86932b5395f29e006c3f503bc53d (patch) | |
| tree | 9758eda06ae19401beef3c74373ecb076e9f9238 /src/include | |
| parent | 0557dc276f1022965f72dc8bcfc820dfd83a7dc2 (diff) | |
Parallel executor support.
This code provides infrastructure for a parallel leader to start up
parallel workers to execute subtrees of the plan tree being executed
in the master. User-supplied parameters from ParamListInfo are passed
down, but PARAM_EXEC parameters are not. Various other constructs,
such as initplans, subplans, and CTEs, are also not currently shared.
Nevertheless, there's enough here to support a basic implementation of
parallel query, and we can lift some of the current restrictions as
needed.
Amit Kapila and Robert Haas
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/executor/execParallel.h | 36 | ||||
| -rw-r--r-- | src/include/executor/instrument.h | 5 | ||||
| -rw-r--r-- | src/include/nodes/params.h | 3 | ||||
| -rw-r--r-- | src/include/nodes/plannodes.h | 1 | ||||
| -rw-r--r-- | src/include/nodes/relation.h | 2 | ||||
| -rw-r--r-- | src/include/utils/datum.h | 10 |
6 files changed, 57 insertions, 0 deletions
diff --git a/src/include/executor/execParallel.h b/src/include/executor/execParallel.h new file mode 100644 index 00000000000..4fc797ad982 --- /dev/null +++ b/src/include/executor/execParallel.h @@ -0,0 +1,36 @@ +/*-------------------------------------------------------------------- + * execParallel.h + * POSTGRES parallel execution interface + * + * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/include/executor/execParallel.h + *-------------------------------------------------------------------- + */ + +#ifndef EXECPARALLEL_H +#define EXECPARALLEL_H + +#include "access/parallel.h" +#include "nodes/execnodes.h" +#include "nodes/parsenodes.h" +#include "nodes/plannodes.h" + +typedef struct SharedExecutorInstrumentation SharedExecutorInstrumentation; + +typedef struct ParallelExecutorInfo +{ + PlanState *planstate; + ParallelContext *pcxt; + BufferUsage *buffer_usage; + SharedExecutorInstrumentation *instrumentation; + shm_mq_handle **tqueue; +} ParallelExecutorInfo; + +extern ParallelExecutorInfo *ExecInitParallelPlan(PlanState *planstate, + EState *estate, int nworkers); +extern void ExecParallelFinish(ParallelExecutorInfo *pei); + +#endif /* EXECPARALLEL_H */ diff --git a/src/include/executor/instrument.h b/src/include/executor/instrument.h index c9a2129c7ae..f28e56ce48c 100644 --- a/src/include/executor/instrument.h +++ b/src/include/executor/instrument.h @@ -66,8 +66,13 @@ typedef struct Instrumentation extern PGDLLIMPORT BufferUsage pgBufferUsage; extern Instrumentation *InstrAlloc(int n, int instrument_options); +extern void InstrInit(Instrumentation *instr, int instrument_options); extern void InstrStartNode(Instrumentation *instr); extern void InstrStopNode(Instrumentation *instr, double nTuples); extern void InstrEndLoop(Instrumentation *instr); +extern void InstrAggNode(Instrumentation *dst, Instrumentation *add); +extern void InstrStartParallelQuery(void); +extern void InstrEndParallelQuery(BufferUsage *result); +extern void InstrAccumParallelQuery(BufferUsage *result); #endif /* INSTRUMENT_H */ diff --git a/src/include/nodes/params.h b/src/include/nodes/params.h index a0f7dd0c555..83bebde69d4 100644 --- a/src/include/nodes/params.h +++ b/src/include/nodes/params.h @@ -102,5 +102,8 @@ typedef struct ParamExecData /* Functions found in src/backend/nodes/params.c */ extern ParamListInfo copyParamList(ParamListInfo from); +extern Size EstimateParamListSpace(ParamListInfo paramLI); +extern void SerializeParamList(ParamListInfo paramLI, char **start_address); +extern ParamListInfo RestoreParamList(char **start_address); #endif /* PARAMS_H */ diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index cc259f1f674..1e2d2bbaa10 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -111,6 +111,7 @@ typedef struct Plan /* * Common structural data for all Plan types. */ + int plan_node_id; /* unique across entire final plan tree */ List *targetlist; /* target list to be computed at this node */ List *qual; /* implicitly-ANDed qual conditions */ struct Plan *lefttree; /* input plan tree(s) */ diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h index 79bed3316bb..961b5d17cfb 100644 --- a/src/include/nodes/relation.h +++ b/src/include/nodes/relation.h @@ -99,6 +99,8 @@ typedef struct PlannerGlobal Index lastRowMarkId; /* highest PlanRowMark ID assigned */ + int lastPlanNodeId; /* highest plan node ID assigned */ + bool transientPlan; /* redo plan when TransactionXmin changes? */ bool hasRowSecurity; /* row security applied? */ diff --git a/src/include/utils/datum.h b/src/include/utils/datum.h index c572f790a50..e9d4be5c4ba 100644 --- a/src/include/utils/datum.h +++ b/src/include/utils/datum.h @@ -46,4 +46,14 @@ extern Datum datumTransfer(Datum value, bool typByVal, int typLen); extern bool datumIsEqual(Datum value1, Datum value2, bool typByVal, int typLen); +/* + * Serialize and restore datums so that we can transfer them to parallel + * workers. + */ +extern Size datumEstimateSpace(Datum value, bool isnull, bool typByVal, + int typLen); +extern void datumSerialize(Datum value, bool isnull, bool typByVal, + int typLen, char **start_address); +extern Datum datumRestore(char **start_address, bool *isnull); + #endif /* DATUM_H */ |
