Files
scylladb/service
Avi Kivity 10e75bc363 storage_proxy: remove excess continuations around abstract_read_executor::make_requests()
abstract_read_executor::make_requests() calls make_{data,digest}_request(),
which loop over endpoints in a parallel_for_each(), then collects the
result of the parallel_for_each()es with when_all_succeed(), then
a handle_execption() (or discard_result() in related callers). The
caller of make_requests then attaches a finally() block to keep `this`
alive, and discards the remaining future.

So, a lot of continuations are generated to merge the results, all in
order to keep a reference count alive.

Remove those excess continuations by having individual make_*_request()
variants elevate the reference count themselves. They all already have
a continuation to uncorporate the result into the executor, all they need
is an extra shared_from_this() call. The parallel_for_each() loops
are converted to regular for loops.

Note even a local request that hits cache ends up with a non-ready future
due to an execution_stage for replica access, so these continuations
generate reactor tasks.

perf_simple_query reports:
  before: median 203905.19 tps ( 87.1 allocs/op,  20.1 tasks/op,   50860 insns/op)
  after:  median 214646.89 tps ( 81.1 allocs/op,  15.1 tasks/op,   48604 insns/op)
2021-06-15 10:49:57 +02:00
..