From: Adam Kupczyk Date: Wed, 2 Dec 2020 22:44:25 +0000 (-0500) Subject: os/bluestore: Purge onode when it does exist X-Git-Tag: v15.2.9~8^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b81a5ef61c72b9302327e9392f9506f430b5d1fe;p=ceph.git os/bluestore: Purge onode when it does exist Added logic for erasing onode from onode_map it is last reference and exists==false. Signed-off-by: Adam Kupczyk (cherry picked from commit aaebfe0abe78bf46c52ef6c4481c517353edf9ac) Conflicts: (trivial) src/os/bluestore/BlueStore.h --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index c6f67f95066..eb44f128dcd 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -1128,7 +1128,14 @@ struct LruOnodeCacheShard : public BlueStore::OnodeCacheShard { --num_pinned; dout(20) << __func__ << this << " " << " " << " " << o->oid << " unpinned" << dendl; } - + void _unpin_and_rm(BlueStore::Onode* o) override + { + o->pop_cache(); + ceph_assert(num_pinned); + --num_pinned; + ceph_assert(num); + --num; + } void _trim_to(uint64_t new_size) override { if (new_size >= lru.size()) { @@ -3576,7 +3583,13 @@ void BlueStore::Onode::put() { n = --nref; } if (cached && r) { - ocs->_unpin(this); + if (exists) { + ocs->_unpin(this); + } else { + ocs->_unpin_and_rm(this); + // remove will also decrement nref and delete Onode + c->onode_map._remove(oid); + } } } if (n == 0) { diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index f0536080141..30876877ab1 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1214,6 +1214,7 @@ public: PerfCounters *logger); virtual void _add(Onode* o, int level) = 0; virtual void _rm(Onode* o) = 0; + virtual void _unpin_and_rm(Onode* o) = 0; virtual void move_pinned(OnodeCacheShard *to, Onode *o) = 0; virtual void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) = 0; @@ -1274,8 +1275,8 @@ public: /// forward lookups mempool::bluestore_cache_meta::unordered_map onode_map; - friend class Collection; // for split_cache() - + friend struct Collection; // for split_cache() + friend struct Onode; // for put() friend struct LruOnodeCacheShard; void _remove(const ghobject_t& oid); public: