diff --git a/cloudcontrol/node/hypervisor/lib.py b/cloudcontrol/node/hypervisor/lib.py index 30a9a2fad0b11d62484e5c9611be5d05dc00ca9e..c3bc1f21274c90b2158a1ba9d52d474078da198d 100644 --- a/cloudcontrol/node/hypervisor/lib.py +++ b/cloudcontrol/node/hypervisor/lib.py @@ -17,6 +17,7 @@ """Helpers for libvirt.""" import logging +import time from itertools import chain, imap, count from StringIO import StringIO from xml.etree import cElementTree as et @@ -303,7 +304,7 @@ class StorageIndex(object): self.paths = None self.update() - def update(self): + def update(self, retry=1): """Update storage pools and volumes.""" # go through all storage pools and check if it is already in the index for lv_storage in imap( @@ -315,7 +316,7 @@ class StorageIndex(object): ): if lv_storage.name() in self.storages: # update - self.storages[lv_storage.name()].update() + self.storages[lv_storage.name()].update(retry) else: # add storage pool s = Storage(lv_storage) @@ -416,6 +417,7 @@ class Storage(object): """Storage abstraction.""" SHARED_TYPES = ['rbd'] + REFRESH_RETRY_INTERVAL = 1 def __init__(self, lv_storage): """ @@ -438,9 +440,17 @@ class Storage(object): def is_shared(self): return True if self.type in Storage.SHARED_TYPES else False - def update(self): + def update(self, retry=1): + for _ in xrange(retry): + try: + self.lv_storage.refresh() + except libvirt.libvirtError as err: + logger.warning('Unable to refresh storage %s: %s', self.name, err) + time.sleep(self.REFRESH_RETRY_INTERVAL) + else: + break + try: - self.lv_storage.refresh() self.update_attr() # update volumes