From 78e100e67d1afe4cdc33c9328065921649c2a7bc Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Sun, 29 Nov 2020 13:46:12 +0100 Subject: [PATCH] os/bluestore: Refactor pin() to get more control over its logic Got rid of OnodeCacheShard pin() and unpin() functions. Moved their validator logic right into Onode put and get functions. Signed-off-by: Adam Kupczyk (cherry picked from commit eaf1b2366aa7701b10eca4ed3e53d51909e8011b) --- src/os/bluestore/BlueStore.cc | 46 +++++++++++++++++++---------------- src/os/bluestore/BlueStore.h | 14 ----------- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 4d855529f1f6e..c6f67f95066cc 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3548,32 +3548,36 @@ BlueStore::BlobRef BlueStore::ExtentMap::split_blob( // void BlueStore::Onode::get() { if (++nref == 2) { - c->get_onode_cache()->pin(this, [&]() { - bool was_pinned = pinned; - pinned = nref >= 2; - // additional increment for newly pinned instance - bool r = !was_pinned && pinned; - if (r) { - ++nref; - } - return cached && r; - }); + OnodeCacheShard* ocs = c->get_onode_cache(); + std::lock_guard l(ocs->lock); + bool was_pinned = pinned; + pinned = nref >= 2; + // additional increment for newly pinned instance + bool r = !was_pinned && pinned; + if (r) { + ++nref; + } + if (cached && r) { + ocs->_pin(this); + } } } void BlueStore::Onode::put() { int n = --nref; if (n == 2) { - c->get_onode_cache()->unpin(this, [&]() { - bool was_pinned = pinned; - pinned = pinned && nref > 2; // intentionally use > not >= as we have - // +1 due to pinned state - bool r = was_pinned && !pinned; - // additional decrement for newly unpinned instance - if (r) { - n = --nref; - } - return cached && r; - }); + OnodeCacheShard* ocs = c->get_onode_cache(); + std::lock_guard l(ocs->lock); + bool was_pinned = pinned; + pinned = pinned && nref > 2; // intentionally use > not >= as we have + // +1 due to pinned state + bool r = was_pinned && !pinned; + // additional decrement for newly unpinned instance + if (r) { + n = --nref; + } + if (cached && r) { + ocs->_unpin(this); + } } if (n == 0) { delete this; diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 6f47428f83e6d..f0536080141b7 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1215,20 +1215,6 @@ public: virtual void _add(Onode* o, int level) = 0; virtual void _rm(Onode* o) = 0; - void pin(Onode* o, std::function validator) { - std::lock_guard l(lock); - if (validator()) { - _pin(o); - } - } - - void unpin(Onode* o, std::function validator) { - std::lock_guard l(lock); - if (validator()) { - _unpin(o); - } - } - virtual void move_pinned(OnodeCacheShard *to, Onode *o) = 0; virtual void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) = 0; bool empty() { -- 2.39.5