view_builder: consumer: flush_fragments: close reader on error

Make sure to close the reader created by flush_fragments
if an exception occurs before it's moved to `populate_views`.

Note that it is also ok to close the reader _after_ it has been
moved, in case populate_views itself throws after closing the
reader that was moved it.  For conveience flat_mutation_reader::close
supports close-after-move.

Fixes #9479

Signed-off-by: Benny Halevy <bhalevy@scylladb.com>
Message-Id: <20211024164138.1100304-1-bhalevy@scylladb.com>
This commit is contained in:
Benny Halevy
2021-10-24 19:41:38 +03:00
committed by Avi Kivity
parent 4062cd17e0
commit 5f513ed28b

View File

@@ -2013,12 +2013,14 @@ public:
auto base_schema = _step.base->schema();
auto views = with_base_info_snapshot(_views_to_build);
auto reader = make_flat_mutation_reader_from_fragments(_step.reader.schema(), _builder._permit, std::move(_fragments));
auto close_reader = defer([&reader] { reader.close().get(); });
reader.upgrade_schema(base_schema);
_step.base->populate_views(
std::move(views),
_step.current_token(),
std::move(reader),
_now).get();
close_reader.cancel();
_fragments.clear();
_fragments_memory_usage = 0;
}