Change in vdsm[master]: bootstrap: Return recovery error during lvm bootstrap

nsoffer at redhat.com nsoffer at redhat.com
Fri Nov 22 08:54:30 UTC 2013


Nir Soffer has uploaded a new change for review.

Change subject: bootstrap: Return recovery error during lvm bootstrap
......................................................................

bootstrap: Return recovery error during lvm bootstrap

Since lvm bootstrap is performed in a background thread, it may not be
done when vdsm is asked to connect to stoarge pool or manipulate
images. This may lead to a race when lvm bootstrap thread is
deactivating a logical volume after engine asked to activate it.

This patch use the recovery mechanisim to respond with a recovery error
until lvm bootstrap is done, keeping backward compatibility with old
clients.

Before this patch, lvm bootstrap was avoiding such races for special
logical volumes by refrshing instead of deactivating. This may not be
needed any more, and may be removed in future patch.

Change-Id: Id74468917c5b7c05d4183854e2f1255de98325dc
Signed-off-by: Nir Soffer <nsoffer at redhat.com>
---
M vdsm/BindingXMLRPC.py
M vdsm/clientIF.py
M vdsm/storage/hsm.py
3 files changed, 17 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/30/21530/1

diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py
index fcd3221..c195219 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -984,10 +984,10 @@
             # Ready to show the log into vdsm.log
             f.im_self.log.log(logLevel, logStr)
 
-            if f.im_self.cif._recovery:
-                res = errCode['recovery']
-            else:
+            if f.im_self.cif.ready:
                 res = f(*args, **kwargs)
+            else:
+                res = errCode['recovery']
             f.im_self.cif.log.log(logLevel, 'return %s with %s',
                                   f.__name__, res)
             return res
diff --git a/vdsm/clientIF.py b/vdsm/clientIF.py
index 0b67e45..ac548a8 100644
--- a/vdsm/clientIF.py
+++ b/vdsm/clientIF.py
@@ -107,6 +107,10 @@
             raise
         self._prepareBindings()
 
+    @property
+    def ready(self):
+        return (self.irs is None or self.irs.ready) and not self._recovery
+
     def contEIOVms(self, sdUUID, isDomainStateValid):
         # This method is called everytime the onDomainStateChange
         # event is emitted, this event is emitted even when a domain goes
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index c8af8b1..2fbc086 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -329,6 +329,7 @@
                            for this thread
         :type defExcFun: function
         """
+        self._ready = False
         rm.ResourceManager.getInstance().registerNamespace(
             STORAGE, rm.SimpleResourceFactory())
         self.storage_repository = config.get('irs', 'repository')
@@ -374,7 +375,11 @@
             self.log.warn("Failed to clean Storage Repository.", exc_info=True)
 
         def storageRefresh():
-            lvm.bootstrap(refreshlvs=blockSD.SPECIAL_LVS)
+            try:
+                lvm.bootstrap(blockSD.SPECIAL_LVS)
+            finally:
+                self._ready = True
+
             sdCache.refreshStorage()
 
             fileUtils.createdir(self.tasksDir)
@@ -405,6 +410,10 @@
         monitorInterval = config.getint('irs', 'sd_health_check_delay')
         self.domainMonitor = domainMonitor.DomainMonitor(monitorInterval)
 
+    @property
+    def ready(self):
+        return self._ready
+
     @public
     def registerDomainStateChangeCallback(self, callbackFunc):
         """


-- 
To view, visit http://gerrit.ovirt.org/21530
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id74468917c5b7c05d4183854e2f1255de98325dc
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Nir Soffer <nsoffer at redhat.com>


More information about the vdsm-patches mailing list