From aaebfe0abe78bf46c52ef6c4481c517353edf9ac Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Wed, 2 Dec 2020 17:44:25 -0500 Subject: [PATCH] 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 --- src/os/bluestore/BlueStore.cc | 17 +++++++++++++++-- src/os/bluestore/BlueStore.h | 3 ++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index c050ac9a6fb..8e5b0e73ac2 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 d41c60f505d..942b88286b1 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: -- 2.47.3