From: Jianpeng Ma Date: Thu, 16 Nov 2017 13:50:56 +0000 (+0800) Subject: os/bluestore: Re-record unclean removed-collection. X-Git-Tag: v12.2.5~97^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=291f6c91d42e462d5f803a68067dd34aaba1661f;p=ceph.git os/bluestore: Re-record unclean removed-collection. In _reap_collection, if removed-collection still has object which in flushing. Collection don't clean cache and it can't record anymore which cause can't handle in the next time. Signed-off-by: Jianpeng Ma (cherry picked from commit 196c71f4657ba19924e371e54b9d88c35448a2c5) --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 66f21c598dfd..6c4295e059ee 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6263,17 +6263,18 @@ void BlueStore::_queue_reap_collection(CollectionRef& c) void BlueStore::_reap_collections() { + list removed_colls; { std::lock_guard l(reap_lock); - removed_colls.swap(removed_collections); + if (!removed_collections.empty()) + removed_colls.swap(removed_collections); + else + return; } - bool all_reaped = true; - - for (list::iterator p = removed_colls.begin(); - p != removed_colls.end(); - ++p) { + list::iterator p = removed_colls.begin(); + while (p != removed_colls.end()) { CollectionRef c = *p; dout(10) << __func__ << " " << c << " " << c->cid << dendl; if (c->onode_map.map_any([&](OnodeRef o) { @@ -6285,15 +6286,18 @@ void BlueStore::_reap_collections() } return true; })) { - all_reaped = false; + ++p; continue; } c->onode_map.clear(); + p = removed_colls.erase(p); dout(10) << __func__ << " " << c << " " << c->cid << " done" << dendl; } - - if (all_reaped) { + if (removed_colls.empty()) { dout(10) << __func__ << " all reaped" << dendl; + } else { + std::lock_guard l(reap_lock); + removed_collections.splice(removed_collections.begin(), removed_colls); } }