]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: don't update object map if object deep copy returned ENOENT
authorMykola Golub <mgolub@suse.com>
Sat, 9 Jun 2018 10:28:52 +0000 (13:28 +0300)
committerJason Dillaman <dillaman@redhat.com>
Tue, 14 Aug 2018 22:29:45 +0000 (18:29 -0400)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/deep_copy/ImageCopyRequest.cc
src/librbd/deep_copy/ObjectCopyRequest.cc
src/librbd/io/CopyupRequest.cc
src/librbd/io/CopyupRequest.h
src/librbd/operation/MigrateRequest.cc
src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc

index 651937fcd36ff09dd9b042c0cdb827f6e04ac918..8762fc15c66fc7b27ea9cf8dc097b33a6e7b8a1e 100644 (file)
@@ -200,7 +200,7 @@ void ImageCopyRequest<I>::handle_object_copy(uint64_t object_no, int r) {
     assert(m_current_ops > 0);
     --m_current_ops;
 
-    if (r < 0) {
+    if (r < 0 && r != -ENOENT) {
       lderr(m_cct) << "object copy failed: " << cpp_strerror(r) << dendl;
       if (m_ret_val == 0) {
         m_ret_val = r;
index 3d6bbe8404e0a5e32bf10cc33e2624588230e0c5..235263ac107be47165d0ee4616d9b33a1f148a6f 100644 (file)
@@ -284,7 +284,7 @@ void ObjectCopyRequest<I>::handle_read_from_parent(int r) {
 
   if (m_write_ops.empty()) {
     // nothing to copy
-    finish(0);
+    finish(-ENOENT);
     return;
   }
 
index 3addb8f2c1ed4d3d05bbdcf3c3cc1bcc20c3fa0f..77ffaace2719ea240d2cef26eadc94173ea72a67 100644 (file)
@@ -205,7 +205,11 @@ bool CopyupRequest<I>::is_copyup_required() {
 }
 
 template <typename I>
-bool CopyupRequest<I>::is_update_object_map_required() {
+bool CopyupRequest<I>::is_update_object_map_required(int r) {
+  if (r < 0) {
+    return false;
+  }
+
   RWLock::RLocker owner_locker(m_ictx->owner_lock);
   RWLock::RLocker snap_locker(m_ictx->snap_lock);
   if (m_ictx->object_map == nullptr) {
@@ -259,26 +263,28 @@ void CopyupRequest<I>::send()
 template <typename I>
 void CopyupRequest<I>::complete(int r)
 {
-  if (should_complete(r)) {
+  if (should_complete(&r)) {
     complete_requests(r);
     delete this;
   }
 }
 
 template <typename I>
-bool CopyupRequest<I>::should_complete(int r)
-{
+bool CopyupRequest<I>::should_complete(int *r) {
   CephContext *cct = m_ictx->cct;
   ldout(cct, 20) << "oid " << m_oid
-                 << ", r " << r << dendl;
+                 << ", r " << *r << dendl;
 
   uint64_t pending_copyups;
   switch (m_state) {
   case STATE_READ_FROM_PARENT:
     ldout(cct, 20) << "READ_FROM_PARENT" << dendl;
     remove_from_list();
-    if (r >= 0 || r == -ENOENT) {
-      if (!is_copyup_required() && !is_update_object_map_required()) {
+    if (*r >= 0 || *r == -ENOENT) {
+      if (!is_copyup_required() && !is_update_object_map_required(*r)) {
+        if (*r == -ENOENT && is_deep_copy()) {
+          *r = 0;
+        }
         ldout(cct, 20) << "skipping" << dendl;
         return true;
       }
@@ -289,12 +295,12 @@ bool CopyupRequest<I>::should_complete(int r)
 
   case STATE_OBJECT_MAP_HEAD:
     ldout(cct, 20) << "OBJECT_MAP_HEAD" << dendl;
-    assert(r == 0);
+    assert(*r == 0);
     return send_object_map();
 
   case STATE_OBJECT_MAP:
     ldout(cct, 20) << "OBJECT_MAP" << dendl;
-    assert(r == 0);
+    assert(*r == 0);
     if (!is_copyup_required()) {
       ldout(cct, 20) << "skipping copyup" << dendl;
       return true;
@@ -309,13 +315,14 @@ bool CopyupRequest<I>::should_complete(int r)
     }
     ldout(cct, 20) << "COPYUP (" << pending_copyups << " pending)"
                    << dendl;
-    if (r == -ENOENT) {
+    if (*r == -ENOENT) {
       // hide the -ENOENT error if this is the last op
       if (pending_copyups == 0) {
+        *r = 0;
         complete_requests(0);
       }
-    } else if (r < 0) {
-      complete_requests(r);
+    } else if (*r < 0) {
+      complete_requests(*r);
     }
     return (pending_copyups == 0);
 
@@ -324,7 +331,7 @@ bool CopyupRequest<I>::should_complete(int r)
     ceph_abort();
     break;
   }
-  return (r < 0);
+  return (*r < 0);
 }
 
 template <typename I>
index c92494c2f998992c5e233ffb5004dc613e66efc3..31eae5c1ac6c6b32de177aad22377001cd5ccd1e 100644 (file)
@@ -105,7 +105,7 @@ private:
 
   void complete_requests(int r);
 
-  bool should_complete(int r);
+  bool should_complete(int *r);
 
   void remove_from_list();
 
@@ -113,7 +113,7 @@ private:
   bool send_object_map();
   bool send_copyup();
   bool is_copyup_required();
-  bool is_update_object_map_required();
+  bool is_update_object_map_required(int r);
   bool is_deep_copy() const;
 };
 
index d736a8668b89b5972dcd06c0a32c1068fbd31fa6..f7ec41621d662d6a34cbbb12b152ebd8bdf85b74 100644 (file)
@@ -141,6 +141,10 @@ private:
     CephContext *cct = this->m_image_ctx.cct;
     ldout(cct, 10) << "r=" << r << dendl;
 
+    if (r == -ENOENT) {
+      r = 0;
+    }
+
     m_async_op.finish_op();
     this->complete(r);
   }
index 0a1afcd1819d5176ce737d9bc9beb977250b0bc6..a52c62fbb060e1ad6918ae64196ef211dbd665d2 100644 (file)
@@ -464,7 +464,7 @@ TEST_F(TestMockDeepCopyObjectCopyRequest, DNE) {
   expect_list_snaps(mock_src_image_ctx, mock_src_io_ctx, -ENOENT);
 
   request->send();
-  ASSERT_EQ(0, ctx.wait());
+  ASSERT_EQ(-ENOENT, ctx.wait());
 }
 
 TEST_F(TestMockDeepCopyObjectCopyRequest, Write) {