From b7c5802c83e4c051a745353e79e44d43cff06c8f Mon Sep 17 00:00:00 2001 From: Michal Maslanka Date: Mon, 1 Aug 2022 11:56:09 +0200 Subject: [PATCH] r/consensus: acquire lock when waiting for gate to be closed When raft stops the last step in stop sequence is closing gate. After gate is closed all the background futures are guaranteed to be finished. However it may happen that the fiber is waiting for an `_op_lock` while gate is being closed. We need to make sure that when the `_op_lock` is acquired the `consensus` instance is still alive. Clearing and marking an oplock as broken after dispatching `gate` close makes it impossible for incoming fibers to access `consensus` after it is deleted. Signed-off-by: Michal Maslanka --- src/v/raft/consensus.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/v/raft/consensus.cc b/src/v/raft/consensus.cc index 2c97020b6c41e..0aa02026fac93 100644 --- a/src/v/raft/consensus.cc +++ b/src/v/raft/consensus.cc @@ -243,7 +243,14 @@ ss::future<> consensus::stop() { co_await _event_manager.stop(); co_await _append_requests_buffer.stop(); co_await _batcher.stop(); - co_await _bg.close(); + + auto f = _bg.close(); + /** + * acquire lock after closing the gate, this way after + */ + auto u = co_await _op_lock.get_units(); + _op_lock.broken(); + co_await std::move(f); // close writer if we have to if (unlikely(_snapshot_writer)) {