]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: use on-disk image name when storing mirror snapshot state
authorMykola Golub <mgolub@suse.com>
Mon, 22 Feb 2021 12:54:43 +0000 (12:54 +0000)
committerMykola Golub <mgolub@suse.com>
Fri, 5 Mar 2021 17:04:58 +0000 (19:04 +0200)
Fixes: https://tracker.ceph.com/issues/49115
Signed-off-by: Mykola Golub <mgolub@suse.com>
(cherry picked from commit 813728ae2036231a269be86bcb3dc48951a20f21)

src/librbd/mirror/snapshot/SetImageStateRequest.cc
src/librbd/mirror/snapshot/SetImageStateRequest.h

index d0caccdf58aeed902d18f5891bee689cc163c42f..5b03d89b317946b3e3e73de06d46cc6c60c3669e 100644 (file)
@@ -27,6 +27,45 @@ using librbd::util::create_rados_callback;
 
 template <typename I>
 void SetImageStateRequest<I>::send() {
+  get_name();
+}
+
+template <typename I>
+void SetImageStateRequest<I>::get_name() {
+  CephContext *cct = m_image_ctx->cct;
+  ldout(cct, 15) << dendl;
+
+  librados::ObjectReadOperation op;
+  cls_client::dir_get_name_start(&op, m_image_ctx->id);
+
+  librados::AioCompletion *comp = create_rados_callback<
+    SetImageStateRequest<I>,
+    &SetImageStateRequest<I>::handle_get_name>(this);
+  m_bl.clear();
+  int r = m_image_ctx->md_ctx.aio_operate(RBD_DIRECTORY, comp, &op, &m_bl);
+  ceph_assert(r == 0);
+  comp->release();
+}
+
+template <typename I>
+void SetImageStateRequest<I>::handle_get_name(int r) {
+  CephContext *cct = m_image_ctx->cct;
+  ldout(cct, 15) << "r=" << r << dendl;
+
+  if (r == 0) {
+    auto it = m_bl.cbegin();
+    r = cls_client::dir_get_name_finish(&it, &m_image_state.name);
+  }
+
+  if (r < 0) {
+    lderr(cct) << "failed to retrieve image name: " << cpp_strerror(r)
+               << dendl;
+    finish(r);
+    return;
+  }
+
+  ldout(cct, 15) << "name=" << m_image_state.name << dendl;
+
   get_snap_limit();
 }
 
@@ -99,7 +138,6 @@ void SetImageStateRequest<I>::handle_get_metadata(int r) {
   {
     std::shared_lock image_locker{m_image_ctx->image_lock};
 
-    m_image_state.name = m_image_ctx->name;
     m_image_state.features =
       m_image_ctx->features & ~RBD_FEATURES_IMPLICIT_ENABLE;
 
index df903a279ab878798df30fd40f32e6622d97fe4e..fd281549489bdbe60da44d429164f7fca41a55fb 100644 (file)
@@ -40,6 +40,9 @@ private:
    * <start>
    *    |
    *    v
+   * GET_NAME
+   *    |
+   *    v
    * GET_SNAP_LIMIT
    *    |
    *    v
@@ -66,6 +69,9 @@ private:
   bufferlist m_bl;
   bufferlist m_state_bl;
 
+  void get_name();
+  void handle_get_name(int r);
+
   void get_snap_limit();
   void handle_get_snap_limit(int r);