Increase timeout for VM shutdown when prep'ing for backup (#566)

This commit is contained in:
Agnieszka Kostrzewa 2012-05-13 16:56:27 +02:00
parent 1865f4d0d4
commit b116ce96f8
2 changed files with 27 additions and 24 deletions

View File

@ -178,14 +178,7 @@ class BackupVMsWindow(Ui_Backup, QWizard):
return some_selected_vms_running
def shutdown_all_running_selected(self):
names = []
vms = []
for i in range(self.select_vms_widget.selected_list.count()):
item = self.select_vms_widget.selected_list.item(i)
if item.vm.is_running() and item.vm.qid != 0:
names.append(item.vm.name)
vms.append(item.vm)
(names, vms) = self.get_running_vms()
if len(vms) == 0:
return;
@ -197,24 +190,34 @@ class BackupVMsWindow(Ui_Backup, QWizard):
self.app.processEvents()
if reply == QMessageBox.Yes:
wait_time = 60.0
for vm in vms:
self.shutdown_vm_func(vm)
self.shutdown_vm_func(vm, wait_time*1000)
progress = QProgressDialog ("Shutting down VMs <b>{0}</b>...".format(', '.join(names)), "", 0, 0)
progress.setModal(True)
progress.show()
wait_time = 15.0
wait_for = wait_time
while self.check_running() and wait_for > 0:
self.app.processEvents()
time.sleep (0.1)
wait_for -= 0.1
time.sleep (0.5)
wait_for -= 0.5
progress.hide()
if self.check_running():
QMessageBox.information(None, "Strange", "Could not power down the VMs in {0} seconds...".format(wait_time))
def get_running_vms(self):
names = []
vms = []
for i in range(self.select_vms_widget.selected_list.count()):
item = self.select_vms_widget.selected_list.item(i)
if item.vm.is_running() and item.vm.qid != 0:
names.append(item.vm.name)
vms.append(item.vm)
return (names, vms)

View File

@ -611,28 +611,28 @@ class VmRowInTable(object):
vm_shutdown_timeout = 15000 # in msec
vm_shutdown_timeout = 20000 # in msec
class VmShutdownMonitor(QObject):
def __init__(self, vm):
def __init__(self, vm, shutdown_time = vm_shutdown_timeout):
self.vm = vm
self.shutdown_time = shutdown_time
def check_if_vm_has_shutdown(self):
vm = self.vm
vm_start_time = vm.get_start_time()
if not vm.is_running() or (vm_start_time and vm_start_time >= datetime.utcnow() - timedelta(0,vm_shutdown_timeout/1000)):
if not vm.is_running() or (vm_start_time and vm_start_time >= datetime.utcnow() - timedelta(0,self.shutdown_time/1000)):
if vm.is_template():
trayIcon.showMessage ("Qubes VM Manager", "You have just modified template '{0}'. You should now restart all the VMs based on it, so they could see the changes.".format(vm.name), msecs=8000)
return
reply = QMessageBox.question(None, "VM Shutdown",
"The VM <b>'{0}'</b> hasn't shutdown within the last {1} seconds, do you want to kill it?<br>".format(vm.name, vm_shutdown_timeout/1000),
"Kill it!", "Wait another {0} seconds...".format(vm_shutdown_timeout/1000))
"The VM <b>'{0}'</b> hasn't shutdown within the last {1} seconds, do you want to kill it?<br>".format(vm.name, self.shutdown_time/1000),
"Kill it!", "Wait another {0} seconds...".format(self.shutdown_time/1000))
if reply == 0:
vm.force_shutdown()
else:
QTimer.singleShot (vm_shutdown_timeout, self.check_if_vm_has_shutdown)
QTimer.singleShot (self.shutdown_time, self.check_if_vm_has_shutdown)
class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
@ -1222,7 +1222,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.shutdown_vm(vm)
def shutdown_vm(self, vm):
def shutdown_vm(self, vm, shutdown_time = vm_shutdown_timeout):
try:
subprocess.check_call (["/usr/sbin/xl", "shutdown", vm.name])
except Exception as ex:
@ -1231,8 +1231,8 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
trayIcon.showMessage ("Qubes VM Manager", "VM '{0}' is shutting down...".format(vm.name), msecs=3000)
self.shutdown_monitor[vm.qid] = VmShutdownMonitor (vm)
QTimer.singleShot (vm_shutdown_timeout, self.shutdown_monitor[vm.qid].check_if_vm_has_shutdown)
self.shutdown_monitor[vm.qid] = VmShutdownMonitor (vm, shutdown_time)
QTimer.singleShot (shutdown_time, self.shutdown_monitor[vm.qid].check_if_vm_has_shutdown)
@pyqtSlot(name='on_action_killvm_triggered')