If managed restore fails, offer to remove broken state

This commit is contained in:
Cole Robinson 2012-07-08 16:06:16 -04:00
parent 68e78244e8
commit c3f08fe09a
3 changed files with 47 additions and 20 deletions

View File

@ -104,7 +104,7 @@ def cb_wrapper(callback, asyncjob, *args, **kwargs):
asyncjob.set_error(str(e), "".join(traceback.format_exc())) asyncjob.set_error(str(e), "".join(traceback.format_exc()))
def _simple_async(callback, args, title, text, parent, errorintro, def _simple_async(callback, args, title, text, parent, errorintro,
show_progress, simplecb): show_progress, simplecb, errorcb):
""" """
@show_progress: Whether to actually show a progress dialog @show_progress: Whether to actually show a progress dialog
@simplecb: If true, build a callback wrapper that ignores the asyncjob @simplecb: If true, build a callback wrapper that ignores the asyncjob
@ -124,9 +124,12 @@ def _simple_async(callback, args, title, text, parent, errorintro,
if error is None: if error is None:
return return
error = errorintro + ": " + error if errorcb:
parent.err.show_err(error, errorcb(error, details)
details=details) else:
error = errorintro + ": " + error
parent.err.show_err(error,
details=details)
def idle_wrapper(fn): def idle_wrapper(fn):
def wrapped(self, *args, **kwargs): def wrapped(self, *args, **kwargs):
@ -138,14 +141,15 @@ class vmmAsyncJob(vmmGObjectUI):
@staticmethod @staticmethod
def simple_async(callback, args, title, text, parent, errorintro, def simple_async(callback, args, title, text, parent, errorintro,
simplecb=True): simplecb=True, errorcb=None):
_simple_async(callback, args, title, text, parent, errorintro, True, _simple_async(callback, args, title, text, parent, errorintro, True,
simplecb) simplecb, errorcb)
@staticmethod @staticmethod
def simple_async_noshow(callback, args, parent, errorintro, simplecb=True): def simple_async_noshow(callback, args, parent, errorintro,
simplecb=True, errorcb=None):
_simple_async(callback, args, "", "", parent, errorintro, False, _simple_async(callback, args, "", "", parent, errorintro, False,
simplecb) simplecb, errorcb)
def __init__(self, callback, args, title, text, parent, def __init__(self, callback, args, title, text, parent,
@ -164,8 +168,7 @@ class vmmAsyncJob(vmmGObjectUI):
self.async = bool(async) self.async = bool(async)
self.show_progress = bool(show_progress) self.show_progress = bool(show_progress)
self.cancel_job = cancel_back self.cancel_job = cancel_back
self.cancel_args = cancel_args or [] self.cancel_args = [self] + (cancel_args or [])
self.cancel_args = [self] + self.cancel_args
self.job_canceled = False self.job_canceled = False
self._error_info = None self._error_info = None

View File

@ -1095,11 +1095,10 @@ class vmmDomain(vmmLibvirtObject):
self.idle_add(self.force_update_status) self.idle_add(self.force_update_status)
def delete(self): def delete(self):
if self.hasSavedImage(): try:
try: self.removeSavedImage()
self._backend.managedSaveRemove(0) except:
except: logging.exception("Failed to remove managed save state")
logging.exception("Failed to remove managed save state")
self._backend.undefine() self._backend.undefine()
def resume(self): def resume(self):
@ -1115,6 +1114,11 @@ class vmmDomain(vmmLibvirtObject):
return False return False
return self._backend.hasManagedSaveImage(0) return self._backend.hasManagedSaveImage(0)
def removeSavedImage(self):
if not self.hasSavedImage():
return
self._backend.managedSaveRemove(0)
def save(self, filename=None, meter=None): def save(self, filename=None, meter=None):
self._install_abort = True self._install_abort = True

View File

@ -873,14 +873,34 @@ class vmmEngine(vmmGObject):
logging.debug("Starting vm '%s'", vm.get_name()) logging.debug("Starting vm '%s'", vm.get_name())
if vm.hasSavedImage(): if vm.hasSavedImage():
# VM will be restored, which can take some time, so show a def errorcb(error, details):
# progress dialog. # This is run from the main thread
errorintro = _("Error restoring domain") res = src.err.show_err(
_("Error restoring domain") + ": " + error,
details=details,
text2=_(
"The domain could not be restored. Would you like\n"
"to remove the saved state and perform a regular\n"
"start up?"),
dialog_type=gtk.MESSAGE_WARNING,
buttons=gtk.BUTTONS_YES_NO,
async=False)
if not res:
return
try:
vm.removeSavedImage()
self._do_run_domain(src, uri, uuid)
except Exception, e:
src.err.show_err(_("Error removing domain state: %s")
% str(e))
# VM will be restored, which can take some time, so show progress
title = _("Restoring Virtual Machine") title = _("Restoring Virtual Machine")
text = _("Restoring virtual machine memory from disk") text = _("Restoring virtual machine memory from disk")
vmmAsyncJob.simple_async(vm.startup, vmmAsyncJob.simple_async(vm.startup,
[], title, text, src, [], title, text, src, "", errorcb=errorcb)
errorintro)
else: else:
# Regular startup # Regular startup