From: Sridhar Seshasayee Date: Fri, 27 May 2022 08:59:07 +0000 (+0530) Subject: mon/OSDMonitor: Ensure kvmon() is writeable before handling "osd new" cmd X-Git-Tag: v16.2.11~509^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F46691%2Fhead;p=ceph.git 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) --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 33e4db22b522..3191ed5bf18b 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();