]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: object map lifespan now controlled by state machines
authorJason Dillaman <dillaman@redhat.com>
Tue, 8 Dec 2015 19:37:09 +0000 (14:37 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 15 Dec 2015 01:31:31 +0000 (20:31 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
18 files changed:
src/librbd/AioObjectRequest.cc
src/librbd/CopyupRequest.cc
src/librbd/DiffIterate.cc
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/LibrbdWriteback.cc
src/librbd/ObjectMap.cc
src/librbd/ObjectMap.h
src/librbd/exclusive_lock/ReleaseRequest.cc
src/librbd/exclusive_lock/ReleaseRequest.h
src/librbd/image/SetSnapRequest.cc
src/librbd/internal.cc
src/librbd/operation/RebuildObjectMapRequest.cc
src/librbd/operation/ResizeRequest.cc
src/librbd/operation/SnapshotCreateRequest.cc
src/librbd/operation/SnapshotRemoveRequest.cc
src/librbd/operation/SnapshotRollbackRequest.cc
src/librbd/operation/TrimRequest.cc

index d0805fbfdb523e03e18f76455b2f82b125d651e4..67f9fe3c349d5942a17c05e202317accafe0cdf7 100644 (file)
@@ -7,15 +7,15 @@
 #include "common/Mutex.h"
 #include "common/RWLock.h"
 
+#include "librbd/AioObjectRequest.h"
 #include "librbd/AioCompletion.h"
 #include "librbd/AioImageRequest.h"
+#include "librbd/CopyupRequest.h"
 #include "librbd/ExclusiveLock.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/ImageWatcher.h"
 #include "librbd/internal.h"
-
-#include "librbd/AioObjectRequest.h"
-#include "librbd/CopyupRequest.h"
+#include "librbd/ObjectMap.h"
 #include "librbd/Utils.h"
 
 #include <boost/bind.hpp>
@@ -206,7 +206,13 @@ namespace librbd {
                            << m_object_off << "~" << m_object_len << dendl;
 
     // send read request to parent if the object doesn't exist locally
-    if (!m_ictx->object_map.object_may_exist(m_object_no)) {
+    bool non_existent = false;
+    {
+      RWLock::RLocker snap_locker(m_ictx->snap_lock);
+      non_existent = (m_ictx->object_map != nullptr &&
+                      !m_ictx->object_map->object_may_exist(m_object_no));
+    }
+    if (non_existent) {
       complete(-ENOENT);
       return;
     }
@@ -380,16 +386,18 @@ namespace librbd {
   void AbstractAioObjectWrite::send_pre() {
     assert(m_ictx->owner_lock.is_locked());
 
-    m_object_exist = m_ictx->object_map.object_may_exist(m_object_no);
     bool write = false;
     {
       RWLock::RLocker snap_lock(m_ictx->snap_lock);
-      if (!m_ictx->object_map.enabled()) {
+      if (m_ictx->object_map == nullptr) {
+        m_object_exist = true;
         write = true;
       } else {
         // should have been flushed prior to releasing lock
         assert(m_ictx->exclusive_lock->is_lock_owner());
 
+        m_object_exist = m_ictx->object_map->object_may_exist(m_object_no);
+
         ldout(m_ictx->cct, 20) << "send_pre " << this << " " << m_oid << " "
                               << m_object_off << "~" << m_object_len << dendl;
         m_state = LIBRBD_AIO_WRITE_PRE;
@@ -399,10 +407,10 @@ namespace librbd {
         pre_object_map_update(&new_state);
 
         RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
-        if (m_ictx->object_map[m_object_no] != new_state) {
+        if ((*m_ictx->object_map)[m_object_no] != new_state) {
           Context *ctx = util::create_context_callback<AioObjectRequest>(this);
-          bool updated = m_ictx->object_map.aio_update(m_object_no, new_state,
-                                                       current_state, ctx);
+          bool updated = m_ictx->object_map->aio_update(m_object_no, new_state,
+                                                        current_state, ctx);
           assert(updated);
         } else {
           write = true;
@@ -420,7 +428,7 @@ namespace librbd {
   bool AbstractAioObjectWrite::send_post() {
     RWLock::RLocker owner_locker(m_ictx->owner_lock);
     RWLock::RLocker snap_locker(m_ictx->snap_lock);
-    if (!m_ictx->object_map.enabled() || !post_object_map_update()) {
+    if (m_ictx->object_map == nullptr || !post_object_map_update()) {
       return true;
     }
 
@@ -432,16 +440,16 @@ namespace librbd {
     m_state = LIBRBD_AIO_WRITE_POST;
 
     RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
-    uint8_t current_state = m_ictx->object_map[m_object_no];
+    uint8_t current_state = (*m_ictx->object_map)[m_object_no];
     if (current_state != OBJECT_PENDING ||
         current_state == OBJECT_NONEXISTENT) {
       return true;
     }
 
     Context *ctx = util::create_context_callback<AioObjectRequest>(this);
-    bool updated = m_ictx->object_map.aio_update(m_object_no,
-                                                 OBJECT_NONEXISTENT,
-                                                OBJECT_PENDING, ctx);
+    bool updated = m_ictx->object_map->aio_update(m_object_no,
+                                                  OBJECT_NONEXISTENT,
+                                                 OBJECT_PENDING, ctx);
     assert(updated);
     return false;
   }
@@ -519,8 +527,13 @@ namespace librbd {
   }
 
   void AioObjectWrite::add_write_ops(librados::ObjectWriteOperation *wr) {
-    if (m_ictx->enable_alloc_hint && !m_ictx->object_map.object_may_exist(m_object_no))
+    RWLock::RLocker snap_locker(m_ictx->snap_lock);
+    if (m_ictx->enable_alloc_hint &&
+        (m_ictx->object_map == nullptr ||
+         !m_ictx->object_map->object_may_exist(m_object_no))) {
       wr->set_alloc_hint(m_ictx->get_object_size(), m_ictx->get_object_size());
+    }
+
     if (m_object_off == 0 && m_object_len == m_ictx->get_object_size()) {
       wr->write_full(m_write_data);
     } else {
index 736b1d51c0a3a7a9d3bbb20f493718241c6f292d..9adf3383ef0cbaf53cb3ff9f61ebcc8478f76e01 100644 (file)
@@ -47,9 +47,10 @@ public:
       RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
       RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
       assert(m_image_ctx.exclusive_lock->is_lock_owner());
-      bool sent = m_image_ctx.object_map.aio_update(m_object_no, OBJECT_EXISTS,
-                                                    boost::optional<uint8_t>(),
-                                                    this);
+      assert(m_image_ctx.object_map != nullptr);
+      bool sent = m_image_ctx.object_map->aio_update(m_object_no, OBJECT_EXISTS,
+                                                     boost::optional<uint8_t>(),
+                                                     this);
       return (sent ? 0 : 1);
     }
 
@@ -61,8 +62,12 @@ public:
 
     RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
     RWLock::RLocker object_map_locker(m_image_ctx.object_map_lock);
-    m_image_ctx.object_map.aio_update(snap_id, m_object_no, m_object_no + 1,
-                                      state, boost::optional<uint8_t>(), this);
+    if (m_image_ctx.object_map == nullptr) {
+      return 1;
+    }
+
+    m_image_ctx.object_map->aio_update(snap_id, m_object_no, m_object_no + 1,
+                                       state, boost::optional<uint8_t>(), this);
     return 0;
   }
 
@@ -270,7 +275,7 @@ private:
     {
       RWLock::RLocker owner_locker(m_ictx->owner_lock);
       RWLock::RLocker snap_locker(m_ictx->snap_lock);
-      if (m_ictx->object_map.enabled()) {
+      if (m_ictx->object_map != nullptr) {
         bool copy_on_read = m_pending_requests.empty();
         if (!m_ictx->exclusive_lock->is_lock_owner()) {
           ldout(m_ictx->cct, 20) << "exclusive lock not held for copyup request"
@@ -280,7 +285,8 @@ private:
         }
 
         RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
-        if (copy_on_read && m_ictx->object_map[m_object_no] != OBJECT_EXISTS) {
+        if (copy_on_read &&
+            (*m_ictx->object_map)[m_object_no] != OBJECT_EXISTS) {
           // CoW already updates the HEAD object map
           m_snap_ids.push_back(CEPH_NOSNAP);
         }
index 8982764ffc37d8252128d6e4232d95819c99de9c..9e4bc17fe08ab2fe29968668dad0e5975cf9859f 100644 (file)
@@ -4,6 +4,7 @@
 #include "librbd/DiffIterate.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/internal.h"
+#include "librbd/ObjectMap.h"
 #include "librbd/Utils.h"
 #include "include/rados/librados.hpp"
 #include "include/interval_set.h"
index 959f8977609cd653c751dda25f9f431846589301..06afdcf68bbc2df8033afd461d651d070a4d5dd0 100644 (file)
@@ -165,7 +165,7 @@ struct C_InvalidateCache : public Context {
       readahead(),
       total_bytes_read(0), copyup_finisher(NULL),
       exclusive_lock(nullptr),
-      object_map(*this), object_map_ptr(nullptr), aio_work_queue(NULL), op_work_queue(NULL),
+      object_map(nullptr), aio_work_queue(NULL), op_work_queue(NULL),
       refresh_in_progress(false), asok_hook(new LibrbdAdminSocketHook(this))
   {
     md_ctx.dup(p);
@@ -483,7 +483,6 @@ struct C_InvalidateCache : public Context {
       snap_name = in_snap_name;
       snap_exists = true;
       data_ctx.snap_set_read(snap_id);
-      object_map.refresh(in_snap_id);
       return 0;
     }
     return -ENOENT;
@@ -496,7 +495,6 @@ struct C_InvalidateCache : public Context {
     snap_name = "";
     snap_exists = true;
     data_ctx.snap_set_read(snap_id);
-    object_map.refresh(CEPH_NOSNAP);
   }
 
   snap_t ImageCtx::get_snap_id(string in_snap_name) const
index dad549148147d56c57f28fd47f71aac9d0240091..a7534ebc768c093e95d6d6fe786a67fa592e6215 100644 (file)
@@ -29,7 +29,6 @@
 #include "cls/rbd/cls_rbd_client.h"
 #include "librbd/AsyncRequest.h"
 #include "librbd/LibrbdWriteback.h"
-#include "librbd/ObjectMap.h"
 #include "librbd/SnapInfo.h"
 #include "librbd/parent_types.h"
 
@@ -49,6 +48,7 @@ namespace librbd {
   class ImageWatcher;
   class Journal;
   class LibrbdAdminSocketHook;
+  class ObjectMap;
 
   namespace operation {
   template <typename> class ResizeRequest;
@@ -99,7 +99,8 @@ namespace librbd {
                    // lock_tag
                    // lockers
     Mutex cache_lock; // used as client_lock for the ObjectCacher
-    RWLock snap_lock; // protects snapshot-related member variables, features, and flags
+    RWLock snap_lock; // protects snapshot-related member variables,
+                      // features (and associated helper classes), and flags
     RWLock parent_lock; // protects parent_md and parent
     Mutex refresh_lock; // protects refresh_seq and last_refresh
     RWLock object_map_lock; // protects object map updates and object_map itself
@@ -140,8 +141,7 @@ namespace librbd {
 
     ExclusiveLock<ImageCtx> *exclusive_lock;
 
-    ObjectMap object_map;         // TODO
-    ObjectMap *object_map_ptr;
+    ObjectMap *object_map;
 
     atomic_t async_request_seq;
 
index 1147c36c1cc64831b266c3ad7cd3fd6b95bc7ba2..85fc513f97852247227809861721f8e5e8b2d3bc 100644 (file)
@@ -189,7 +189,9 @@ namespace librbd {
                                      &m_lock);
 
     {
-      if (!m_ictx->object_map.object_may_exist(object_no)) {
+      RWLock::RLocker snap_locker(m_ictx->snap_lock);
+      if (m_ictx->object_map != nullptr &&
+          !m_ictx->object_map->object_may_exist(object_no)) {
        m_finisher->queue(req, -ENOENT);
        return;
       }
index 9499dc10c64a3850247a2d709989f634f1e7cf52..c023398158b916de0b732bde42c9cca69d4c803c 100644 (file)
@@ -45,7 +45,7 @@ struct C_ApplyRefresh : public Context {
 } // anonymous namespace
 
 ObjectMap::ObjectMap(ImageCtx &image_ctx)
-  : m_image_ctx(image_ctx), m_snap_id(CEPH_NOSNAP), m_enabled(false)
+  : m_image_ctx(image_ctx), m_snap_id(CEPH_NOSNAP)
 {
 }
 
@@ -79,30 +79,12 @@ uint8_t ObjectMap::operator[](uint64_t object_no) const
   return m_object_map[object_no];
 }
 
-bool ObjectMap::enabled() const
-{
-  RWLock::RLocker l(m_image_ctx.object_map_lock);
-  return m_enabled;
-}
-
-bool ObjectMap::enabled(const RWLock &object_map_lock) const {
-  assert(m_image_ctx.object_map_lock.is_locked());
-  return m_enabled;
-}
-
 int ObjectMap::lock()
 {
   if (!m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP)) {
     return 0;
   }
 
-  {
-    RWLock::RLocker l(m_image_ctx.object_map_lock);
-    if (!m_enabled) {
-      return 0;
-    }
-  }
-
   bool broke_lock = false;
   CephContext *cct = m_image_ctx.cct;
   std::string oid(object_map_name(m_image_ctx.id, CEPH_NOSNAP));
@@ -196,9 +178,6 @@ bool ObjectMap::object_may_exist(uint64_t object_no) const
   }
 
   RWLock::RLocker l(m_image_ctx.object_map_lock);
-  if (!m_enabled) {
-    return true;
-  }
   uint8_t state = (*this)[object_no];
   bool exists = (state != OBJECT_NONEXISTENT);
   ldout(m_image_ctx.cct, 20) << &m_image_ctx << " object_may_exist: "
@@ -213,14 +192,6 @@ void ObjectMap::refresh(uint64_t snap_id)
   RWLock::WLocker l(m_image_ctx.object_map_lock);
   m_snap_id = snap_id;
 
-  if ((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) == 0 ||
-      (m_image_ctx.snap_id == snap_id && !m_image_ctx.snap_exists)) {
-    m_object_map.clear();
-    m_enabled = false;
-    return;
-  }
-  m_enabled = true;
-
   CephContext *cct = m_image_ctx.cct;
   std::string oid(object_map_name(m_image_ctx.id, snap_id));
   ldout(cct, 10) << &m_image_ctx << " refreshing object map: "
@@ -297,7 +268,6 @@ Context* ObjectMap::refresh(uint64_t snap_id, Context *on_finish) {
 void ObjectMap::rollback(uint64_t snap_id, Context *on_finish) {
   assert(m_image_ctx.snap_lock.is_locked());
   assert(m_image_ctx.object_map_lock.is_wlocked());
-  assert(m_enabled);
 
   object_map::SnapshotRollbackRequest *req =
     new object_map::SnapshotRollbackRequest(m_image_ctx, snap_id, on_finish);
index 219d352d035ae7654f71ee669c709a5af889e8ae..39de022c02f57fc955b4ba382ee5e7c8f129d544 100644 (file)
@@ -60,14 +60,10 @@ public:
   void snapshot_add(uint64_t snap_id, Context *on_finish);
   void snapshot_remove(uint64_t snap_id, Context *on_finish);
 
-  bool enabled() const;
-  bool enabled(const RWLock &object_map_lock) const;
-
 private:
   ImageCtx &m_image_ctx;
   ceph::BitVector<2> m_object_map;
   uint64_t m_snap_id;
-  bool m_enabled;
 
   void invalidate(uint64_t snap_id, bool force);
 };
index af0cb5dddd01c56674d849dd7c93c16196bef380..fbf325490fed221c0db485fce05b5021e84d9e01 100644 (file)
@@ -108,7 +108,7 @@ template <typename I>
 void ReleaseRequest<I>::send_unlock_object_map() {
   {
     RWLock::WLocker snap_locker(m_image_ctx.snap_lock);
-    std::swap(m_object_map, m_image_ctx.object_map_ptr);
+    std::swap(m_object_map, m_image_ctx.object_map);
   }
 
   if (m_object_map == nullptr) {
index 2523181927d05eab5f409a6cf401c1d44294a32d..a7946f52a7a5d3bd9fda00eca8780836f5e48fff 100644 (file)
@@ -56,7 +56,7 @@ private:
   std::string m_cookie;
   Context *m_on_finish;
 
-  decltype(m_image_ctx.object_map_ptr) m_object_map;
+  decltype(m_image_ctx.object_map) m_object_map;
   decltype(m_image_ctx.journal) m_journal;
 
   void send_cancel_op_requests();
index d88545e854fe1aca95a87c1930b306ee1d329fdb..89b56739a3586b30b14ad3924197e0ec55f9e0ad 100644 (file)
@@ -326,7 +326,7 @@ int SetSnapRequest<I>::apply() {
   }
 
   std::swap(m_exclusive_lock, m_image_ctx.exclusive_lock);
-  std::swap(m_object_map, m_image_ctx.object_map_ptr);
+  std::swap(m_object_map, m_image_ctx.object_map);
   return 0;
 }
 
index bfe917503adfa2d78734f8ded7c31e896d666226..03a941b7c593e21b725b97db16528c22b77ad778 100644 (file)
@@ -2605,7 +2605,8 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
        ictx->snap_exists = false;
       }
 
-      ictx->object_map.refresh(ictx->snap_id);
+      // TODO handle by new async refresh state machine
+      //ictx->object_map.refresh(ictx->snap_id);
 
       ictx->data_ctx.selfmanaged_snap_set_write_ctx(ictx->snapc.seq, ictx->snaps);
 
index d043b88003fa409d7411db9ab1e5685bc1e9094d..ce7f911b99ea9c40616a9799127f9cbbc7ede396 100644 (file)
@@ -145,8 +145,11 @@ private:
     assert(image_ctx.exclusive_lock == nullptr ||
            image_ctx.exclusive_lock->is_lock_owner());
 
+    RWLock::RLocker snap_locker(image_ctx.snap_lock);
+    assert(image_ctx.object_map != nullptr);
+
     RWLock::WLocker l(image_ctx.object_map_lock);
-    uint8_t state = image_ctx.object_map[m_object_no];
+    uint8_t state = (*image_ctx.object_map)[m_object_no];
     if (state == OBJECT_EXISTS && new_state == OBJECT_NONEXISTENT &&
         m_snap_id == CEPH_NOSNAP) {
       // might be writing object to OSD concurrently
@@ -157,7 +160,7 @@ private:
       ldout(cct, 15) << m_oid << " C_VerifyObject::update_object_map "
                      << static_cast<uint32_t>(state) << "->"
                      << static_cast<uint32_t>(new_state) << dendl;
-      image_ctx.object_map[m_object_no] = new_state;
+      (*image_ctx.object_map)[m_object_no] = new_state;
     }
     return true;
   }
@@ -234,15 +237,14 @@ void RebuildObjectMapRequest<I>::send_resize_object_map() {
   assert(m_image_ctx.owner_lock.is_locked());
   CephContext *cct = m_image_ctx.cct;
 
-  uint64_t num_objects;
-  uint64_t size;
-  {
-    RWLock::RLocker l(m_image_ctx.snap_lock);
-    size = get_image_size();
-    num_objects = Striper::get_num_objects(m_image_ctx.layout, size);
-  }
+  m_image_ctx.snap_lock.get_read();
+  assert(m_image_ctx.object_map != nullptr);
+
+  uint64_t size = get_image_size();
+  uint64_t num_objects = Striper::get_num_objects(m_image_ctx.layout, size);
 
-  if (m_image_ctx.object_map.size() == num_objects) {
+  if (m_image_ctx.object_map->size() == num_objects) {
+    m_image_ctx.snap_lock.put_read();
     send_verify_objects();
     return;
   }
@@ -253,8 +255,10 @@ void RebuildObjectMapRequest<I>::send_resize_object_map() {
   // should have been canceled prior to releasing lock
   assert(m_image_ctx.exclusive_lock == nullptr ||
          m_image_ctx.exclusive_lock->is_lock_owner());
-  m_image_ctx.object_map.aio_resize(size, OBJECT_NONEXISTENT,
-                                    this->create_callback_context());
+
+  m_image_ctx.object_map->aio_resize(size, OBJECT_NONEXISTENT,
+                                     this->create_callback_context());
+  m_image_ctx.snap_lock.put_read();
 }
 
 template <typename I>
@@ -273,9 +277,11 @@ void RebuildObjectMapRequest<I>::send_trim_image() {
   uint64_t orig_size;
   {
     RWLock::RLocker l(m_image_ctx.snap_lock);
+    assert(m_image_ctx.object_map != nullptr);
+
     new_size = get_image_size();
     orig_size = m_image_ctx.get_object_size() *
-                m_image_ctx.object_map.size();
+                m_image_ctx.object_map->size();
   }
   TrimRequest<I> *req = new TrimRequest<I>(m_image_ctx,
                                            this->create_callback_context(),
@@ -325,7 +331,10 @@ void RebuildObjectMapRequest<I>::send_save_object_map() {
   // should have been canceled prior to releasing lock
   assert(m_image_ctx.exclusive_lock == nullptr ||
          m_image_ctx.exclusive_lock->is_lock_owner());
-  m_image_ctx.object_map.aio_save(this->create_callback_context());
+
+  RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
+  assert(m_image_ctx.object_map != nullptr);
+  m_image_ctx.object_map->aio_save(this->create_callback_context());
 }
 
 template <typename I>
index 597bfd5ae13949d117df03b849adae52c3c54bdc..dc92dbeef34b70e1e24e9cb3b699b364247b79c7 100644 (file)
@@ -197,7 +197,10 @@ template <typename I>
 void ResizeRequest<I>::send_grow_object_map() {
   I &image_ctx = this->m_image_ctx;
   assert(image_ctx.owner_lock.is_locked());
-  if (!image_ctx.object_map.enabled()) {
+
+  image_ctx.snap_lock.get_read();
+  if (image_ctx.object_map == nullptr) {
+    image_ctx.snap_lock.put_read();
     send_update_header();
     return;
   }
@@ -211,15 +214,19 @@ void ResizeRequest<I>::send_grow_object_map() {
   assert(image_ctx.exclusive_lock == nullptr ||
          image_ctx.exclusive_lock->is_lock_owner());
 
-  image_ctx.object_map.aio_resize(m_new_size, OBJECT_NONEXISTENT,
-                                 this->create_callback_context());
+  image_ctx.object_map->aio_resize(m_new_size, OBJECT_NONEXISTENT,
+                                  this->create_callback_context());
+  image_ctx.snap_lock.put_read();
 }
 
 template <typename I>
 bool ResizeRequest<I>::send_shrink_object_map() {
   I &image_ctx = this->m_image_ctx;
   assert(image_ctx.owner_lock.is_locked());
-  if (!image_ctx.object_map.enabled() || m_new_size > m_original_size) {
+
+  image_ctx.snap_lock.get_read();
+  if (image_ctx.object_map == nullptr || m_new_size > m_original_size) {
+    image_ctx.snap_lock.put_read();
     return true;
   }
 
@@ -232,8 +239,9 @@ bool ResizeRequest<I>::send_shrink_object_map() {
   assert(image_ctx.exclusive_lock == nullptr ||
          image_ctx.exclusive_lock->is_lock_owner());
 
-  image_ctx.object_map.aio_resize(m_new_size, OBJECT_NONEXISTENT,
-                                 this->create_callback_context());
+  image_ctx.object_map->aio_resize(m_new_size, OBJECT_NONEXISTENT,
+                                  this->create_callback_context());
+  image_ctx.snap_lock.put_read();
   return false;
 }
 
index 7c659ec07244db4fe4b41c2c84cb891fce9015d6..63f19d48385b05b8fd3af22b4f2eb158cc41a356 100644 (file)
@@ -222,13 +222,13 @@ bool SnapshotCreateRequest<I>::send_create_object_map() {
   {
     RWLock::RLocker snap_locker(image_ctx.snap_lock);
     RWLock::RLocker object_map_lock(image_ctx.object_map_lock);
-    if (image_ctx.object_map.enabled(image_ctx.object_map_lock)) {
+    if (image_ctx.object_map != nullptr) {
       CephContext *cct = image_ctx.cct;
       ldout(cct, 5) << this << " " << __func__ << dendl;
       m_state = STATE_CREATE_OBJECT_MAP;
 
-      image_ctx.object_map.snapshot_add(m_snap_id,
-                                        this->create_callback_context());
+      image_ctx.object_map->snapshot_add(m_snap_id,
+                                         this->create_callback_context());
       return false;
     }
   }
index 9d5ff3897aa23ed8121ac12f14b3c28c707e9cb0..a227be446f3b3b5c5a615198eed380247cf5693e 100644 (file)
@@ -100,12 +100,12 @@ void SnapshotRemoveRequest<I>::send_remove_object_map() {
   {
     RWLock::WLocker snap_locker(image_ctx.snap_lock);
     RWLock::RLocker object_map_locker(image_ctx.object_map_lock);
-    if (image_ctx.object_map.enabled(image_ctx.object_map_lock)) {
+    if (image_ctx.object_map != nullptr) {
       CephContext *cct = image_ctx.cct;
       ldout(cct, 5) << this << " " << __func__ << dendl;
       m_state = STATE_REMOVE_OBJECT_MAP;
 
-      image_ctx.object_map.snapshot_remove(
+      image_ctx.object_map->snapshot_remove(
         m_snap_id, this->create_callback_context());
       return;
     }
index 39770142d7cb6c2ba11548ef0c397ba8626f04e9..a0cb47cb85f589ad2a3ca5fe6cbac93892864e8a 100644 (file)
@@ -163,12 +163,13 @@ void SnapshotRollbackRequest<I>::send_rollback_object_map() {
   {
     RWLock::RLocker snap_locker(image_ctx.snap_lock);
     RWLock::WLocker object_map_lock(image_ctx.object_map_lock);
-    if (image_ctx.object_map.enabled(image_ctx.object_map_lock)) {
+    if (image_ctx.object_map != nullptr) {
       CephContext *cct = image_ctx.cct;
       ldout(cct, 5) << this << " " << __func__ << dendl;
       m_state = STATE_ROLLBACK_OBJECT_MAP;
 
-      image_ctx.object_map.rollback(m_snap_id, this->create_callback_context());
+      image_ctx.object_map->rollback(m_snap_id,
+                                     this->create_callback_context());
       return;
     }
   }
index 3deae0846578130969ab5ca69b2d5709528167ca..8e32f3ec593cdb6e4dc2c6e5f443e20cb27e027e 100644 (file)
@@ -70,8 +70,13 @@ public:
     assert(image_ctx.owner_lock.is_locked());
     assert(image_ctx.exclusive_lock == nullptr ||
            image_ctx.exclusive_lock->is_lock_owner());
-    if (!image_ctx.object_map.object_may_exist(m_object_no)) {
-      return 1;
+
+    {
+      RWLock::RLocker snap_locker(image_ctx.snap_lock);
+      if (image_ctx.object_map != nullptr &&
+          !image_ctx.object_map->object_may_exist(m_object_no)) {
+        return 1;
+      }
     }
 
     string oid = image_ctx.get_object_name(m_object_no);
@@ -251,7 +256,7 @@ void TrimRequest<I>::send_pre_remove() {
   bool remove_objects = false;
   {
     RWLock::RLocker snap_locker(image_ctx.snap_lock);
-    if (!image_ctx.object_map.enabled()) {
+    if (image_ctx.object_map == nullptr) {
       remove_objects = true;
     } else {
       ldout(image_ctx.cct, 5) << this << " send_pre_remove: "
@@ -264,9 +269,9 @@ void TrimRequest<I>::send_pre_remove() {
       // flag the objects as pending deletion
       Context *ctx = this->create_callback_context();
       RWLock::WLocker object_map_locker(image_ctx.object_map_lock);
-      if (!image_ctx.object_map.aio_update(m_delete_start, m_num_objects,
-                                            OBJECT_PENDING, OBJECT_EXISTS,
-                                             ctx)) {
+      if (!image_ctx.object_map->aio_update(m_delete_start, m_num_objects,
+                                           OBJECT_PENDING, OBJECT_EXISTS,
+                                            ctx)) {
         delete ctx;
         remove_objects = true;
       }
@@ -288,7 +293,7 @@ void TrimRequest<I>::send_post_remove() {
   bool clean_boundary = false;
   {
     RWLock::RLocker snap_locker(image_ctx.snap_lock);
-    if (!image_ctx.object_map.enabled()) {
+    if (image_ctx.object_map == nullptr) {
       clean_boundary = true;
     } else {
       ldout(image_ctx.cct, 5) << this << " send_post_remove: "
@@ -301,9 +306,9 @@ void TrimRequest<I>::send_post_remove() {
       // flag the pending objects as removed
       Context *ctx = this->create_callback_context();
       RWLock::WLocker object_map_locker(image_ctx.object_map_lock);
-      if (!image_ctx.object_map.aio_update(m_delete_start, m_num_objects,
-                                            OBJECT_NONEXISTENT,
-                                            OBJECT_PENDING, ctx)) {
+      if (!image_ctx.object_map->aio_update(m_delete_start, m_num_objects,
+                                           OBJECT_NONEXISTENT,
+                                           OBJECT_PENDING, ctx)) {
         delete ctx;
        clean_boundary = true;
       }