]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: instantly remove instances without associated images
authorJason Dillaman <dillaman@redhat.com>
Fri, 4 May 2018 17:49:10 +0000 (13:49 -0400)
committerJason Dillaman <dillaman@redhat.com>
Sat, 19 May 2018 12:16:34 +0000 (08:16 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit bce5328a328f3f9b98674d9e4611a2a40bdf3ddb)

src/tools/rbd_mirror/image_map/Policy.cc

index c1e69e774c4507508d7133365646c4df6ccd615a..a60c8fc04208ac3a4461d99651dcd06102b4c04e 100644 (file)
@@ -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);
       }
     }
   }