From: Venky Shankar Date: Mon, 4 Jun 2018 09:34:58 +0000 (-0400) Subject: rbd-mirror: fix state transition table for disassociation X-Git-Tag: v13.2.1~58^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=260a415a3f5846c203e46463f8f4eef498be9485;p=ceph.git rbd-mirror: fix state transition table for disassociation The final state transition when disassociating (removing) images does not purge the image state map for a given image. This can also result in uneven balance of images across instances as the policy implementation relies on this structure to figure out total number of images tracked. Signed-off-by: Venky Shankar (cherry picked from commit 895d69f226afd0dfa33909ff9766abf780531787) --- diff --git a/src/tools/rbd_mirror/image_map/Policy.cc b/src/tools/rbd_mirror/image_map/Policy.cc index 6718b10b77487..30899c5beaa52 100644 --- a/src/tools/rbd_mirror/image_map/Policy.cc +++ b/src/tools/rbd_mirror/image_map/Policy.cc @@ -258,11 +258,13 @@ bool Policy::finish_action(const std::string &global_image_id, int r) { assert(start_action); } + // image state may get purged in execute_policy_action() + bool pending_action = image_state.transition.action_type != ACTION_TYPE_NONE; if (finish_policy_action) { execute_policy_action(global_image_id, &image_state, *finish_policy_action); } - return (image_state.transition.action_type != ACTION_TYPE_NONE); + return pending_action; } void Policy::execute_policy_action( diff --git a/src/tools/rbd_mirror/image_map/StateTransition.cc b/src/tools/rbd_mirror/image_map/StateTransition.cc index 1a3f521fe5c74..76c66f9fa5a7f 100644 --- a/src/tools/rbd_mirror/image_map/StateTransition.cc +++ b/src/tools/rbd_mirror/image_map/StateTransition.cc @@ -65,13 +65,12 @@ const StateTransition::TransitionTable StateTransition::s_transition_table { {{STATE_ASSOCIATING, ACTION_TYPE_ACQUIRE}, {ACTION_TYPE_NONE, {}, {}, {STATE_ASSOCIATED}}}, - {{STATE_DISSOCIATING, ACTION_TYPE_NONE}, {ACTION_TYPE_RELEASE, {}, {}, - {}}}, + {{STATE_DISSOCIATING, ACTION_TYPE_NONE}, {ACTION_TYPE_RELEASE, {}, + {POLICY_ACTION_UNMAP}, {}}}, {{STATE_DISSOCIATING, ACTION_TYPE_RELEASE}, {ACTION_TYPE_MAP_REMOVE, {}, - {POLICY_ACTION_UNMAP}, {}}}, + {POLICY_ACTION_REMOVE}, {}}}, {{STATE_DISSOCIATING, ACTION_TYPE_MAP_REMOVE}, {ACTION_TYPE_NONE, {}, - {POLICY_ACTION_REMOVE}, - {STATE_UNASSOCIATED}}}, + {}, {STATE_UNASSOCIATED}}}, {{STATE_SHUFFLING, ACTION_TYPE_NONE}, {ACTION_TYPE_RELEASE, {}, {POLICY_ACTION_UNMAP}, {}}},