diff --git a/db/view/view_building_worker.cc b/db/view/view_building_worker.cc index 813707f348..3235797c12 100644 --- a/db/view/view_building_worker.cc +++ b/db/view/view_building_worker.cc @@ -143,6 +143,14 @@ dht::token_range view_building_worker::get_tablet_token_range(table_id table_id, } future<> view_building_worker::drain() { + auto drain_started = std::exchange(_drain_started, started_drain::yes); + if (drain_started == started_drain::no) { + _drain_finished = shared_future(do_drain()); + } + return _drain_finished.get_future(); +} + +future<> view_building_worker::do_drain() { if (!_as.abort_requested()) { _as.request_abort(); } diff --git a/db/view/view_building_worker.hh b/db/view/view_building_worker.hh index 66718d8c67..f420f0d882 100644 --- a/db/view/view_building_worker.hh +++ b/db/view/view_building_worker.hh @@ -177,6 +177,11 @@ private: void init_messaging_service(); future<> uninit_messaging_service(); future> work_on_tasks(raft::term_t term, std::vector ids); + + using started_drain = bool_class; + started_drain _drain_started = started_drain::no; + shared_future<> _drain_finished; + future<> do_drain(); }; }