Don't duplicate parallel seqscan shmem sizing logic in nbtree.
authorAndres Freund <andres@anarazel.de>
Tue, 15 Jan 2019 20:19:21 +0000 (12:19 -0800)
committerAndres Freund <andres@anarazel.de>
Tue, 15 Jan 2019 20:19:21 +0000 (12:19 -0800)
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
src/backend/access/nbtree/nbtsort.c

index f7b08ffdd13c82d62fd4247632e69920ffe61266..9afbc8228de18d7907570040bdf90e7f4e0749f5 100644 (file)
@@ -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;
 }
 
 /* ----------------
index 83966dc4d414fdb257a08991f63d649c8bc16b0a..5cc3cf57e22ce6bbc7299431f9ca6f10779335c7 100644 (file)
@@ -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));
 }
 
 /*