]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: flatten operation should detach child first
authorJason Dillaman <dillaman@redhat.com>
Thu, 25 Jan 2018 19:00:54 +0000 (14:00 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 5 Feb 2018 16:12:00 +0000 (11:12 -0500)
That will permit the flatten operation to be replayed if there
is an issue.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/operation/FlattenRequest.cc
src/librbd/operation/FlattenRequest.h

index a1d88f0451f08da3ecd4df638db968c08227b6d8..3ece4def307783a8c0e88da31960eb3a7d371e9b 100644 (file)
@@ -66,7 +66,7 @@ bool FlattenRequest<I>::should_complete(int r) {
   if (r == -ERESTART) {
     ldout(cct, 5) << "flatten operation interrupted" << dendl;
     return true;
-  } else if (r < 0 && !(r == -ENOENT && m_ignore_enoent) ) {
+  } else if (r < 0 && r != -ENOENT) {
     lderr(cct) << "flatten encountered an error: " << cpp_strerror(r) << dendl;
     return true;
   }
@@ -75,14 +75,14 @@ bool FlattenRequest<I>::should_complete(int r) {
   switch (m_state) {
   case STATE_FLATTEN_OBJECTS:
     ldout(cct, 5) << "FLATTEN_OBJECTS" << dendl;
-    return send_update_header();
-
-  case STATE_UPDATE_HEADER:
-    ldout(cct, 5) << "UPDATE_HEADER" << dendl;
     return send_update_children();
 
   case STATE_UPDATE_CHILDREN:
     ldout(cct, 5) << "UPDATE_CHILDREN" << dendl;
+    return send_update_header();
+
+  case STATE_UPDATE_HEADER:
+    ldout(cct, 5) << "UPDATE_HEADER" << dendl;
     return true;
 
   default:
@@ -133,7 +133,6 @@ bool FlattenRequest<I>::send_update_header() {
     }
     m_parent_spec = image_ctx.parent_md.spec;
   }
-  m_ignore_enoent = true;
 
   // remove parent from this (base) image
   librados::ObjectWriteOperation op;
@@ -163,7 +162,7 @@ bool FlattenRequest<I>::send_update_children() {
   RWLock::RLocker snap_locker(image_ctx.snap_lock);
   if ((image_ctx.features & RBD_FEATURE_DEEP_FLATTEN) == 0 &&
       !image_ctx.snaps.empty()) {
-    return true;
+    return send_update_header();
   }
 
   ldout(cct, 2) << "removing child from children list..." << dendl;
index f64a043ab55a4c901f5615abeacf4a4960bd45e4..7d87c0ead08dd204f3841e204b346ffea3ab3015 100644 (file)
@@ -43,11 +43,11 @@ private:
    * <start>
    *    |
    *    v
-   * STATE_FLATTEN_OBJECTS ---> STATE_UPDATE_HEADER . . . . .
+   * STATE_FLATTEN_OBJECTS ---> STATE_UPDATE_CHILDREN . . . .
    *           .                         |                  .
    *           .                         |                  .
    *           .                         v                  .
-   *           .               STATE_UPDATE_CHILDREN        .
+   *           .               STATE_UPDATE_HEADER          .
    *           .                         |                  .
    *           .                         |                  .
    *           .                         \---> <finish> < . .
@@ -63,8 +63,8 @@ private:
    */
   enum State {
     STATE_FLATTEN_OBJECTS,
-    STATE_UPDATE_HEADER,
-    STATE_UPDATE_CHILDREN
+    STATE_UPDATE_CHILDREN,
+    STATE_UPDATE_HEADER
   };
 
   uint64_t m_overlap_objects;
@@ -73,7 +73,6 @@ private:
   State m_state = STATE_FLATTEN_OBJECTS;
 
   ParentSpec m_parent_spec;
-  bool m_ignore_enoent = false;
 
   bool send_update_header();
   bool send_update_children();