diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 9c0f924bc00..85f9e673873 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -1622,8 +1622,10 @@ void BlueStore::SharedBlob::put() if (coll_snap != coll) { goto again; } - coll_snap->shared_blob_set.remove(this); - + if (!coll_snap->shared_blob_set.remove(this, true)) { + // race with lookup + return; + } bc._clear(coll_snap->cache); coll_snap->cache->rm_blob(); } diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 64147360b35..05324916456 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -461,15 +461,19 @@ public: sb->coll = coll; } - void remove(SharedBlob *sb) { + bool remove(SharedBlob *sb, bool verify_nref_is_zero=false) { std::lock_guard l(lock); ceph_assert(sb->get_parent() == this); + if (verify_nref_is_zero && sb->nref != 0) { + return false; + } // only remove if it still points to us auto p = sb_map.find(sb->get_sbid()); if (p != sb_map.end() && p->second == sb) { sb_map.erase(p); } + return true; } bool empty() {