Nir Soffer has uploaded a new change for review. Change subject: monitor: Eliminate nextStatus instance variable ......................................................................
monitor: Eliminate nextStatus instance variable Preparing for separate domain status, collected by the monitor thread and path status, collected by the path checking thread. Status is created now in _monitorDomain and passed to collecting methods for adding status. Change-Id: Ida732918625c7eb0f12bbbcaeaaa84aea1c3af86 Signed-off-by: Nir Soffer <[email protected]> --- M vdsm/storage/monitor.py 1 file changed, 33 insertions(+), 34 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/86/56886/1 diff --git a/vdsm/storage/monitor.py b/vdsm/storage/monitor.py index 5f16a7e..f2f026d 100644 --- a/vdsm/storage/monitor.py +++ b/vdsm/storage/monitor.py @@ -201,8 +201,10 @@ self.hostId = hostId self.interval = interval self.monitoringPath = None - self.nextStatus = Status(actual=False) - self.status = FrozenStatus(self.nextStatus) + # For backward compatibility, we must present a fake status before + # collecting the first sample. The fake status is marked as + # actual=False so engine can handle it correctly. + self.status = FrozenStatus(Status(actual=False)) self.isIsoDomain = None self.isoPrefix = None self.lastRefresh = time.time() @@ -254,7 +256,7 @@ self.stopEvent.wait(self.interval) def _monitorDomain(self): - self.nextStatus = Status() + status = Status() # Pick up changes in the domain, for example, domain upgrade. if self._shouldRefreshDomain(): @@ -276,35 +278,35 @@ self._setIsoDomainInfo() self._performDomainSelftest() - self._checkReadDelay() - self._collectStatistics() + self._checkReadDelay(status) + self._collectStatistics(status) except Exception as e: log.exception("Error monitoring domain %s", self.sdUUID) - self.nextStatus.error = e + status.error = e - self.nextStatus.checkTime = time.time() + status.checkTime = time.time() - if self._statusDidChange(): - self._notifyStatusChanges() + if self._statusDidChange(status): + self._notifyStatusChanges(status) - if self._shouldAcquireHostId(): + if self._shouldAcquireHostId(status): self._acquireHostId() - self.status = FrozenStatus(self.nextStatus) + self.status = FrozenStatus(status) # Notifiying status changes - def _statusDidChange(self): + def _statusDidChange(self, status): return (not self.status.actual or - self.status.valid != self.nextStatus.valid) + self.status.valid != status.valid) @utils.cancelpoint - def _notifyStatusChanges(self): + def _notifyStatusChanges(self, status): log.info("Domain %s became %s", self.sdUUID, - "VALID" if self.nextStatus.valid else "INVALID") + "VALID" if status.valid else "INVALID") try: self.domainMonitor.onDomainStateChange.emit( - self.sdUUID, self.nextStatus.valid) + self.sdUUID, status.valid) except: log.exception("Error notifying state change for domain %s", self.sdUUID) @@ -346,38 +348,35 @@ self.domain.selftest() @utils.cancelpoint - def _checkReadDelay(self): + def _checkReadDelay(self, status): # This may block for long time if the storage server is not accessible. # On overloaded machines we have seen this take up to 15 seconds. stats = misc.readspeed(self.monitoringPath, 4096) - self.nextStatus.readDelay = stats['seconds'] + status.readDelay = stats['seconds'] - def _collectStatistics(self): + def _collectStatistics(self, status): stats = self.domain.getStats() - self.nextStatus.diskUtilization = (stats["disktotal"], - stats["diskfree"]) + status.diskUtilization = (stats["disktotal"], stats["diskfree"]) - self.nextStatus.vgMdUtilization = (stats["mdasize"], - stats["mdafree"]) - - self.nextStatus.vgMdHasEnoughFreeSpace = stats["mdavalid"] - self.nextStatus.vgMdFreeBelowThreashold = stats["mdathreshold"] + status.vgMdUtilization = (stats["mdasize"], stats["mdafree"]) + status.vgMdHasEnoughFreeSpace = stats["mdavalid"] + status.vgMdFreeBelowThreashold = stats["mdathreshold"] masterStats = self.domain.validateMaster() - self.nextStatus.masterValid = masterStats['valid'] - self.nextStatus.masterMounted = masterStats['mount'] + status.masterValid = masterStats['valid'] + status.masterMounted = masterStats['mount'] - self.nextStatus.hasHostId = self.domain.hasHostId(self.hostId) - self.nextStatus.isoPrefix = self.isoPrefix - self.nextStatus.version = self.domain.getVersion() + status.hasHostId = self.domain.hasHostId(self.hostId) + status.isoPrefix = self.isoPrefix + status.version = self.domain.getVersion() # Managing host id - def _shouldAcquireHostId(self): + def _shouldAcquireHostId(self, status): # An ISO domain can be shared by multiple pools return (not self.isIsoDomain and - self.nextStatus.valid and - self.nextStatus.hasHostId is False) + status.valid and + status.hasHostId is False) def _shouldReleaseHostId(self): # If this is an ISO domain we didn't acquire the host id and releasing -- To view, visit https://gerrit.ovirt.org/56886 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ida732918625c7eb0f12bbbcaeaaa84aea1c3af86 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Nir Soffer <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
