From a09aa7fab84845aa6febb641da3dcdbe92654d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Czern=C3=BD?= Date: Thu, 25 Aug 2022 10:19:35 +0200 Subject: [PATCH] F #937: Do not release image if other disk uses it (#2262) (cherry picked from commit 015d842467f2ad37f5295b87c0eb0dc98242b644) --- src/vm/VirtualMachinePool.cc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/vm/VirtualMachinePool.cc b/src/vm/VirtualMachinePool.cc index fcd0f582005..c863b2f8521 100644 --- a/src/vm/VirtualMachinePool.cc +++ b/src/vm/VirtualMachinePool.cc @@ -998,18 +998,27 @@ void VirtualMachinePool::delete_attach_disk(std::unique_ptr vm) update(vm.get()); - vm.reset(); - if ( disk == nullptr ) { return; } + // skip image release if there is other disk using the same image + int image_id; + set image_ids; + + disk->vector_value("IMAGE_ID", image_id); + + vm->get_disks().get_image_ids(image_ids, uid); + + bool do_image_release = image_ids.count(image_id) == 0; + + vm.reset(); + Nebula& nd = Nebula::instance(); ImageManager* imagem = nd.get_imagem(); Template tmpl; - int image_id; tmpl.set(disk->vector_attribute()); tmpl.add("VMS", 0); @@ -1020,8 +1029,6 @@ void VirtualMachinePool::delete_attach_disk(std::unique_ptr vm) } else { - disk->vector_value("IMAGE_ID", image_id); - Quotas::quota_del(Quotas::IMAGE, uid, gid, &tmpl); if (!disk->is_persistent()) @@ -1040,7 +1047,10 @@ void VirtualMachinePool::delete_attach_disk(std::unique_ptr vm) imagem->clear_image_snapshots(image_id); } - imagem->release_image(oid, image_id, false); + if (do_image_release) + { + imagem->release_image(oid, image_id, false); + } } delete disk;