Federico Simoncelli has uploaded a new change for review.
Change subject: sp: asynchronous convertDomain in activateSD
......................................................................
sp: asynchronous convertDomain in activateSD
Change-Id: I679a992f689ee6ae97c82c267d0da69b4f0e6725
Signed-off-by: Federico Simoncelli <fsimonce(a)redhat.com>
---
M vdsm/storage/hsm.py
M vdsm/storage/sp.py
2 files changed, 42 insertions(+), 35 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/34/13634/1
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index ae35b11..5471c54 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -3396,7 +3396,9 @@
def upgradeStoragePool(self, spUUID, targetDomVersion):
targetDomVersion = int(targetDomVersion)
pool = self.getPool(spUUID)
- pool._upgradePool(targetDomVersion)
+ # TODO: this request should become asynchronous using a task
+ pool._upgradeMasterDomain(targetDomVersion)
+ pool._upgradeRegularDomains()
return {"upgradeStatus": "started"}
@public
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index fe54dd9..374c948 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -119,7 +119,7 @@
Securable.__init__(self)
self._formatConverter = DefaultFormatConverter()
- self._domainsToUpgrade = []
+ self._domainsToUpgrade = set()
self.lock = threading.RLock()
self._setUnsafe()
self.spUUID = str(spUUID)
@@ -207,14 +207,6 @@
return
self._domainsToUpgrade.remove(sdUUID)
- if len(self._domainsToUpgrade) == 0:
- self.log.debug("All domains are upgraded, unregistering "
- "from state change event")
- try:
- self.domainMonitor.onDomainConnectivityStateChange.\
- unregister(self._upgradeCallback)
- except KeyError:
- pass
@unsecured
def startSpm(self, prevID, prevLVER, scsiFencing, maxHostID,
@@ -287,8 +279,9 @@
PMDK_SPM_ID: self.id}, __securityOverride=True)
self._maxHostID = maxHostID
- # Upgrade the master domain now if needed
- self._upgradePool(expectedDomVersion, __securityOverride=True)
+ # Upgrade the master domain now
+ self._upgradeMasterDomain(expectedDomVersion,
+ __securityOverride=True)
self.masterDomain.mountMaster()
self.masterDomain.createMasterTree()
@@ -308,6 +301,10 @@
# Once setSafe completes we are running as SPM
self._setSafe()
+
+ # Upgrade all the remaining domains
+ self._startUpUpgrade()
+ self._upgradeRegularDomains()
# Mailbox issues SPM commands, therefore we start it AFTER spm
# commands are allowed to run to prevent a race between the
@@ -346,11 +343,17 @@
raise
@unsecured
+ def _startUpUpgrade(self):
+ self.log.debug("Registering with state change event")
+ self.domainMonitor.onDomainConnectivityStateChange.register(
+ self._upgradeCallback)
+
+ @unsecured
def _shutDownUpgrade(self):
self.log.debug("Shutting down upgrade process")
with rmanager.acquireResource(STORAGE, "upgrade_" + self.spUUID,
rm.LockType.exclusive):
- domains = self._domainsToUpgrade[:]
+ domains = set(self._domainsToUpgrade)
try:
self.domainMonitor.onDomainConnectivityStateChange.unregister(
self._upgradeCallback)
@@ -434,7 +437,28 @@
self.spmRole = SPM_FREE
- def _upgradePool(self, targetDomVersion):
+ def _upgradeRegularDomains(self):
+ with rmanager.acquireResource(STORAGE, "upgrade_" + self.spUUID,
+ rm.LockType.exclusive):
+ regularDomains = set(self.getDomains(activeOnly=True).keys())
+
+ try:
+ regularDomains.remove(self.masterDomain.sdUUID)
+ except ValueError:
+ pass
+
+ # Removing the domains that are already in the upgrade process
+ sdUUIDThreadsToStart = regularDomains - self._domainsToUpgrade
+
+ self.log.debug("Marking all domains for upgrade")
+ self._domainsToUpgrade.update(regularDomains)
+
+ for sdUUID in sdUUIDThreadsToStart:
+ self.log.debug("Running upgrade thread for domain %s", sdUUID)
+ threading.Thread(
+ target=self._upgradeCallback, args=(sdUUID, True)).start()
+
+ def _upgradeMasterDomain(self, targetDomVersion):
with rmanager.acquireResource(STORAGE, "upgrade_" + self.spUUID,
rm.LockType.exclusive):
if len(self._domainsToUpgrade) > 0:
@@ -446,22 +470,6 @@
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.debug("Registering with state change event")
- self.domainMonitor.onDomainConnectivityStateChange.register(
- self._upgradeCallback)
- self.log.debug("Running initial domain upgrade threads")
- for sdUUID in self._domainsToUpgrade:
- threading.Thread(target=self._upgradeCallback,
- args=(sdUUID, True),
- kwargs={"__securityOverride": True}).start()
@unsecured
def __createMailboxMonitor(self):
@@ -1109,15 +1117,12 @@
if domainStatuses[sdUUID] == sd.DOM_ACTIVE_STATUS:
return True
- # Domain conversion requires the links to be present
- self._refreshDomainLinks(dom)
- if dom.getDomainClass() == sd.DATA_DOMAIN:
- self._convertDomain(dom)
-
dom.activate()
# set domains also do rebuild
domainStatuses[sdUUID] = sd.DOM_ACTIVE_STATUS
self.setMetaParam(PMDK_DOMAINS, domainStatuses)
+ self._refreshDomainLinks(dom)
+ self._upgradeRegularDomains()
self.updateMonitoringThreads()
return True
--
To view, visit
http://gerrit.ovirt.org/13634
To unsubscribe, visit
http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I679a992f689ee6ae97c82c267d0da69b4f0e6725
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimonce(a)redhat.com>