diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/nbtree/nbtsort.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index e37cbac7b3c..28c1aeefabb 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -157,14 +157,22 @@ typedef struct BTShared bool brokenhotchain; /* - * This variable-sized field must come last. - * - * See _bt_parallel_estimate_shared() and table_parallelscan_estimate(). + * ParallelTableScanDescData data follows. Can't directly embed here, as + * implementations of the parallel table scan desc interface might need + * stronger alignment. */ - ParallelTableScanDescData heapdesc; } BTShared; /* + * Return pointer to a BTShared's parallel table scan. + * + * c.f. shm_toc_allocate as to why BUFFERALIGN is used, rather than just + * MAXALIGN. + */ +#define ParallelTableScanFromBTShared(shared) \ + (ParallelTableScanDesc) ((char *) (shared) + BUFFERALIGN(sizeof(BTShared))) + +/* * Status for leader in parallel index build. */ typedef struct BTLeader @@ -1317,7 +1325,8 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request) btshared->havedead = false; btshared->indtuples = 0.0; btshared->brokenhotchain = false; - table_parallelscan_initialize(btspool->heap, &btshared->heapdesc, + table_parallelscan_initialize(btspool->heap, + ParallelTableScanFromBTShared(btshared), snapshot); /* @@ -1407,7 +1416,8 @@ _bt_end_parallel(BTLeader *btleader) static Size _bt_parallel_estimate_shared(Relation heap, Snapshot snapshot) { - return add_size(offsetof(BTShared, heapdesc), + /* c.f. shm_toc_allocate as to why BUFFERALIGN is used */ + return add_size(BUFFERALIGN(sizeof(BTShared)), table_parallelscan_estimate(heap, snapshot)); } @@ -1672,7 +1682,8 @@ _bt_parallel_scan_and_sort(BTSpool *btspool, BTSpool *btspool2, /* Join parallel scan */ indexInfo = BuildIndexInfo(btspool->index); indexInfo->ii_Concurrent = btshared->isconcurrent; - scan = table_beginscan_parallel(btspool->heap, &btshared->heapdesc); + scan = table_beginscan_parallel(btspool->heap, + ParallelTableScanFromBTShared(btshared)); reltuples = IndexBuildHeapScan(btspool->heap, btspool->index, indexInfo, true, _bt_build_callback, (void *) &buildstate, scan); |