Change in vdsm[master]: sp: allow executing upgradePool even if there is a pending u...

laravot at redhat.com laravot at redhat.com
Sun Sep 6 19:13:20 UTC 2015


Liron Aravot has uploaded a new change for review.

Change subject: sp: allow executing upgradePool even if there is a pending update
......................................................................

sp: allow executing upgradePool even if there is a pending update

Currently when a pool upgrade is initated (either by startSpm() or by
executing upgradePool() explicitly) the _domainsToUpgrade member of the
storage pool is initiated with the active domains, when each domain
upgrade is completed (or if the upgrade is unneeded) its id is removed
from that list.
When there is an unavailable domain, it'll remain on that list until its
update is complete - while it's unavailable other upgrade can't be
executed.
This patch changes that, we should allow upgrading the pool even if an
older upgrade wasn't complete yet - the domains that the old update
wasn't completed yet for will be upgraded to the new version.

Change-Id: I3c30439b5b84f64fd2ad69d82f33dfdfc4c9ef68
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1260428
Signed-off-by: Liron Aravot <laravot at redhat.com>
---
M vdsm/storage/sp.py
M vdsm/storage/storage_exception.py
2 files changed, 30 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/74/45774/1

diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index b6d7794..90804b4 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -425,22 +425,36 @@
     def _upgradePool(self, targetDomVersion):
         with rmanager.acquireResource(STORAGE, "upgrade_" + self.spUUID,
                                       rm.LockType.exclusive):
-            if len(self._domainsToUpgrade) > 0:
-                raise se.PoolUpgradeInProgress(self.spUUID)
+            acquiredDomainResources = []
 
             sd.validateDomainVersion(targetDomVersion)
-            self.log.info("Trying to upgrade master domain `%s`",
-                          self.masterDomain.sdUUID)
-            with rmanager.acquireResource(STORAGE, self.masterDomain.sdUUID,
-                                          rm.LockType.exclusive):
-                self._convertDomain(self.masterDomain, str(targetDomVersion))
-
-            self.log.debug("Marking all domains for upgrade")
-            self._domainsToUpgrade = self.getDomains(activeOnly=True).keys()
             try:
-                self._domainsToUpgrade.remove(self.masterDomain.sdUUID)
-            except ValueError:
-                pass
+                self.log.info("Trying to lock domains that are currently pending for an update")
+                for sdUUID in self._domainsToUpgrade:
+                    try:
+                        res = rmanager.acquireResource(STORAGE, "upgrade_" + sdUUID,
+                                                       rm.LockType.exclusive)
+                    except (rm.RequestTimedOutError, se.ResourceAcqusitionFailed):
+                        self.log.info("Cannot acquire domain upgrade resource '%s'", str(sdUUID))
+                        raise se.PoolUpgradeInProgress(self.spUUID, self.sdUUID)
+                    else:
+                        acquiredDomainResources.add(res)
+
+                self.log.info("Trying to upgrade master domain `%s`",
+                              self.masterDomain.sdUUID)
+                with rmanager.acquireResource(STORAGE, self.masterDomain.sdUUID,
+                                              rm.LockType.exclusive):
+                    self._convertDomain(self.masterDomain, str(targetDomVersion))
+
+                self.log.debug("Marking all domains for upgrade")
+                self._domainsToUpgrade = self.getDomains(activeOnly=True).keys()
+                try:
+                    self._domainsToUpgrade.remove(self.masterDomain.sdUUID)
+                except ValueError:
+                    pass
+            finally:
+                for res in acquiredDomainResources:
+                    res.release()
 
             self.log.debug("Registering with state change event")
             self.domainMonitor.onDomainStateChange.register(
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index be6f26b..08fb1ff 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -880,10 +880,10 @@
 
 
 class PoolUpgradeInProgress(StorageException):
-    def __init__(self, spUUID):
+    def __init__(self, spUUID, sdUUID):
         self.value = ""
-        self.message = ("Upgrading a pool while an upgrade is in process is "
-                        "unsupported (pool: `%s`)" % (spUUID,))
+        self.message = ("Can't upgrade the pool as an automatic domain upgrade is in process "
+                        "(pool: `%s`, domain: '%s')" % (spUUID, sdUUID))
     code = 396
 
 


-- 
To view, visit https://gerrit.ovirt.org/45774
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3c30439b5b84f64fd2ad69d82f33dfdfc4c9ef68
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Liron Aravot <laravot at redhat.com>


More information about the vdsm-patches mailing list