postgrespro.git / summary / log / commit / refs
commit 90525d7b4e0fe5ebd53960cd7ef59ee11ff06516
Author: Andres Freund <andres@anarazel.de>
Date: Tue Jan 15 20:19:21 2019 +0000
Don't duplicate parallel seqscan shmem sizing logic in nbtree.
This is architecturally mildly problematic, which becomes more
pronounced with the upcoming introduction of pluggable storage.
To fix, teach heap_parallelscan_estimate() to deal with SnapshotAny
snapshots, and then use it from _bt_parallel_estimate_shared().
Author: Andres Freund
Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
src/backend/access/heap/heapam.c | 10 ++++++++--
src/backend/access/nbtree/nbtsort.c | 13 +++----------
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index f7b08ffdd1..9afbc8228d 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -1615,8 +1615,14 @@ heap_endscan(HeapScanDesc scan)
Size
heap_parallelscan_estimate(Snapshot snapshot)
{
- return add_size(offsetof(ParallelHeapScanDescData, phs_snapshot_data),
- EstimateSnapshotSpace(snapshot));
+ Size sz = offsetof(ParallelHeapScanDescData, phs_snapshot_data);
+
+ if (IsMVCCSnapshot(snapshot))
+ sz = add_size(sz, EstimateSnapshotSpace(snapshot));
+ else
+ Assert(snapshot == SnapshotAny);
+
+ return sz;
}
/* ----------------
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index 83966dc4d4..5cc3cf57e2 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -158,7 +158,7 @@ typedef struct BTShared
/*
* This variable-sized field must come last.
*
- * See _bt_parallel_estimate_shared().
+ * See _bt_parallel_estimate_shared() and heap_parallelscan_estimate().
*/
ParallelHeapScanDescData heapdesc;
} BTShared;
@@ -1405,15 +1405,8 @@ _bt_end_parallel(BTLeader *btleader)
static Size
_bt_parallel_estimate_shared(Snapshot snapshot)
{
- if (!IsMVCCSnapshot(snapshot))
- {
- Assert(snapshot == SnapshotAny);
- return sizeof(BTShared);
- }
-
- return add_size(offsetof(BTShared, heapdesc) +
- offsetof(ParallelHeapScanDescData, phs_snapshot_data),
- EstimateSnapshotSpace(snapshot));
+ return add_size(offsetof(BTShared, heapdesc),
+ heap_parallelscan_estimate(snapshot));
}
/*
[parent: 285d8e12055f]