diff --git a/src/image/ImageManagerProtocol.cc b/src/image/ImageManagerProtocol.cc index ca81a31efd..8673cbf3c3 100644 --- a/src/image/ImageManagerProtocol.cc +++ b/src/image/ImageManagerProtocol.cc @@ -884,6 +884,16 @@ void ImageManager::_increment_flatten(unique_ptr msg) int uid = image->get_uid(); int gid = image->get_gid(); + auto ids = image->get_running_ids(); + auto first = ids.cbegin(); + + int vm_id = -1; + + if (first != ids.cend()) + { + vm_id = *first; + } + if (msg->status() == "SUCCESS") { auto& increments = image->increments(); @@ -945,6 +955,36 @@ void ImageManager::_increment_flatten(unique_ptr msg) Quotas::ds_del(uid, gid, "as); } + + /* ---------------------------------------------------------------------- */ + /* Update VM state to RUNNING/POWEROFF after increment_flatten */ + /* ---------------------------------------------------------------------- */ + if ( vm_id == -1 ) + { + return; + } + + VirtualMachinePool* vmpool = Nebula::instance().get_vmpool(); + + if (auto vm = vmpool->get(vm_id)) + { + switch(vm->get_lcm_state()) + { + case VirtualMachine::BACKUP: + vm->set_state(VirtualMachine::RUNNING); + break; + + case VirtualMachine::BACKUP_POWEROFF: + vm->set_state(VirtualMachine::POWEROFF); + vm->set_state(VirtualMachine::LCM_INIT); + break; + + default: + return; + } + + vmpool->update(vm.get()); + } } /* -------------------------------------------------------------------------- */ diff --git a/src/lcm/LifeCycleStates.cc b/src/lcm/LifeCycleStates.cc index e4de5f0447..193c7ac5b2 100644 --- a/src/lcm/LifeCycleStates.cc +++ b/src/lcm/LifeCycleStates.cc @@ -2870,10 +2870,9 @@ void LifeCycleManager::trigger_backup_success(int vid) backups.last_backup_clear(); - vmpool->update(vm.get()); - - if (delete_ids.size() > 0) // FULL & backups > keep_last + if (delete_ids.size() > 0) { + // FULL & backups > keep_last ostringstream oss; oss << "Removing backup snapshots:"; @@ -2885,15 +2884,29 @@ void LifeCycleManager::trigger_backup_success(int vid) vm->log("LCM", Log::INFO, oss.str()); } - else if (keep_last > 0 && increments > keep_last) // INCREMENTAL & increments > keep_last + else if (keep_last > 0 && increments > keep_last) { + // INCREMENTAL & increments > keep_last ostringstream oss; oss << "Removing " << increments - keep_last << " backup increments"; vm->log("LCM", Log::INFO, oss.str()); + + //Rollback state to prevent backup operations while increment_flatten + if ( vm->get_lcm_state() == VirtualMachine::RUNNING) + { + vm->set_state(VirtualMachine::BACKUP); + } + else + { + vm->set_state(VirtualMachine::ACTIVE); + vm->set_state(VirtualMachine::BACKUP_POWEROFF); + } } + vmpool->update(vm.get()); + vm.reset(); /* ------------------------------------------------------------------ */