]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: fix onode count tracking in cache.
authorIgor Fedotov <ifedotov@suse.com>
Mon, 6 Jul 2020 20:08:47 +0000 (23:08 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Mon, 24 Aug 2020 18:26:57 +0000 (21:26 +0300)
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
(cherry picked from commit 6a28e7cba2886ff1e1b32c4713ecc472622b9835)

src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index b44df72ba405627b803bb4610d66fabd3bef5dfb..8827a3f0548e72ec6009363647b861043b246a51 100644 (file)
@@ -862,8 +862,10 @@ struct LruOnodeCacheShard : public BlueStore::OnodeCacheShard {
     if (o->pop_cache()) {
       lru.erase(lru.iterator_to(*o));
     } else {
+      ceph_assert(num_pinned);
       --num_pinned;
     }
+    ceph_assert(num);
     --num;
   }
   void _pin(BlueStore::Onode* o) override
@@ -875,6 +877,7 @@ struct LruOnodeCacheShard : public BlueStore::OnodeCacheShard {
   void _unpin(BlueStore::Onode* o) override
   {
     lru.push_front(*o);
+    ceph_assert(num_pinned);
     --num_pinned;
     dout(30) << __func__ << " " << o->oid << " unpinned" << dendl;
   }
@@ -888,23 +891,36 @@ struct LruOnodeCacheShard : public BlueStore::OnodeCacheShard {
     auto p = lru.end();
     ceph_assert(p != lru.begin());
     --p;
-    while (n > 0) {
+    ceph_assert(num >= n);
+    num -= n;
+    while (n-- > 0) {
       BlueStore::Onode *o = &*p;
       dout(30) << __func__ << "  rm " << o->oid << " "
                << o->nref << " " << o->cached << " " << o->pinned << dendl;
       if (p != lru.begin()) {
         lru.erase(p--);
       } else {
+        ceph_assert(n == 0);
         lru.erase(p);
-        ceph_assert(n == 1);
-      }
-      if (!o->pop_cache()) {
-        --num_pinned;
       }
+      auto pinned = !o->pop_cache();
+      ceph_assert(!pinned);
       o->c->onode_map.remove(o->oid);
-      --n;
     }
-    num = lru.size();
+  }
+  void move_pinned(OnodeCacheShard *to, BlueStore::Onode *o) override
+  {
+    if (to == this) {
+      return;
+    }
+    ceph_assert(o->cached);
+    ceph_assert(o->pinned);
+    ceph_assert(num);
+    ceph_assert(num_pinned);
+    --num_pinned;
+    --num;
+    ++to->num_pinned;
+    ++to->num;
   }
   void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) override
   {
@@ -3750,9 +3766,13 @@ void BlueStore::Collection::split_cache(
       // ensuring that nref is always >= 2 and hence onode is pinned and 
       // physically out of cache during the transition
       OnodeRef o_pin = o;
+      ceph_assert(o->pinned);
 
       p = onode_map.onode_map.erase(p);
       dest->onode_map.onode_map[o->oid] = o;
+      if (get_onode_cache() != dest->get_onode_cache()) {
+        get_onode_cache()->move_pinned(dest->get_onode_cache(), o.get());
+      }
       o->c = dest;
 
       // move over shared blobs and buffers.  cover shared blobs from
index 0bb686a22d4374287f6e8951e0b467a160cf10d5..29bba03a7b492b260e87ce048286fd270775a9aa 100644 (file)
@@ -1226,6 +1226,7 @@ public:
       }
     }
 
+    virtual void move_pinned(OnodeCacheShard *to, Onode *o) = 0;
     virtual void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) = 0;
     bool empty() {
       return _get_num() == 0;