view_update_generator: Move abort kicking to do_abort()
When v.u.g. stops is first aborts the generation background fiber by requesting abort on the internal abort source and signalling the fiber in case it's waiting. Right now v.u.g.::stop() is defer-scheduled last in main(), so this move doesn't change much -- when stop_signal fires, it will kick the v.u.g.::do_abort() just a bit earlier, there's nothing that would happen after it before real ::stop() is called that depends on it. Signed-off-by: Pavel Emelyanov <xemul@scylladb.com>
This commit is contained in:
@@ -215,13 +215,31 @@ future<> view_update_generator::start() {
|
|||||||
return make_ready_future<>();
|
return make_ready_future<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void view_update_generator::do_abort() noexcept {
|
// The .do_abort() just kicks the v.u.g. background fiber to wrap up and it
|
||||||
}
|
// normally happens when scylla stops upon SIGINT. Doing it that early is safe,
|
||||||
|
// once the fiber is kicked, no new work can be added to it, see _as check in
|
||||||
|
// register_staging_sstable().
|
||||||
|
//
|
||||||
|
// The .stop() really stops the sharded<v.u.g.> service by waiting for the fiber
|
||||||
|
// to stop using 'this' and thus releasing any resources owned by it. It also
|
||||||
|
// calls do_abort() to handle the case when subscription didn't shoot which, in
|
||||||
|
// turn, can happen when main() throws in the middle and doesn't request abort
|
||||||
|
// via the stop-signal.
|
||||||
|
|
||||||
|
void view_update_generator::do_abort() noexcept {
|
||||||
|
if (_as.abort_requested()) {
|
||||||
|
// The below code is re-entrable, but avoid it explicitly to be
|
||||||
|
// on the safe side in case it suddenly stops being such
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
future<> view_update_generator::stop() {
|
|
||||||
_db.unplug_view_update_generator();
|
_db.unplug_view_update_generator();
|
||||||
_as.request_abort();
|
_as.request_abort();
|
||||||
_pending_sstables.signal();
|
_pending_sstables.signal();
|
||||||
|
}
|
||||||
|
|
||||||
|
future<> view_update_generator::stop() {
|
||||||
|
do_abort();
|
||||||
return std::move(_started).then([this] {
|
return std::move(_started).then([this] {
|
||||||
_registration_sem.broken();
|
_registration_sem.broken();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user