From 5c16e50d109ac8b546420f96c2c0aa752ff31ee7 Mon Sep 17 00:00:00 2001 From: Sridhar Seshasayee Date: Fri, 27 May 2022 14:29:07 +0530 Subject: [PATCH] mon/OSDMonitor: Ensure kvmon() is writeable before handling "osd new" cmd Before proceeding to handle "osd new" mon command as part of OSDMonitor::prepare_command_impl(), a check is made to verify if the authmon is writeable. Later on, prepare_command_osd_new() invokes KVMonitor::do_osd_new() to create pending dmcrypt keys and calls propose_pending(). The propose could fail (with an assertion failure) if there was a prior mon command that resulted in the kvmon invoking propose_pending(). In order to avoid such a situation, introduce a check to verify that kvmon is also writeable in OSDMonitor::prepare_command_impl(). If it is not writeable, the op is pushed into the wait_for_active context queue to be retried later. Fixes: https://tracker.ceph.com/issues/55773 Signed-off-by: Sridhar Seshasayee (cherry picked from commit 9a0d42c9fbcf64711a791edcf9cafdba57d901d7) --- src/mon/OSDMonitor.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 33e4db22b5223..3191ed5bf18bf 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -12596,6 +12596,14 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, return false; } + // make sure kvmon is writeable. + if (!mon.kvmon()->is_writeable()) { + dout(10) << __func__ << " waiting for kv mon to be writeable for " + << "osd new" << dendl; + mon.kvmon()->wait_for_writeable(op, new C_RetryMessage(this, op)); + return false; + } + map param_map; bufferlist bl = m->get_data(); -- 2.39.5