mirror of
https://github.com/postgres/postgres.git
synced 2025-10-24 01:29:19 +03:00
Extend index AM API for parallel index scans.
This patch doesn't actually make any index AM parallel-aware, but it provides the necessary functions at the AM layer to do so. Rahila Syed, Amit Kapila, Robert Haas
This commit is contained in:
@@ -137,6 +137,18 @@ typedef void (*ammarkpos_function) (IndexScanDesc scan);
|
||||
/* restore marked scan position */
|
||||
typedef void (*amrestrpos_function) (IndexScanDesc scan);
|
||||
|
||||
/*
|
||||
* Callback function signatures - for parallel index scans.
|
||||
*/
|
||||
|
||||
/* estimate size of parallel scan descriptor */
|
||||
typedef Size (*amestimateparallelscan_function) (void);
|
||||
|
||||
/* prepare for parallel index scan */
|
||||
typedef void (*aminitparallelscan_function) (void *target);
|
||||
|
||||
/* (re)start parallel index scan */
|
||||
typedef void (*amparallelrescan_function) (IndexScanDesc scan);
|
||||
|
||||
/*
|
||||
* API struct for an index AM. Note this must be stored in a single palloc'd
|
||||
@@ -196,6 +208,11 @@ typedef struct IndexAmRoutine
|
||||
amendscan_function amendscan;
|
||||
ammarkpos_function ammarkpos; /* can be NULL */
|
||||
amrestrpos_function amrestrpos; /* can be NULL */
|
||||
|
||||
/* interface functions to support parallel index scans */
|
||||
amestimateparallelscan_function amestimateparallelscan; /* can be NULL */
|
||||
aminitparallelscan_function aminitparallelscan; /* can be NULL */
|
||||
amparallelrescan_function amparallelrescan; /* can be NULL */
|
||||
} IndexAmRoutine;
|
||||
|
||||
|
||||
|
||||
@@ -83,6 +83,8 @@ typedef bool (*IndexBulkDeleteCallback) (ItemPointer itemptr, void *state);
|
||||
typedef struct IndexScanDescData *IndexScanDesc;
|
||||
typedef struct SysScanDescData *SysScanDesc;
|
||||
|
||||
typedef struct ParallelIndexScanDescData *ParallelIndexScanDesc;
|
||||
|
||||
/*
|
||||
* Enumeration specifying the type of uniqueness check to perform in
|
||||
* index_insert().
|
||||
@@ -144,6 +146,13 @@ extern void index_rescan(IndexScanDesc scan,
|
||||
extern void index_endscan(IndexScanDesc scan);
|
||||
extern void index_markpos(IndexScanDesc scan);
|
||||
extern void index_restrpos(IndexScanDesc scan);
|
||||
extern Size index_parallelscan_estimate(Relation indexrel, Snapshot snapshot);
|
||||
extern void index_parallelscan_initialize(Relation heaprel, Relation indexrel,
|
||||
Snapshot snapshot, ParallelIndexScanDesc target);
|
||||
extern void index_parallelrescan(IndexScanDesc scan);
|
||||
extern IndexScanDesc index_beginscan_parallel(Relation heaprel,
|
||||
Relation indexrel, int nkeys, int norderbys,
|
||||
ParallelIndexScanDesc pscan);
|
||||
extern ItemPointer index_getnext_tid(IndexScanDesc scan,
|
||||
ScanDirection direction);
|
||||
extern HeapTuple index_fetch_heap(IndexScanDesc scan);
|
||||
|
||||
@@ -93,6 +93,7 @@ typedef struct IndexScanDescData
|
||||
ScanKey keyData; /* array of index qualifier descriptors */
|
||||
ScanKey orderByData; /* array of ordering op descriptors */
|
||||
bool xs_want_itup; /* caller requests index tuples */
|
||||
bool xs_temp_snap; /* unregister snapshot at scan end? */
|
||||
|
||||
/* signaling to index AM about killing index tuples */
|
||||
bool kill_prior_tuple; /* last-returned tuple is dead */
|
||||
@@ -126,8 +127,20 @@ typedef struct IndexScanDescData
|
||||
|
||||
/* state data for traversing HOT chains in index_getnext */
|
||||
bool xs_continue_hot; /* T if must keep walking HOT chain */
|
||||
|
||||
/* parallel index scan information, in shared memory */
|
||||
ParallelIndexScanDesc parallel_scan;
|
||||
} IndexScanDescData;
|
||||
|
||||
/* Generic structure for parallel scans */
|
||||
typedef struct ParallelIndexScanDescData
|
||||
{
|
||||
Oid ps_relid;
|
||||
Oid ps_indexid;
|
||||
Size ps_offset; /* Offset in bytes of am specific structure */
|
||||
char ps_snapshot_data[FLEXIBLE_ARRAY_MEMBER];
|
||||
} ParallelIndexScanDescData;
|
||||
|
||||
/* Struct for heap-or-index scans of system tables */
|
||||
typedef struct SysScanDescData
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user