From: Yan, Zheng Date: Tue, 17 Apr 2018 13:05:53 +0000 (+0800) Subject: mds: optimize purge queue expire pos update X-Git-Tag: v13.1.0~183^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4a38810a93444a7cd7b792eb947d4915a2e7a543;p=ceph.git mds: optimize purge queue expire pos update Fixes: http://tracker.ceph.com/issues/23755 Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/PurgeQueue.cc b/src/mds/PurgeQueue.cc index 9ba21ef61b1..e43263ccd7a 100644 --- a/src/mds/PurgeQueue.cc +++ b/src/mds/PurgeQueue.cc @@ -513,14 +513,30 @@ void PurgeQueue::_execute_item_complete( auto iter = in_flight.find(expire_to); assert(iter != in_flight.end()); if (iter == in_flight.begin()) { - // This was the lowest journal position in flight, so we can now - // safely expire the journal up to here. - dout(10) << "expiring to 0x" << std::hex << expire_to << std::dec << dendl; - journaler.set_expire_pos(expire_to); + uint64_t pos = expire_to; + if (!pending_expire.empty()) { + auto n = iter; + ++n; + if (n == in_flight.end()) { + pos = *pending_expire.rbegin(); + pending_expire.clear(); + } else { + auto p = pending_expire.begin(); + do { + if (*p >= n->first) + break; + pos = *p; + pending_expire.erase(p++); + } while (p != pending_expire.end()); + } + } + dout(10) << "expiring to 0x" << std::hex << pos << std::dec << dendl; + journaler.set_expire_pos(pos); } else { // This is completely fine, we're not supposed to purge files in // order when doing them in parallel. dout(10) << "non-sequential completion, not expiring anything" << dendl; + pending_expire.insert(expire_to); } ops_in_flight -= _calculate_ops(iter->second); diff --git a/src/mds/PurgeQueue.h b/src/mds/PurgeQueue.h index 6a13a57ee30..079f3763165 100644 --- a/src/mds/PurgeQueue.h +++ b/src/mds/PurgeQueue.h @@ -95,6 +95,8 @@ protected: // Map of Journaler offset to PurgeItem std::map in_flight; + std::set pending_expire; + // Throttled allowances uint64_t ops_in_flight;