Increase timeout for VM shutdown when prep'ing for backup (#566)
This commit is contained in:
		
							parent
							
								
									1865f4d0d4
								
							
						
					
					
						commit
						b116ce96f8
					
				| @ -178,14 +178,7 @@ class BackupVMsWindow(Ui_Backup, QWizard): | |||||||
|         return some_selected_vms_running |         return some_selected_vms_running | ||||||
| 
 | 
 | ||||||
|     def shutdown_all_running_selected(self): |     def shutdown_all_running_selected(self): | ||||||
|         names = [] |         (names, vms) = self.get_running_vms() | ||||||
|         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) |  | ||||||
| 
 |  | ||||||
|         if len(vms) == 0: |         if len(vms) == 0: | ||||||
|             return; |             return; | ||||||
| 
 | 
 | ||||||
| @ -197,24 +190,34 @@ class BackupVMsWindow(Ui_Backup, QWizard): | |||||||
|         self.app.processEvents() |         self.app.processEvents() | ||||||
| 
 | 
 | ||||||
|         if reply == QMessageBox.Yes: |         if reply == QMessageBox.Yes: | ||||||
|  |              | ||||||
|  |             wait_time = 60.0 | ||||||
|             for vm in vms: |             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 = QProgressDialog ("Shutting down VMs <b>{0}</b>...".format(', '.join(names)), "", 0, 0) | ||||||
|             progress.setModal(True) |             progress.setModal(True) | ||||||
|             progress.show() |             progress.show() | ||||||
| 
 | 
 | ||||||
|             wait_time = 15.0 |  | ||||||
|             wait_for = wait_time |             wait_for = wait_time | ||||||
|             while self.check_running() and wait_for > 0: |             while self.check_running() and wait_for > 0: | ||||||
|                 self.app.processEvents() |                 self.app.processEvents() | ||||||
|                 time.sleep (0.1) |                 time.sleep (0.5) | ||||||
|                 wait_for -= 0.1 |                 wait_for -= 0.5 | ||||||
| 
 | 
 | ||||||
|             progress.hide() |             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) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -611,28 +611,28 @@ class VmRowInTable(object): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| vm_shutdown_timeout = 15000 # in msec | vm_shutdown_timeout = 20000 # in msec | ||||||
| 
 | 
 | ||||||
| class VmShutdownMonitor(QObject): | class VmShutdownMonitor(QObject): | ||||||
|     def __init__(self, vm): |     def __init__(self, vm, shutdown_time = vm_shutdown_timeout): | ||||||
|         self.vm = vm |         self.vm = vm | ||||||
|  |         self.shutdown_time = shutdown_time | ||||||
| 
 | 
 | ||||||
|     def check_if_vm_has_shutdown(self): |     def check_if_vm_has_shutdown(self): | ||||||
|         vm = self.vm |         vm = self.vm | ||||||
|         vm_start_time = vm.get_start_time() |         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(): |             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) |                 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 |             return | ||||||
| 
 | 
 | ||||||
|         reply = QMessageBox.question(None, "VM Shutdown", |         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), |                                      "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(vm_shutdown_timeout/1000)) |                                      "Kill it!", "Wait another {0} seconds...".format(self.shutdown_time/1000)) | ||||||
| 
 |  | ||||||
|         if reply == 0: |         if reply == 0: | ||||||
|             vm.force_shutdown() |             vm.force_shutdown() | ||||||
|         else: |         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): | class VmManagerWindow(Ui_VmManagerWindow, QMainWindow): | ||||||
| @ -1222,7 +1222,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow): | |||||||
|             self.shutdown_vm(vm) |             self.shutdown_vm(vm) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     def shutdown_vm(self, vm): |     def shutdown_vm(self, vm, shutdown_time = vm_shutdown_timeout): | ||||||
|         try: |         try: | ||||||
|             subprocess.check_call (["/usr/sbin/xl", "shutdown", vm.name]) |             subprocess.check_call (["/usr/sbin/xl", "shutdown", vm.name]) | ||||||
|         except Exception as ex: |         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) |         trayIcon.showMessage ("Qubes VM Manager", "VM '{0}' is shutting down...".format(vm.name), msecs=3000) | ||||||
| 
 | 
 | ||||||
|         self.shutdown_monitor[vm.qid] = VmShutdownMonitor (vm) |         self.shutdown_monitor[vm.qid] = VmShutdownMonitor (vm, shutdown_time) | ||||||
|         QTimer.singleShot (vm_shutdown_timeout, self.shutdown_monitor[vm.qid].check_if_vm_has_shutdown) |         QTimer.singleShot (shutdown_time, self.shutdown_monitor[vm.qid].check_if_vm_has_shutdown) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     @pyqtSlot(name='on_action_killvm_triggered') |     @pyqtSlot(name='on_action_killvm_triggered') | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Agnieszka Kostrzewa
						Agnieszka Kostrzewa