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: v16.1.0~190^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aaebfe0abe78bf46c52ef6c4481c517353edf9ac;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 --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index c050ac9a6fb1..8e5b0e73ac2c 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -1045,7 +1045,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()) { @@ -3493,7 +3500,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 d41c60f505d9..942b88286b16 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1225,6 +1225,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; @@ -1286,7 +1287,7 @@ public: mempool::bluestore_cache_meta::unordered_map onode_map; friend struct Collection; // for split_cache() - + friend struct Onode; // for put() friend struct LruOnodeCacheShard; void _remove(const ghobject_t& oid); public: