From: Jason Dillaman Date: Thu, 25 Jan 2018 19:00:54 +0000 (-0500) Subject: librbd: flatten operation should detach child first X-Git-Tag: v13.0.2~327^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=67ddd53488e9fb2fc7fcb053d169c28a9aa44363;p=ceph.git librbd: flatten operation should detach child first That will permit the flatten operation to be replayed if there is an issue. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/operation/FlattenRequest.cc b/src/librbd/operation/FlattenRequest.cc index a1d88f0451f..3ece4def307 100644 --- a/src/librbd/operation/FlattenRequest.cc +++ b/src/librbd/operation/FlattenRequest.cc @@ -66,7 +66,7 @@ bool FlattenRequest::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::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::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::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; diff --git a/src/librbd/operation/FlattenRequest.h b/src/librbd/operation/FlattenRequest.h index f64a043ab55..7d87c0ead08 100644 --- a/src/librbd/operation/FlattenRequest.h +++ b/src/librbd/operation/FlattenRequest.h @@ -43,11 +43,11 @@ private: * * | * v - * STATE_FLATTEN_OBJECTS ---> STATE_UPDATE_HEADER . . . . . + * STATE_FLATTEN_OBJECTS ---> STATE_UPDATE_CHILDREN . . . . * . | . * . | . * . v . - * . STATE_UPDATE_CHILDREN . + * . STATE_UPDATE_HEADER . * . | . * . | . * . \---> < . . @@ -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();