[Kimchi-devel] [PATCH v2] [Kimchi] Ignore pool.refresh if it cannot be called

Rodrigo Trujillo rodrigo.trujillo at linux.vnet.ibm.com
Thu Dec 17 16:10:40 UTC 2015


Reviewed-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>

On 12/17/2015 11:22 AM, Jose Ricardo Ziviani wrote:
>   - When creating full allocated images in older filesystems such ext3,
>     Libvirt will do a huge number of IO operations by writing 0's in the
>     whole image file. During this time, the pool where the volume is
>     being allocated cannot be refreshed due to some concurrent issue
>     that Libvirt fixes by raising an exception to any call made to
>     refresh.
>
>     This commit simply ignores such refresh calls if Libvirt raises
>     exception from it. Thus, the frontend will still be able to list
>     all volumes in the pool, include the volume being created.
>
> Signed-off-by: Jose Ricardo Ziviani <joserz at linux.vnet.ibm.com>
> ---
>   i18n.py                 |  2 --
>   model/storagepools.py   | 27 +++++++++------------------
>   model/storagevolumes.py |  8 +++-----
>   3 files changed, 12 insertions(+), 25 deletions(-)
>
> diff --git a/i18n.py b/i18n.py
> index cf67085..7f11245 100644
> --- a/i18n.py
> +++ b/i18n.py
> @@ -187,7 +187,6 @@ messages = {
>       "KCHPOOL0005E": _("Unable to delete active storage pool %(name)s"),
>       "KCHPOOL0006E": _("Unable to list storage pools. Details: %(err)s"),
>       "KCHPOOL0007E": _("Unable to create storage pool %(name)s. Details: %(err)s"),
> -    "KCHPOOL0008E": _("Unable to get number of storage volumes in storage pool %(name)s. Details: %(err)s"),
>       "KCHPOOL0009E": _("Unable to activate storage pool %(name)s. Details: %(err)s"),
>       "KCHPOOL0010E": _("Unable to deactivate storage pool %(name)s. Details: %(err)s"),
>       "KCHPOOL0011E": _("Unable to delete storage pool %(name)s. Details: %(err)s"),
> @@ -225,7 +224,6 @@ messages = {
>       "KCHVOL0004E": _("Specify %(item)s in order to create storage volume %(volume)s"),
>       "KCHVOL0006E": _("Unable to list storage volumes because storage pool %(pool)s is not active"),
>       "KCHVOL0007E": _("Unable to create storage volume %(name)s in storage pool %(pool)s. Details: %(err)s"),
> -    "KCHVOL0008E": _("Unable to list storage volumes in storage pool %(pool)s. Details: %(err)s"),
>       "KCHVOL0009E": _("Unable to wipe storage volumes %(name)s. Details: %(err)s"),
>       "KCHVOL0010E": _("Unable to delete storage volume %(name)s. Details: %(err)s"),
>       "KCHVOL0011E": _("Unable to resize storage volume %(name)s. Details: %(err)s"),
> diff --git a/model/storagepools.py b/model/storagepools.py
> index ddfa7fa..4861df0 100644
> --- a/model/storagepools.py
> +++ b/model/storagepools.py
> @@ -283,25 +283,16 @@ class StoragePoolModel(object):
>                   raise
>
>       def _get_storagepool_vols_num(self, pool):
> -        try:
> -            if pool.isActive():
> -                pool.refresh(0)
> -                return pool.numOfVolumes()
> -            else:
> -                return 0
> -        except libvirt.libvirtError as e:
> -            # If something (say a busy pool) prevents the refresh,
> -            # throwing an Exception here would prevent all pools from
> -            # displaying information -- so return None for busy
> -            wok_log.error("ERROR: Storage Pool get vol count: %s "
> -                          % e.get_error_message())
> -            wok_log.error("ERROR: Storage Pool get vol count error no: %s "
> -                          % e.get_error_code())
> +        if not pool.isActive():
>               return 0
> -        except Exception as e:
> -            raise OperationFailed("KCHPOOL0008E",
> -                                  {'name': pool.name(),
> -                                   'err': e.get_error_message()})
> +
> +        try:
> +            pool.refresh(0)
> +
> +        except Exception, e:
> +            wok_log.error("Pool refresh failed: %s" % str(e))
> +
> +        return pool.numOfVolumes()
>
>       def _get_storage_source(self, pool_type, pool_xml):
>           source = {}
> diff --git a/model/storagevolumes.py b/model/storagevolumes.py
> index 4e28712..ecbf51e 100644
> --- a/model/storagevolumes.py
> +++ b/model/storagevolumes.py
> @@ -261,11 +261,9 @@ class StorageVolumesModel(object):
>               raise InvalidOperation("KCHVOL0006E", {'pool': pool_name})
>           try:
>               pool.refresh(0)
> -            return sorted(map(lambda x: x.decode('utf-8'), pool.listVolumes()))
> -        except libvirt.libvirtError as e:
> -            raise OperationFailed("KCHVOL0008E",
> -                                  {'pool': pool_name,
> -                                   'err': e.get_error_message()})
> +        except Exception, e:
> +            wok_log.error("Pool refresh failed: %s" % str(e))
> +        return sorted(map(lambda x: x.decode('utf-8'), pool.listVolumes()))
>
>
>   class StorageVolumeModel(object):




More information about the Kimchi-devel mailing list