Files
scylladb/db/chained_delegating_reader.hh
Mikołaj Sielużycki 1d84a254c0 flat_mutation_reader: Split readers by file and remove unnecessary includes.
The flat_mutation_reader files were conflated and contained multiple
readers, which were not strictly necessary. Splitting optimizes both
iterative compilation times, as touching rarely used readers doesn't
recompile large chunks of codebase. Total compilation times are also
improved, as the size of flat_mutation_reader.hh and
flat_mutation_reader_v2.hh have been reduced and those files are
included by many file in the codebase.

With changes

real	29m14.051s
user	168m39.071s
sys	5m13.443s

Without changes

real	30m36.203s
user	175m43.354s
sys	5m26.376s

Closes #10194
2022-03-14 13:20:25 +02:00

101 lines
3.2 KiB
C++

/*
* Copyright 2020-present ScyllaDB
*/
/*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#pragma once
#include <seastar/core/shared_future.hh>
#include "readers/flat_mutation_reader_v2.hh"
// A reader which allows to insert a deferring operation before reading.
// All calls will first wait for a future to resolve, then forward to a given underlying reader.
class chained_delegating_reader : public flat_mutation_reader_v2::impl {
std::unique_ptr<flat_mutation_reader_v2> _underlying;
std::function<future<flat_mutation_reader_v2>()> _populate_reader;
std::function<void()> _on_destroyed;
public:
chained_delegating_reader(schema_ptr s, std::function<future<flat_mutation_reader_v2>()>&& populate, reader_permit permit, std::function<void()> on_destroyed = []{})
: impl(s, std::move(permit))
, _populate_reader(std::move(populate))
, _on_destroyed(std::move(on_destroyed))
{ }
chained_delegating_reader(chained_delegating_reader&& rd) = delete;
~chained_delegating_reader() {
_on_destroyed();
}
virtual future<> fill_buffer() override {
if (!_underlying) {
return _populate_reader().then([this] (flat_mutation_reader_v2&& rd) {
_underlying = std::make_unique<flat_mutation_reader_v2>(std::move(rd));
return fill_buffer();
});
}
if (is_buffer_full()) {
return make_ready_future<>();
}
return _underlying->fill_buffer().then([this] {
_end_of_stream = _underlying->is_end_of_stream();
_underlying->move_buffer_content_to(*this);
});
}
virtual future<> fast_forward_to(position_range pr) override {
if (!_underlying) {
return _populate_reader().then([this, pr = std::move(pr)] (flat_mutation_reader_v2&& rd) mutable {
_underlying = std::make_unique<flat_mutation_reader_v2>(std::move(rd));
return fast_forward_to(pr);
});
}
_end_of_stream = false;
forward_buffer_to(pr.start());
return _underlying->fast_forward_to(std::move(pr));
}
virtual future<> next_partition() override {
if (!_underlying) {
return make_ready_future<>();
}
clear_buffer_to_next_partition();
auto f = make_ready_future<>();
if (is_buffer_empty()) {
f = _underlying->next_partition();
}
_end_of_stream = _underlying->is_end_of_stream() && _underlying->is_buffer_empty();
return f;
}
virtual future<> fast_forward_to(const dht::partition_range& pr) override {
if (!_underlying) {
return _populate_reader().then([this, &pr] (flat_mutation_reader_v2&& rd) mutable {
_underlying = std::make_unique<flat_mutation_reader_v2>(std::move(rd));
return fast_forward_to(pr);
});
}
_end_of_stream = false;
clear_buffer();
return _underlying->fast_forward_to(pr);
}
virtual future<> close() noexcept override {
if (_underlying) {
return _underlying->close();
}
return make_ready_future<>();
}
};