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@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@redhat.com