Once we have the reservation infrastructure available, we want to make use of it by claiming memory reservations upfront in the Prepare() phase of the query.
- Compute minimum buffer pool memory requirements for each operator, and compute the peak requirement (execution of some nodes does not overlap, so this depends on the plan shape).
- Claim those reservations for the query at start of Prepare(), so we can fail fast if the memory isn't available
- Distribute the reservations to the exec nodes.
For the initial work, we can assume conservatively that all fragments run on all daemons, so that we don't need scheduling information to compute the estimates. This may over-reserve memory in some cases, since some fragments are unpartitioned or have fewer scan ranges than daemons.