From: Nitzan Mordechai Date: Thu, 22 May 2025 08:25:06 +0000 (+0000) Subject: objecter: request OSDMap after idle ticks X-Git-Tag: testing/wip-jcollin-testing-20250821.034803-tentacle~29^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=a869fa8c89c2ab15e45412bcc47a6d5e0ee442ab;p=ceph-ci.git objecter: request OSDMap after idle ticks If the objecter goes two ticks without receiving an OSDMap, it may fall behind on incremental updates. Call `maybe_request_osdmap()` in the tick handler whenever we detect that two consecutive ticks have elapsed without a fresh map, so we minimize the time needed to catch up on missed changes. Fixes: https://tracker.ceph.com/issues/71261 Signed-off-by: Nitzan Mordechai (cherry picked from commit 7fe1e426663567bf5a1f3e562722de78017050f9) --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index adc03ec4c71..78f7bbce5c6 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -2052,6 +2052,7 @@ void Objecter::maybe_request_map() void Objecter::_maybe_request_map() { + last_osdmap_request_time = ceph::coarse_mono_clock::now(); // rwlock is locked int flag = 0; if (_osdmap_full_flag() @@ -2238,8 +2239,20 @@ void Objecter::tick() if (found) toping.insert(s); } + if (num_homeless_ops || !toping.empty()) { _maybe_request_map(); + } else if (last_osdmap_request_time != ceph::coarse_mono_clock::time_point()) { + auto now = ceph::coarse_mono_clock::now(); + auto elapsed = now - last_osdmap_request_time; + auto stale_window = ceph::make_timespan(cct->_conf->objecter_tick_interval) * 2; + if (elapsed > stale_window) { + double elapsed_s = std::chrono::duration(elapsed).count(); + double thresh_s = std::chrono::duration(stale_window).count(); + ldout(cct, 10) << __func__ << ": osdmap stale: " << elapsed_s + << "s > " << thresh_s << "s, maybe requesting map" << dendl; + _maybe_request_map(); + } } logger->set(l_osdc_op_laggy, laggy_ops); diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 4167660c5a8..7ffdd9b5e28 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -2519,6 +2519,9 @@ public: ceph::timespan mon_timeout; ceph::timespan osd_timeout; + // last time osdmap was requested + ceph::coarse_mono_time last_osdmap_request_time; + MOSDOp *_prepare_osd_op(Op *op); void _send_op(Op *op); void _send_op_account(Op *op);