Ovirt程序员

【Ovirt 笔记】资源信息状态刷新实现分析与整理(1)(持续更

2018-10-08  本文已影响8人  58bc06151329

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

分析整理的版本为 Ovirt 3.4.5Ovirt 4.2.3 版本。

1. 数据中心

1.1 状态说明

数据中心状态 说明
Uninitialized 未初始化 0
Up 运行 1
Maintenance 维护 2
NotOperational 不可操作 3
NonResponsive 无响应 4
Contend 竞争 5

1.1.1 Uninitialized

protected void addStoragePoolToDb() {
        getStoragePool().setId(Guid.newGuid());
        getStoragePool().setStatus(StoragePoolStatus.Uninitialized);
        getStoragePoolDAO().save(getStoragePool());
}

1.1.2 Up

DbFacade.getInstance().getStoragePoolDao().updateStatus(storagePool.getId(), StoragePoolStatus.Up);
storagePool.setStatus(StoragePoolStatus.Up);
ResourceManager.getInstance().getEventListener().storagePoolStatusChanged(storagePool.getId(), storagePool.getStatus());
 StoragePoolStatus newStatus =
                (masterDomain == null) ? StoragePoolStatus.Uninitialized
                        : (masterDomain.getStatus() != null && masterDomain.getStatus() == StorageDomainStatus.Maintenance) ? StoragePoolStatus.Maintenance
                                : (masterDomain.getStatus() != null && masterDomain.getStatus() == StorageDomainStatus.Active) ? StoragePoolStatus.Up
                                        : StoragePoolStatus.NonResponsive;
        if (newStatus != getStoragePool().getStatus()) {
            getCompensationContext().snapshotEntity(getStoragePool());
            getStoragePool().setStatus(newStatus);
......
StoragePoolStatusHandler.poolStatusChanged(getStoragePool().getId(), getStoragePool().getStatus());

1.1.3 Maintenance

TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() {
         @Override
         public Object runInTransaction() {
              getStoragePool().setStatus(StoragePoolStatus.Maintenance);
              getStoragePool().setStoragePoolFormatType(masterStorageDomain.getStorageFormat());
              DbFacade.getInstance().getStoragePoolDao().update(getStoragePool());
              getCompensationContext().stateChanged();
              StoragePoolStatusHandler.poolStatusChanged(getStoragePool().getId(), getStoragePool().getStatus());
              return null;
         }
});
executeInNewTransaction(new TransactionMethod<Object>() {
        @Override
        public Object runInTransaction() {
            getCompensationContext().snapshotEntityStatus(getStoragePool());
            getStoragePool().setStatus(StoragePoolStatus.Maintenance);
            getStoragePoolDAO().updateStatus(getStoragePool().getId(), getStoragePool().getStatus());
            getCompensationContext().stateChanged();
            return null;
        }
});
StoragePoolStatusHandler.poolStatusChanged(getStoragePool().getId(), getStoragePool().getStatus());
StoragePoolStatus newStatus =
                (masterDomain == null) ? StoragePoolStatus.Uninitialized
                        : (masterDomain.getStatus() != null && masterDomain.getStatus() == StorageDomainStatus.Maintenance) ? StoragePoolStatus.Maintenance
                                : (masterDomain.getStatus() != null && masterDomain.getStatus() == StorageDomainStatus.Active) ? StoragePoolStatus.Up
                                        : StoragePoolStatus.NonResponsive;
if (newStatus != getStoragePool().getStatus()) {
            getCompensationContext().snapshotEntity(getStoragePool());
            getStoragePool().setStatus(newStatus);
......
StoragePoolStatusHandler.poolStatusChanged(getStoragePool().getId(), getStoragePool().getStatus());
if (data.getStatus() != null && data.getStatus() == StorageDomainStatus.InActive && domainFromDb.getStorageDomainType() == StorageDomainType.Master) {
           StoragePool pool = DbFacade.getInstance().getStoragePoolDao().get(domainPoolMap.getstorage_pool_id());
           if (pool != null) {
                  DbFacade.getInstance().getStoragePoolDao().updateStatus(pool.getId(), StoragePoolStatus.Maintenance);
                  pool.setStatus(StoragePoolStatus.Maintenance);
                  ResourceManager.getInstance().getEventListener().storagePoolStatusChanged(pool.getId(), StoragePoolStatus.Maintenance);
           }
}

1.1.4 NotOperational

if (getVds().getSpmStatus() != VdsSpmStatus.None) {
            log.infoFormat("Fence failed on vds {0} which is spm of pool {1} - moving pool to non operational", getVds().getName(), getVds().getStoragePoolId());
            Backend.getInstance().runInternalAction(VdcActionType.SetStoragePoolStatus, new SetStoragePoolStatusParameters(getVds().getStoragePoolId(), StoragePoolStatus.NotOperational, AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_NO_HOST_FOR_SPM));
}

1.1.5 NonResponsive

getParameters().setStorageDomainId(getMasterDomainIdFromDb());
StoragePoolIsoMap domainPoolMap = new StoragePoolIsoMap(getParameters().getNewMasterDomainId(), getParameters().getStoragePoolId(), StorageDomainStatus.Active);
DbFacade.getInstance().getStoragePoolIsoMapDao().save(domainPoolMap);

getParameters().setVdsId(getVds().getId());
VdcReturnValueBase returnVal = getBackend().runInternalAction(VdcActionType.ReconstructMasterDomain, getParameters());

boolean reconstructVerbExecuted = (returnVal.getActionReturnValue() != null) ? (Boolean) returnVal.getActionReturnValue() : false;

getStoragePoolDAO().updateStatus(getStoragePool().getId(), StoragePoolStatus.NonResponsive);
StoragePoolStatus newStatus =
                (masterDomain == null) ? StoragePoolStatus.Uninitialized
                        : (masterDomain.getStatus() != null && masterDomain.getStatus() == StorageDomainStatus.Maintenance) ? StoragePoolStatus.Maintenance
                                : (masterDomain.getStatus() != null && masterDomain.getStatus() == StorageDomainStatus.Active) ? StoragePoolStatus.Up
                                        : StoragePoolStatus.NonResponsive;
        if (newStatus != getStoragePool().getStatus()) {
            getCompensationContext().snapshotEntity(getStoragePool());
            getStoragePool().setStatus(newStatus);
......
StoragePoolStatusHandler.poolStatusChanged(getStoragePool().getId(), getStoragePool().getStatus());
if (spmStatus.argvalue == null || spmStatus.argvalue.getSpmStatus() != SpmStatus.SPM) {
      movePoolToProblematicInDB(storagePool);
......
private void movePoolToProblematicInDB(StoragePool storagePool) {
      ResourceManager.getInstance().getEventListener().storagePoolStatusChange(storagePool.getId(), StoragePoolStatus.NonResponsive, AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_PROBLEMATIC, VdcBllErrors.ENGINE);

      storagePool.setspm_vds_id(null);
      DbFacade.getInstance().getStoragePoolDao().update(storagePool);
}
private StoragePoolStatusHandler scheduleTimeout() {
        scheduledTask = schedulerService.schedule(this::handleTimeout,
                Config.<Long>getValue(ConfigValues.StoragePoolNonOperationalResetTimeoutInMin),
                TimeUnit.MINUTES);

        return this;
}
......
private static void nonOperationalPoolTreatment(StoragePool pool) {
        boolean changeStatus = false;
        if (getAllRunningVdssInPool(pool).size() > 0) {
            changeStatus = true;
        }
        if (changeStatus) {
            log.info("Moving data center '{}' with Id '{}' to status Problematic from status NotOperational on a one"
                    + " time basis to try to recover",
                    pool.getName(),
                    pool.getId());
            Backend.getInstance().runInternalAction(
                    ActionType.SetStoragePoolStatus,
                    new SetStoragePoolStatusParameters(pool.getId(), StoragePoolStatus.NonResponsive,
                            AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_PROBLEMATIC_FROM_NON_OPERATIONAL));
            synchronized (nonOperationalPools) {
                nonOperationalPools.remove(pool.getId());
            }
        }
}

1.1.6 Contend

storagePool.setStatus(StoragePoolStatus.Contend);
storagePool.setspm_vds_id(selectedVds.argvalue.getId());

TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() {
         @Override
         public Object runInTransaction() {
                DbFacade.getInstance().getStoragePoolDao().update(storagePool);
                return null;
         }
});

2. 存储域

2.1 状态说明

存储域状态 说明 版本
Unknown 未知 0 3.4.5/4.2.3
Uninitialized 未初始化 1 3.4.5/4.2.3
Unattached 未连接 2 3.4.5/4.2.3
Active 激活 3 3.4.5/4.2.3
InActive 正在激活 4 3.4.5/4.2.3
Locked 锁定 5 3.4.5/4.2.3
Maintenance 维护 6 3.4.5/4.2.3
PreparingForMaintenance 准备维护 7 4.2.3
Detaching 分离过程中 8 4.2.3
Activating 激活过程中 9 4.2.3

2.1.1 Unknown

final StoragePoolIsoMap map =
                getStoragePoolIsoMapDAO().get
                        (new StoragePoolIsoMapId(getParameters().getStorageDomainId(),
                                getParameters().getStoragePoolId()));
        map.setStatus(StorageDomainStatus.Unknown);
......

2.1.2 Uninitialized

# vdsm
# /usr/share/vdsm/storage/hsm.py(3.2.4)
# /usr/lib/python2.7/site-packages/vdsm/storage/hsm.py(4.2.3)
def _getDomsStats(self, domainMonitor, doms):
        domInfo = {}
        repoStats = self._getRepoStats(domainMonitor)

        for sdUUID, sdStatus in doms.iteritems():
            # Return statistics for active domains only
            domInfo[sdUUID] = {'status': sdStatus, 'alerts': [],
                               'isoprefix': ''}
......
def getStoragePoolInfo(self, spUUID, options=None):
        """
        Gets info about a storage pool.

        :param spUUID: The UUID of the storage pool you want to get info on.
        :type spUUID: UUID
        :param options: ?

        :returns: getPool(spUUID).getInfo
        """
        vars.task.setDefaultException(
            se.StoragePoolActionError("spUUID=%s" % spUUID))
        vars.task.getSharedLock(STORAGE, spUUID)
        pool = self.getPool(spUUID)
        poolInfo = pool.getInfo()
        doms = pool.getDomains()
        domInfo = self._getDomsStats(pool.domainMonitor, doms)
......

2.1.3 Unattached

2.1.4 Active

TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() {
            @Override
            public Void runInTransaction() {
                map.setStatus(StorageDomainStatus.Active);
                DbFacade.getInstance().getStoragePoolIsoMapDao().updateStatus(map.getId(), map.getStatus());
                if (getStorageDomain().getStorageDomainType() == StorageDomainType.Master) {
                    calcStoragePoolStatusByDomainsStatus();
                }
                return null;
            }
});
executeInNewTransaction(new TransactionMethod<Object>() {
            @Override
            public Object runInTransaction() {
                if (getParameters().isInactive()) {
                    map.setStatus(StorageDomainStatus.InActive);
                } else {
                    map.setStatus(StorageDomainStatus.Maintenance);
                }
                getStoragePoolIsoMapDAO().updateStatus(map.getId(), map.getStatus());
                if (!Guid.Empty.equals(_newMasterStorageDomainId)) {
                    StoragePoolIsoMap mapOfNewMaster = getNewMaster(false).getStoragePoolIsoMapData();
                    mapOfNewMaster.setStatus(StorageDomainStatus.Active);
                    getStoragePoolIsoMapDAO().updateStatus(mapOfNewMaster.getId(), mapOfNewMaster.getStatus());
                }
                return null;
            }
});
executeInNewTransaction(new TransactionMethod<Void>() {
            public Void runInTransaction() {
                for (LUNs lun : getParameters().getLunsList()) {
                    proceedLUNInDb(lun, getStorageDomain().getStorageType(), getStorageDomain().getStorage());
                }

                setStorageDomainStatus(StorageDomainStatus.Active, null);
                getCompensationContext().resetCompensation();
                return null;
            }
});
StoragePoolIsoMap domainPoolMap = new StoragePoolIsoMap(getParameters().getNewMasterDomainId(), getParameters().getStoragePoolId(), StorageDomainStatus.Active);
DbFacade.getInstance().getStoragePoolIsoMapDao().save(domainPoolMap);

2.1.5 InActive

private boolean ActivateStorageDomains() {
        boolean returnValue = true;
        for (final Guid storageDomainId : getParameters().getStorages()) {
            StorageDomainPoolParametersBase activateParameters = new StorageDomainPoolParametersBase(storageDomainId,
                    getStoragePool().getId());
            activateParameters.setSessionId(getParameters().getSessionId());
            activateParameters.setTransactionScopeOption(TransactionScopeOption.RequiresNew);
            returnValue = Backend.getInstance()
                    .runInternalAction(VdcActionType.ActivateStorageDomain, activateParameters).getSucceeded();

            // if activate domain failed then set domain status to inactive
            if (!returnValue) {
                TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() {
                    @Override
                    public Void runInTransaction() {
                        DbFacade.getInstance()
                                .getStoragePoolIsoMapDao()
                                .updateStatus(
                                        new StoragePoolIsoMapId(storageDomainId, getStoragePool().getId()),
                                        StorageDomainStatus.InActive);
                        return null;
                    }
                });
            }
        }

        return returnValue;
}
executeInNewTransaction(new TransactionMethod<Object>() {
            @Override
            public Object runInTransaction() {
                if (getParameters().isInactive()) {
                    map.setStatus(StorageDomainStatus.InActive);
                } else {
                    map.setStatus(StorageDomainStatus.Maintenance);
                }
                getStoragePoolIsoMapDAO().updateStatus(map.getId(), map.getStatus());
                if (!Guid.Empty.equals(_newMasterStorageDomainId)) {
                    StoragePoolIsoMap mapOfNewMaster = getNewMaster(false).getStoragePoolIsoMapData();
                    mapOfNewMaster.setStatus(StorageDomainStatus.Active);
                    getStoragePoolIsoMapDAO().updateStatus(mapOfNewMaster.getId(), mapOfNewMaster.getStatus());
                }
                return null;
            }
});
setStorageDomainStatus(StorageDomainStatus.InActive, getCompensationContext());
calcStoragePoolStatusByDomainsStatus();
getCompensationContext().stateChanged();

2.1.6 Locked

if (hasConnectStorageSucceeded) {
                changeStorageDomainStatusInTransaction(StorageDomainStatus.Locked);
                for (StorageDomain domain : domains) {
                    // update info such as free space - because we switched to a different server
                    returnValueUpdatedStorageDomain = getStatsForDomain(domain);
                    if (returnValueUpdatedStorageDomain.getSucceeded()) {
                        StorageDomain updatedStorageDomain =
                                (StorageDomain) returnValueUpdatedStorageDomain.getReturnValue();
                        updatedDomains.add(updatedStorageDomain);
                    }
                }
                if (!updatedDomains.isEmpty()) {
                   updateStorageDomain(updatedDomains);
                }
}
changeStorageDomainStatusInTransaction(map,
                (getStorageDomain().getStorageDomainType() == StorageDomainType.Master) ?
                        StorageDomainStatus.Locked : StorageDomainStatus.Activating);
executeInNewTransaction(() -> {
                    map = new StoragePoolIsoMap(getStorageDomain().getId(), getParameters()
                            .getStoragePoolId(), StorageDomainStatus.Locked);
                    storagePoolIsoMapDao.save(map);
                    getCompensationContext().snapshotNewEntity(map);
                    getCompensationContext().stateChanged();
                    return null;
});
changeStorageDomainStatusInTransaction(map,
                getParameters().isInactive() ? StorageDomainStatus.Locked : StorageDomainStatus.PreparingForMaintenance);
executeInNewTransaction(() -> {
                StoragePoolIsoMap newMasterMap = newMaster.getStoragePoolIsoMapData();
                getCompensationContext().snapshotEntityUpdated(newMaster.getStorageStaticData());
                newMaster.setStorageDomainType(StorageDomainType.Master);
                if (lockNewMaster) {
                    newMasterMap.setStatus(StorageDomainStatus.Unknown);
                    getCompensationContext().snapshotEntityStatus(newMasterMap);
                    newMaster.setStatus(StorageDomainStatus.Locked);
                    storagePoolIsoMapDao.updateStatus(newMasterMap.getId(), newMasterMap.getStatus());
                }
                updateStorageDomainStaticData(newMaster.getStorageStaticData());
                getCompensationContext().snapshotEntityUpdated(getStorageDomain().getStorageStaticData());
                getStorageDomain().setStorageDomainType(StorageDomainType.Data);
                updateStorageDomainStaticData(getStorageDomain().getStorageStaticData());
                getCompensationContext().stateChanged();
                return null;
});
executeInNewTransaction(() -> {
            setStorageDomainStatus(StorageDomainStatus.Locked, getCompensationContext());
            getCompensationContext().stateChanged();
            return null;
});
changeStorageDomainStatusInTransaction(getStorageDomain().getStoragePoolIsoMapData(), StorageDomainStatus.Locked);
storageDomain.setStatus(StorageDomainStatus.Locked);
log.info(" Detach storage domain(master): Lock master storage domain");
lockStorageDomain(getStorageDomain());
log.info(" Detach storage domain(master): destroy storage pool");
......
protected void lockStorageDomain(StorageDomain storageDomain) {
        TransactionSupport.executeInNewTransaction(() -> {
            getCompensationContext().snapshotEntity(storageDomain.getStoragePoolIsoMapData());
            storageDomain.setStatus(StorageDomainStatus.Locked);
            storagePoolIsoMapDao.update(storageDomain.getStoragePoolIsoMapData());
            getCompensationContext().stateChanged();
            return null;
        });
}
protected void lockStorageDomain(StorageDomain storageDomain) {
        TransactionSupport.executeInNewTransaction(() -> {
            getCompensationContext().snapshotEntity(storageDomain.getStoragePoolIsoMapData());
            storageDomain.setStatus(StorageDomainStatus.Locked);
            storagePoolIsoMapDao.update(storageDomain.getStoragePoolIsoMapData());
            getCompensationContext().stateChanged();
            return null;
        });
}

2.1.7 Maintenance

if (isDomainUpdateRequired) {
            for (StorageDomain domain : domains) {
                for (StoragePoolIsoMap map : getStoragePoolIsoMap(domain)) {
                    restoreStateAfterUpdate(map);
                }
            }
            if (hasConnectStorageSucceeded) {
                disconnectFromStorage();
            }
}
......
protected void restoreStateAfterUpdate(StoragePoolIsoMap map) {
        updateStatus(map, StorageDomainStatus.Maintenance);
}
executeInNewTransaction(() -> {
          final StorageDomainType sdType = getStorageDomain().getStorageDomainType();
          map.setStatus(StorageDomainStatus.Maintenance);
          storagePoolIsoMapDao.updateStatus(map.getId(), map.getStatus());
......
public Object runInTransaction() {
                if (getParameters().isInactive()) {
                    map.setStatus(StorageDomainStatus.InActive);
                } else {
                    map.setStatus(StorageDomainStatus.Maintenance);
                }
                getStoragePoolIsoMapDAO().updateStatus(map.getId(), map.getStatus());
                if (!Guid.Empty.equals(_newMasterStorageDomainId)) {
                    StoragePoolIsoMap mapOfNewMaster = getNewMaster(false).getStoragePoolIsoMapData();
                    mapOfNewMaster.setStatus(StorageDomainStatus.Active);
                    getStoragePoolIsoMapDAO().updateStatus(mapOfNewMaster.getId(), mapOfNewMaster.getStatus());
                }
                return null;
            }
......

2.1.8 PreparingForMaintenance

final StoragePoolIsoMap map =
                storagePoolIsoMapDao.get
                        (new StoragePoolIsoMapId(getParameters().getStorageDomainId(),
                                getParameters().getStoragePoolId()));
        map.setStatus(StorageDomainStatus.Unknown);
        changeStorageDomainStatusInTransaction(map,
                getParameters().isInactive() ? StorageDomainStatus.Locked : StorageDomainStatus.PreparingForMaintenance);

2.1.9 Detaching

log.info("Start detach storage domain");
changeStorageDomainStatusInTransaction(getStorageDomain().getStoragePoolIsoMapData(), StorageDomainStatus.Detaching);

2.1.9 Activating

changeStorageDomainStatusInTransaction(map,(getStorageDomain().getStorageDomainType() == StorageDomainType.Master) ?StorageDomainStatus.Locked : StorageDomainStatus.Activating);

3. 主机

......
vds.setCpuSys(AssignDoubleValue(xmlRpcStruct, VdsProperties.cpu_sys));
vds.setCpuUser(AssignDoubleValue(xmlRpcStruct, VdsProperties.cpu_user));
if (vds.getCpuSys() != null && vds.getCpuUser() != null) {
     vds.setUsageCpuPercent((int) (vds.getCpuSys() + vds.getCpuUser()));
}
// CPU load reported by VDSM is in uptime-style format, i.e. normalized
// to unity, so that say an 8% load is reported as 0.08

Double d = AssignDoubleValue(xmlRpcStruct, VdsProperties.cpu_load);
d = (d != null) ? d : 0;
vds.setCpuLoad(d.doubleValue() * 100.0);
vds.setCpuIdle(AssignDoubleValue(xmlRpcStruct, VdsProperties.cpu_idle));
vds.setMemAvailable(AssignLongValue(xmlRpcStruct, VdsProperties.mem_available));
vds.setMemFree(AssignLongValue(xmlRpcStruct, VdsProperties.memFree));
vds.setMemShared(AssignLongValue(xmlRpcStruct, VdsProperties.mem_shared));

vds.setSwapFree(AssignLongValue(xmlRpcStruct, VdsProperties.swap_free));
vds.setSwapTotal(AssignLongValue(xmlRpcStruct, VdsProperties.swap_total));
vds.setKsmCpuPercent(AssignIntValue(xmlRpcStruct, VdsProperties.ksm_cpu_percent));
vds.setKsmPages(AssignLongValue(xmlRpcStruct, VdsProperties.ksm_pages));
vds.setKsmState(AssignBoolValue(xmlRpcStruct, VdsProperties.ksm_state));
......
 public void scheduleJobs() {
        long refreshRate = Config.<Long> getValue(ConfigValues.VdsRefreshRate) * 1000;

        registeredJobs.add(executor.scheduleWithFixedDelay(
                this::refresh,
                refreshRate,
                refreshRate,
                TimeUnit.MILLISECONDS));

        vmsRefresher = getRefresherFactory().create(this, resourceManager);
        vmsRefresher.startMonitoring();

        hostRefresher = new HostConnectionRefresher(this, resourceManager);
        hostRefresher.start();
}

3.1 状态说明

主机状态 说明 版本
Unassigned 未指派的 0 3.4.5/4.2.3
Down 关机 1 3.4.5/4.2.3
Maintenance 维护 2 3.4.5/4.2.3
Up 开机 3 3.4.5/4.2.3
NonResponsive 没有响应 4 3.4.5/4.2.3
Error 错误 5 3.4.5/4.2.3
Installing 正在安装 6 3.4.5/4.2.3
InstallFailed 安装失败 7 3.4.5/4.2.3
Reboot 重启 8 3.4.5/4.2.3
PreparingForMaintenance 准备维护 9 3.4.5/4.2.3
NonOperational 不可操作 10 3.4.5/4.2.3
PendingApproval 待批准 11 3.4.5/4.2.3
Initializing 正在初始化 12 3.4.5/4.2.3
Connecting 正在连接 13 3.4.5/4.2.3
InstallingOS 安装系统过程中 14 4.2.3
Kdumping 释放资源过程中 15 4.2.3

3.1.1 Unassigned

public void AddVds(VDS vds, boolean isInternal) {
        VdsManager vdsManager = VdsManager.buildVdsManager(vds);
        if (isInternal) {
            VDSStatus status = vds.getStatus();
            switch (vds.getStatus()) {
            case Error:
                status = VDSStatus.Up;
                break;
            case Reboot:
            case NonResponsive:
            case Connecting:
            case Installing:
                status = VDSStatus.Unassigned;
                break;
            }
            if (status != vds.getStatus()) {
                vdsManager.setStatus(status, vds);
                vdsManager.updateStatisticsData(vds.getStatisticsData());
            }
......
setSucceeded(runVdsCommand(VDSCommandType.SetVdsStatus, new SetVdsStatusVDSCommandParameters(getVdsId(), VDSStatus.Unassigned)).getSucceeded()
Backend.getInstance().getResourceManager().RunVdsCommand(VDSCommandType.SetVdsStatus, new SetVdsStatusVDSCommandParameters(getVds().getId(), VDSStatus.Unassigned));

3.1.2 Down

boolean result = executeSshPowerdown(getVds().getVdsGroupCompatibilityVersion().toString());
if (result) {
// SSH powerdown executed without errors set the status to down
    getVds().setStatus(VDSStatus.Down);
......

3.1.3 Maintenance

if (VDSStatus.Maintenance.equals(vdsInitialStatus)) {
            setVdsStatus(VDSStatus.Maintenance);
......
private void sleepOnReboot(final VDSStatus status) {
        int sleepTimeInSec = Config.<Integer> getValue(ConfigValues.ServerRebootTimeout);
        log.info("Waiting {} seconds, for server to finish reboot process.",
                sleepTimeInSec);
        resourceManager.getVdsManager(getVdsId()).setInServerRebootTimeout(true);
        ThreadUtils.sleep(TimeUnit.SECONDS.toMillis(sleepTimeInSec));
        resourceManager.getVdsManager(getVdsId()).setInServerRebootTimeout(false);
        setVdsStatus(status);
}
protected void setStatus() {
        if (getParameters().isChangeHostToMaintenanceOnStart()) {
            setStatus(VDSStatus.Maintenance);
        }
        else {
            setStatus(VDSStatus.NonResponsive);
        }
}
 if (_vds.getStatus() == VDSStatus.PreparingForMaintenance) {
            if (monitoringStrategy.canMoveToMaintenance(_vds)) {
                _vdsManager.setStatus(VDSStatus.Maintenance, _vds);
                _saveVdsDynamic = true;
                _saveVdsStatistics = true;
                log.infoFormat(
                        "Updated vds status from 'Preparing for Maintenance' to 'Maintenance' in database,  vds = {0} : {1}",
                        _vds.getId(),
                        _vds.getName());
......
private void moveVDSToMaintenanceIfNeeded() {
        if (vds.getStatus() == VDSStatus.PreparingForMaintenance) {
            if (monitoringStrategy.canMoveToMaintenance(vds)) {
                VdsDynamic dbVds = getDbFacade().getVdsDynamicDao().get(vds.getId());
                vds.setMaintenanceReason(dbVds.getMaintenanceReason());
                vdsManager.setStatus(VDSStatus.Maintenance, vds);
                saveVdsDynamic = true;
                saveVdsStatistics = true;
                log.info(
                        "Updated host status from 'Preparing for Maintenance' to 'Maintenance' in database, host '{}'({})",
                        vds.getName(),
                        vds.getId());
            } else {
                vdsMaintenanceTimeoutOccurred = vdsManager.isTimeToRetryMaintenance();
            }
        }
}
vdsDeploy.setCorrelationId(getCorrelationId());
vdsDeploy.useDefaultKeyPair();
vdsDeploy.execute();
setVdsStatus(VDSStatus.Maintenance);
......

3.1.4 Up

public void AddVds(VDS vds, boolean isInternal) {
        VdsManager vdsManager = VdsManager.buildVdsManager(vds);
        if (isInternal) {
            VDSStatus status = vds.getStatus();
            switch (vds.getStatus()) {
            case Error:
                status = VDSStatus.Up;
                break;
            case Reboot:
            case NonResponsive:
            case Connecting:
            case Installing:
                status = VDSStatus.Unassigned;
                break;
            }
            if (status != vds.getStatus()) {
                vdsManager.setStatus(status, vds);
                vdsManager.updateStatisticsData(vds.getStatisticsData());
            }
......
private void moveVdsToUp(VDS vds) {
        trustedVdses.add(vds.getId());
        vds.setStatus(VDSStatus.Up);
        DbFacade.getInstance().getVdsDynamicDao().update(vds.getDynamicData());
}
/**
* Move vds to Up status from error
*/
if (vds.getStatus() == VDSStatus.Error) {
            setStatus(VDSStatus.Up, vds);
            DbFacade.getInstance().getVdsDynamicDao().updateStatus(getVdsId(), VDSStatus.Up);
            log.infoFormat("Settings host {0} to up after {1} failed attempts to run a VM",
                    vds.getName(),
                    mFailedToRunVmAttempts);
            mFailedToRunVmAttempts.set(0);
}

3.1.5 NonResponsive

if (!getSucceeded()) {
      log.warnFormat("Restart host action failed, updating host {0} to {1}", vdsId, VDSStatus.NonResponsive.name());
      runVdsCommand(VDSCommandType.SetVdsStatus, new SetVdsStatusVDSCommandParameters(vdsId, VDSStatus.NonResponsive));
}
 if (!networkConfigurator.awaitVdsmResponse()) {
      throw new VdsInstallException(VDSStatus.NonResponsive, "Network error during communication with the host");
}
protected void setStatus() {
        if (getParameters().isChangeHostToMaintenanceOnStart()) {
            setStatus(VDSStatus.Maintenance);
        }
        else {
            setStatus(VDSStatus.NonResponsive);
        }
}
protected void RunSleepOnReboot() {
    RunSleepOnReboot(VDSStatus.NonResponsive);
}
case Reboot:
     setVdsStatus(VDSStatus.Reboot);
     markVdsReinstalled();
     runSleepOnReboot(getStatusOnReboot());
......
protected void executeCommand() {
        boolean result = executeSshReboot(getVds().getClusterCompatibilityVersion().toString());
        if (result) {
            setVdsStatus(VDSStatus.Reboot);

            // preserve maintenance status after reboot or set non-responsive for letting the monitor control the host
            runSleepOnReboot(getStatusAfterReboot());
        }
        setSucceeded(result);
}

private VDSStatus getStatusAfterReboot() {
        return getParameters().getPrevVdsStatus() == VDSStatus.Maintenance
                ? VDSStatus.Maintenance
                : VDSStatus.NonResponsive;
}

3.1.6 Error

if (mFailedToRunVmAttempts.get() < Config.<Integer> getValue(ConfigValues.NumberOfFailedRunsOnVds)
                && mFailedToRunVmAttempts.incrementAndGet() >= Config
                        .<Integer> getValue(ConfigValues.NumberOfFailedRunsOnVds)) {
            //Only one thread at a time can enter here
            ResourceManager.getInstance().runVdsCommand(VDSCommandType.SetVdsStatus,
                    new SetVdsStatusVDSCommandParameters(vds.getId(), VDSStatus.Error));
......
private void handleClassCastException(ClassCastException cce) {
        // This should occur only if the vdsm API is not the same as the cluster API (version mismatch)
        log.error("Failure to refresh host '{}' runtime info. Incorrect vdsm version for cluster '{}': {}",
                vds.getName(),
                vds.getClusterName(), cce.getMessage());
        log.debug("Exception", cce);
        if (vds.getStatus() != VDSStatus.PreparingForMaintenance && vds.getStatus() != VDSStatus.Maintenance) {
            resourceManager.runVdsCommand(VDSCommandType.SetVdsStatus,
                    new SetVdsStatusVDSCommandParameters(vds.getId(), VDSStatus.Error));
        }
}

3.1.7 Installing

private void AddVdsDynamicToDb() {
        VdsDynamic vdsDynamic = new VdsDynamic();
        vdsDynamic.setId(getParameters().getVdsStaticData().getId());
        // TODO: oVirt type - here oVirt behaves like power client?
        if (getParameters().getAddPending()) {
            vdsDynamic.setStatus(VDSStatus.PendingApproval);
        }
        else if (Config.<Boolean> getValue(ConfigValues.InstallVds)) {
            vdsDynamic.setStatus(VDSStatus.Installing);
        }
        DbFacade.getInstance().getVdsDynamicDao().save(vdsDynamic);
        getCompensationContext().snapshotNewEntity(vdsDynamic);
}
setVdsStatus(VDSStatus.Installing);
installer.execute();
setVdsStatus(VDSStatus.Installing);
upgrade.execute();
@Override
    protected void executeCommand() {
        setVdsStatus(VDSStatus.Installing);
......
setVdsStatus(VDSStatus.Installing);
deploy.execute();
setVdsStatus(VDSStatus.Installing);
upgradeManager.update(getVds());
......
setVdsStatus(VDSStatus.Installing);
upgrade.execute();

3.1.8 InstallFailed

case Failed:
     throw new VdsInstallException(VDSStatus.InstallFailed, StringUtils.EMPTY);
case Incomplete:
     throw new VdsInstallException(VDSStatus.InstallFailed, "Partial installation");
switch (upgrade.getDeployStatus()) {
    case Failed:
         throw new VdsInstallException(VDSStatus.InstallFailed, StringUtils.EMPTY);
} catch (final Exception e) {
            log.error("Failed to enroll certificate for host '{}': {}", getVds().getName(), e.getMessage());
            log.error("Exception", e);
            setVdsStatus(VDSStatus.InstallFailed);
}
case Failed:
     throw new VdsInstallException(VDSStatus.InstallFailed, StringUtils.EMPTY);
case Incomplete:
     markCurrentCmdlineAsStored();
     throw new VdsInstallException(VDSStatus.InstallFailed, "Partial installation");
if (!returnValue.getSucceeded()) {
          setVdsStatus(VDSStatus.InstallFailed);
          log.error("Engine failed to restart via ssh host '{}' ('{}') after upgrade", getVds().getName(), getVds().getId());
          return;
}
......
switch (upgrade.getDeployStatus()) {
        case Failed:
             throw new VdsInstallException(VDSStatus.InstallFailed, StringUtils.EMPTY);

3.1.9 Reboot

protected void setStatus() {
        Backend.getInstance()
                .getResourceManager()
                .RunVdsCommand(VDSCommandType.SetVdsStatus,
                        new SetVdsStatusVDSCommandParameters(getVdsId(), VDSStatus.Reboot));
        RunSleepOnReboot();
}
case Reboot:
     setVdsStatus(VDSStatus.Reboot);
     RunSleepOnReboot(getStatusOnReboot());
case Reboot:
     setVdsStatus(VDSStatus.Reboot);
     RunSleepOnReboot(getStatusOnReboot());
@Override
protected void setStatus() {

        VDSStatus newStatus = VDSStatus.Down;
        if (getParameters().getParentCommand() == VdcActionType.RestartVds) {
            // In case the stop was issued as a result of VDS command , we
            // cannot set the VDS to down -
            // According to bug fix #605215 it can be that backend will crash
            // during restart, and upon restart, all down VDS are not
            // monitored. Instead, we will set the status to rebooting

            newStatus = VDSStatus.Reboot;
        }
        setStatus(newStatus);

}
case Reboot:
     markCurrentCmdlineAsStored();
     markVdsReinstalled();
     setVdsStatus(VDSStatus.Reboot);
     runSleepOnReboot(getStatusOnReboot());
case Reboot:
     setVdsStatus(VDSStatus.Reboot);
     markVdsReinstalled();
     runSleepOnReboot(getStatusOnReboot());
boolean result = executeSshReboot(getVds().getClusterCompatibilityVersion().toString());
if (result) {
   setVdsStatus(VDSStatus.Reboot);

   // preserve maintenance status after reboot or set non-responsive for letting the monitor control the host
   runSleepOnReboot(getStatusAfterReboot());
}
setSucceeded(result);

3.1.10 PreparingForMaintenance

private boolean setVdsStatusToPrepareForMaintenance(VDS vds) {
        boolean result = true;
        if (vds.getStatus() != VDSStatus.PreparingForMaintenance && vds.getStatus() != VDSStatus.NonResponsive
                && vds.getStatus() != VDSStatus.Down) {
            SetVdsStatusVDSCommandParameters params =
                    new SetVdsStatusVDSCommandParameters(vds.getId(), VDSStatus.PreparingForMaintenance);
            params.setStopSpmFailureLogged(true);
            result = runVdsCommand(VDSCommandType.SetVdsStatus, params).getSucceeded();
        }
        return result;
}

3.1.11 NonOperational

for (VDS vds : trustedVdsList) {
            trustedVdsNames.add(vds.getHostName());
            setNonOperational(NonOperationalReason.UNINITIALIZED, vds);
}
......
private void setNonOperational(NonOperationalReason reason, VDS vds) {
        vds.setNonOperationalReason(reason);
        vds.setStatus(VDSStatus.NonOperational);
        DbFacade.getInstance().getVdsDynamicDao().update(vds.getDynamicData());
}
} catch (Exception e) {
       throw new VdsInstallException(VDSStatus.NonOperational, "Failed to configure management network on the host", e);
}
if (nonOperationalReason != NonOperationalReason.NONE) {
                setIsSetNonOperationalExecuted(true);

                if (returnStatus != VDSStatus.NonOperational) {
                    log.debugFormat(
                            "monitoring: vds {0} networks do not match its cluster networks, vds will be moved to NonOperational",
                            vds);
                    vds.setStatus(VDSStatus.NonOperational);
                    vds.setNonOperationalReason(nonOperationalReason);
                }
}
String networkNames = StringUtils.join(networks, ", ");
                    String nicNames = StringUtils.join(brokenNics, ", ");

                    String message =
                            String.format(
                                    "Host '%s' moved to Non-Operational state because interface/s '%s' are down which needed by network/s '%s' in the current cluster",
                                    _vds.getName(),
                                    nicNames,
                                    networkNames);

                    _vds.setNonOperationalReason(NonOperationalReason.NETWORK_INTERFACE_IS_DOWN);
                    _vdsManager.setStatus(VDSStatus.NonOperational, _vds);
if (!hostCompliesWithClusterEmulationMode(vds, vdsGroup) && vds.getStatus() != VDSStatus.NonOperational) {

            Map<String, String> customLogValues = new HashMap<>();
            customLogValues.put("hostSupportedEmulatedMachines", vds.getSupportedEmulatedMachines());
            customLogValues.put("clusterEmulatedMachines", StringUtils.isEmpty(vdsGroup.getEmulatedMachine()) ?
                    Config.<List<String>>getValue(ConfigValues.ClusterEmulatedMachines, vds.getVdsGroupCompatibilityVersion().getValue()).toString() :
                    vdsGroup.getEmulatedMachine());

            vdsNonOperational(vds, NonOperationalReason.EMULATED_MACHINES_INCOMPATIBLE_WITH_CLUSTER, customLogValues);
            vds.setStatus(VDSStatus.NonOperational);
}
try {
                    String problematicNicsWithNetworksString = constructNicsWithNetworksString(problematicNicsWithNetworks);

                    vds.setNonOperationalReason(NonOperationalReason.NETWORK_INTERFACE_IS_DOWN);
                    vdsManager.setStatus(VDSStatus.NonOperational, vds);
                    log.info("Host '{}' moved to Non-Operational state because interface/s which are down are needed by required network/s in the current cluster: '{}'", vds.getName(), problematicNicsWithNetworksString);

                    AuditLogable logable = createAuditLogableForHost();
                    logable.addCustomValue("NicsWithNetworks", problematicNicsWithNetworksString);
                    logable.setCustomId(problematicNicsWithNetworksString);
                    auditLog(logable, AuditLogType.VDS_SET_NONOPERATIONAL_IFACE_DOWN);
......
} catch (Exception e) {
        log.error("Exception", e);
        throw new VdsInstallException(VDSStatus.NonOperational, "Failed to configure management network on the host", e);
}

3.1.11.1 设置不可操作状态操作

setVdsStatus(VDSStatus.NonOperational, getParameters().getNonOperationalReason());
SetNonOperationalVdsParameters tempVar2 = new SetNonOperationalVdsParameters(getVdsId(), NonOperationalReason.CPU_TYPE_INCOMPATIBLE_WITH_CLUSTER);
tempVar2.setSaveToDb(true);
Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar2, ExecutionHandler.createInternalJobContext());
private void refreshAllVdssInPool() {
        List<Guid> vdsIdsToSetNonOperational = new ArrayList<Guid>();
        runSynchronizeOperation(new RefreshPoolSingleAsyncOperationFactory(), vdsIdsToSetNonOperational);
        for (Guid vdsId : vdsIdsToSetNonOperational) {
            Map<String, String> customLogValues = Collections.singletonMap("StorageDomainNames", getStorageDomainName());
            SetNonOperationalVdsParameters tempVar = new SetNonOperationalVdsParameters(vdsId, STORAGE_DOMAIN_UNREACHABLE, customLogValues);
            tempVar.setSaveToDb(true);
            tempVar.setStorageDomainId(getStorageDomain().getId());
            tempVar.setTransactionScopeOption(TransactionScopeOption.RequiresNew);
            getBackend().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar, ExecutionHandler.createInternalJobContext());
        }
}
private void reportNonOperationReason(NonOperationalReason reason, String compatibleVersions,
                                          String vdsSupportedVersions) {
        Map<String, String> customLogValues = new HashMap<>();
        customLogValues.put("CompatibilityVersion", compatibleVersions);
        customLogValues.put("VdsSupportedVersions", vdsSupportedVersions);
        SetNonOperationalVdsParameters tempVar = new SetNonOperationalVdsParameters(getVdsId(),
                reason,
                customLogValues);
        tempVar.setSaveToDb(true);
        Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar,  ExecutionHandler.createInternalJobContext());
}
private void setNonOperational(NonOperationalReason reason, Map<String, String> customLogValues) {
        SetNonOperationalVdsParameters tempVar = new SetNonOperationalVdsParameters(getVds().getId(), reason, customLogValues);
        tempVar.setSaveToDb(true);
        Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar,  ExecutionHandler.createInternalJobContext());
}
private void setNonOperational(NonOperationalReason reason, VDS vds, Map<String, String> customLogValues) {
        SetNonOperationalVdsParameters tempVar = new SetNonOperationalVdsParameters(vds.getId(), reason, customLogValues);
        tempVar.setSaveToDb(true);
        Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar, ExecutionHandler.createInternalJobContext());
}
private void setNonOperational(VDS server) {
        SetNonOperationalVdsParameters nonOpParams = new SetNonOperationalVdsParameters(server.getId(), NonOperationalReason.GLUSTER_COMMAND_FAILED, Collections.singletonMap(GlusterConstants.COMMAND, "gluster peer status"));
        nonOpParams.setSaveToDb(true);
        Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, nonOpParams, ExecutionHandler.createInternalJobContext());
}
@Override
public void vdsNonOperational(Guid vdsId, NonOperationalReason reason, boolean logCommand, boolean saveToDb, Guid domainId, Map<String, String> customLogValues) {
        ExecutionHandler.updateSpecificActionJobCompleted(vdsId, VdcActionType.MaintenanceVds, false);
        SetNonOperationalVdsParameters tempVar = new SetNonOperationalVdsParameters(vdsId, reason, customLogValues);
        tempVar.setSaveToDb(saveToDb);
        tempVar.setStorageDomainId(domainId);
        tempVar.setShouldBeLogged(logCommand);
        Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar, ExecutionHandler.createInternalJobContext());
}
protected void setNonOperational(CommandContext cmdContext, Guid vdsId, NonOperationalReason reason) {
        backend.runInternalAction(ActionType.SetNonOperationalVds, new SetNonOperationalVdsParameters(vdsId, reason), ExecutionHandler.createInternalJobContext(cmdContext));
}

3.1.12 PendingApproval

if (getParameters().getAddPending()) {
      vdsDynamic.setStatus(VDSStatus.PendingApproval);
}
} else if (getParameters().isApprovedByRegister()) {
      // In case of Approval of oVirt host process, the status of the host is re-initialized to PendingApproval
      Backend.getInstance().getResourceManager().RunVdsCommand(VDSCommandType.SetVdsStatus, new SetVdsStatusVDSCommandParameters(getVds().getId(), VDSStatus.PendingApproval));
}

3.1.13 Initializing

setVdsStatus(VDSStatus.Initializing);
private void HandleVdsRecoveringException(VDSRecoveringException ex) {
        if (_vds.getStatus() != VDSStatus.Initializing && _vds.getStatus() != VDSStatus.NonOperational) {
            setStatus(VDSStatus.Initializing, _vds);
            DbFacade.getInstance().getVdsDynamicDao().updateStatus(_vds.getId(), VDSStatus.Initializing);
            AuditLogableBase logable = new AuditLogableBase(_vds.getId());
            logable.setUserIp(_vds.getHostName());
            logable.addCustomValue("ErrorMessage", ex.getMessage());
            logable.updateCallStackFromThrowable(ex);
            AuditLogDirector.log(logable, AuditLogType.VDS_INITIALIZING);
            log.warnFormat(
                    "Failed to refresh VDS , vds = {0} : {1}, error = {2}, continuing.",
                    _vds.getId(),
                    _vds.getName(),
                    ex.getMessage());
            final int VDS_RECOVERY_TIMEOUT_IN_MINUTES = Config.<Integer> getValue(ConfigValues.VdsRecoveryTimeoutInMintues);
            String jobId = SchedulerUtilQuartzImpl.getInstance().scheduleAOneTimeJob(this, "onTimerHandleVdsRecovering", new Class[0],
                    new Object[0], VDS_RECOVERY_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES);
            recoveringJobIdMap.put(_vds.getId(), jobId);
        }
}
setVdsStatus(VDSStatus.Initializing);
setVdsStatus(VDSStatus.Initializing);
if (getVds().getVdsType() == VDSType.VDS && !getParameters().isReboot()) {
            if (getParameters().getInitialStatus() == VDSStatus.Maintenance) {
                setVdsStatus(VDSStatus.Maintenance);
            } else {
                setVdsStatus(VDSStatus.Initializing);
            }
}
//only if cluster supports only gluster service
if (!getCluster().supportsVirtService()) {
      runVdsCommand(VDSCommandType.SetVdsStatus,  new SetVdsStatusVDSCommandParameters(getVdsId(), VDSStatus.Initializing));
}

3.1.14 Connecting

if (mUnrespondedAttempts.get() < Config.<Integer> getValue(ConfigValues.VDSAttemptsToResetCount) || (lastUpdate + timeoutToFence) > System.currentTimeMillis()) {
       boolean result = false;
       if (vds.getStatus() != VDSStatus.Connecting && vds.getStatus() != VDSStatus.PreparingForMaintenance sss&& vds.getStatus() != VDSStatus.NonResponsive) {
             setStatus(VDSStatus.Connecting, vds);
             result = true;
       }
       mUnrespondedAttempts.incrementAndGet();
       return result;
}
public void finishSshSoftFencingExecution(VDS vds) {
        // reset the unresponded counter to wait if VDSM restart helps
        mUnrespondedAttempts.set(0);
        // change VDS state to connecting
        setStatus(VDSStatus.Connecting, vds);
        updateDynamicData(vds.getDynamicData());
}

3.1.15 InstallingOS

else if (getParameters().isProvisioned()) {
     vdsDynamic.setStatus(VDSStatus.InstallingOS);
}

3.1.16 Kdumping

if (!kdumpDetected) {
     // host kdump status detected
     kdumpDetected = true;

     auditLogDirector.log(this, AuditLogType.KDUMP_FLOW_DETECTED_ON_VDS);

     // set status to Kdumping to prevent Host Monitoring errors and wait until kdump finishes
     setVdsStatus(VDSStatus.Kdumping);

     // restart VMs running on Vds
     restartVdsVms();

     // execute all actions needed to manual fence the host (without PM fencing)
     executeFenceVdsManuallyAction();
}

后续 【Ovirt 笔记】资源信息状态刷新实现分析与整理(2)(持续更新)

上一篇 下一篇

猜你喜欢

热点阅读