[Kimchi-devel] [PATCH 5/5] Fix 'disk full' issue: Fix vms/screenshot db store/delete error handling
Rodrigo Trujillo
rodrigo.trujillo at linux.vnet.ibm.com
Tue Mar 25 20:07:06 UTC 2014
On 03/25/2014 03:48 PM, Aline Manera wrote:
> On 03/24/2014 05:53 PM, Rodrigo Trujillo wrote:
>> When creating, running or deleting a vm, it uses the database to store
>> vm and screenshot information. If the disk is full, Kimchi will raise
>> errors constantly and UI will be useless. This patch fixes this problem,
>> omitting from UI and logging in the backend. So, user is still able to
>> create, start and stop a vm.
>>
>> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
>> ---
>> src/kimchi/model/vms.py | 68
>> ++++++++++++++++++++++++++++++++++---------------
>> 1 file changed, 48 insertions(+), 20 deletions(-)
>>
>> diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
>> index d29b811..05fd67e 100644
>> --- a/src/kimchi/model/vms.py
>> +++ b/src/kimchi/model/vms.py
>> @@ -34,6 +34,7 @@ from kimchi.model.config import CapabilitiesModel
>> from kimchi.model.templates import TemplateModel
>> from kimchi.model.utils import get_vm_name
>> from kimchi.screenshot import VMScreenshot
>> +from kimchi.utils import kimchi_log
>> from kimchi.utils import run_setfacl_set_attr, template_name_from_uri
>>
>>
>> @@ -181,6 +182,18 @@ class VMsModel(object):
>>
>> t.validate()
>>
>> + # Store the icon for displaying later
>> + icon = t.info.get('icon')
>> + if icon:
>> + try:
>> + with self.objstore as session:
>> + session.store('vm', vm_uuid, {'icon': icon})
>> + except Exception as e:
>> + # It is possible to continue Kimchi executions
>> without store
>> + # vm icon info
>> + kimchi_log.error('Error trying to update database
>> with guest '
>> + 'icon information due error: %s', e.message)
>> +
>> # If storagepool is SCSI, volumes will be LUNs and must be
>> passed by
>> # the user from UI or manually.
>> vol_list = []
>> @@ -196,12 +209,6 @@ class VMsModel(object):
>> else:
>> vol_list = t.fork_vm_storage(vm_uuid)
>>
>> - # Store the icon for displaying later
>> - icon = t.info.get('icon')
>> - if icon:
>> - with self.objstore as session:
>> - session.store('vm', vm_uuid, {'icon': icon})
>> -
>> graphics = params.get('graphics')
>> xml = t.to_vm_xml(name, vm_uuid,
>> libvirt_stream_protocols=self.caps.libvirt_stream_protocols,
>> @@ -361,9 +368,13 @@ class VMModel(object):
>> pool_type = xmlutils.xpath_get_text(xml, "/pool/@type")[0]
>> if pool_type not in READONLY_POOL_TYPE:
>> vol.delete(0)
>> -
>> - with self.objstore as session:
>> - session.delete('vm', dom.UUIDString(), ignore_missing=True)
>> + try:
>> + with self.objstore as session:
>> + session.delete('vm', dom.UUIDString(),
>> ignore_missing=True)
>> + except Exception as e:
>> + # It is possible to delete vm without delete its
>> database info
>> + kimchi_log.error('Error deleting vm information from
>> database: '
>> + '%s', e.message)
>>
>> vnc.remove_proxy_token(name)
>>
>> @@ -419,9 +430,14 @@ class VMModel(object):
>> screenshot = VMScreenshotModel.get_screenshot(vm_uuid,
>> self.objstore,
>> self.conn)
>> screenshot.delete()
>> - with self.objstore as session:
>> - session.delete('screenshot', vm_uuid)
>> -
>> + try:
>> + with self.objstore as session:
>> + session.delete('screenshot', vm_uuid)
>> + except Exception as e:
>> + # It is possible to continue Kimchi executions without
>> delete
>> + # screenshots
>> + kimchi_log.error('Error trying to delete vm screenshot
>> from '
>> + 'database due error: %s', e.message)
>>
>> class VMScreenshotModel(object):
>> def __init__(self, **kargs):
>> @@ -438,18 +454,30 @@ class VMScreenshotModel(object):
>> screenshot = self.get_screenshot(vm_uuid, self.objstore,
>> self.conn)
>> img_path = screenshot.lookup()
>> # screenshot info changed after scratch generation
>> - with self.objstore as session:
>> - session.store('screenshot', vm_uuid, screenshot.info)
>> + try:
>> + with self.objstore as session:
>> + session.store('screenshot', vm_uuid, screenshot.info)
>> + except Exception as e:
>> + # It is possible to continue Kimchi executions without
>> store
>> + # screenshots
>> + kimchi_log.error('Error trying to update database with
>> guest '
>> + 'screenshot information due error: %s', e.message)
>> return img_path
>>
>> @staticmethod
>> def get_screenshot(vm_uuid, objstore, conn):
>> - with objstore as session:
>> - try:
>> - params = session.get('screenshot', vm_uuid)
>> - except NotFoundError:
>> - params = {'uuid': vm_uuid}
>> - session.store('screenshot', vm_uuid, params)
>
>> + try:
>> + with objstore as session:
>> + try:
>> + params = session.get('screenshot', vm_uuid)
>> + except NotFoundError:
>> + params = {'uuid': vm_uuid}
>> + session.store('screenshot', vm_uuid, params)
>> + except Exception as e:
>> + # It is possible to continue Kimchi vm executions without
>> + # screenshots
>> + kimchi_log.error('Error trying to update database with
>> guest '
>> + 'screenshot information due error: %s', e.message)
>> return LibvirtVMScreenshot(params, conn)
>>
>
> Same I commented in a previous patch.
> Use the existent try/except block and only add a new "except"
> statement for your proposals.
>
>
Same answer as before :)
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>
More information about the Kimchi-devel
mailing list