From: Jason Dillaman Date: Fri, 4 May 2018 17:49:10 +0000 (-0400) Subject: rbd-mirror: instantly remove instances without associated images X-Git-Tag: v14.0.0~95^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bce5328a328f3f9b98674d9e4611a2a40bdf3ddb;p=ceph.git rbd-mirror: instantly remove instances without associated images Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd_mirror/image_map/Policy.cc b/src/tools/rbd_mirror/image_map/Policy.cc index c1e69e774c4..a60c8fc0420 100644 --- a/src/tools/rbd_mirror/image_map/Policy.cc +++ b/src/tools/rbd_mirror/image_map/Policy.cc @@ -165,24 +165,32 @@ void Policy::remove_instances(const RWLock& lock, for (auto& instance_id : instance_ids) { auto map_it = m_map.find(instance_id); - if (map_it != m_map.end()) { - m_dead_instances.insert(instance_id); - dout(5) << "force shuffling global_image_ids=[" << map_it->second - << "]" << dendl; - for (auto& global_image_id : map_it->second) { - auto it = m_image_states.find(global_image_id); - assert(it != m_image_states.end()); - - auto& image_state = it->second; - if (is_state_scheduled(image_state, - StateTransition::STATE_DISSOCIATING)) { - // don't shuffle images that no longer exist - continue; - } - - if (set_state(&image_state, StateTransition::STATE_SHUFFLING, true)) { - global_image_ids->emplace(global_image_id); - } + if (map_it == m_map.end()) { + continue; + } + + auto& instance_global_image_ids = map_it->second; + if (instance_global_image_ids.empty()) { + m_map.erase(map_it); + continue; + } + + m_dead_instances.insert(instance_id); + dout(5) << "force shuffling: instance_id=" << instance_id << ", " + << "global_image_ids=[" << instance_global_image_ids << "]"<< dendl; + for (auto& global_image_id : instance_global_image_ids) { + auto it = m_image_states.find(global_image_id); + assert(it != m_image_states.end()); + + auto& image_state = it->second; + if (is_state_scheduled(image_state, + StateTransition::STATE_DISSOCIATING)) { + // don't shuffle images that no longer exist + continue; + } + + if (set_state(&image_state, StateTransition::STATE_SHUFFLING, true)) { + global_image_ids->emplace(global_image_id); } } }