【Ovirt 笔记】资源信息状态刷新实现分析与整理(1)(持续更
2018-10-08 本文已影响8人
58bc06151329
文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
分析整理的版本为 Ovirt 3.4.5 和 Ovirt 4.2.3 版本。
1. 数据中心
- ovirt 3.4.5 版本中
IrsBrokerCommand
类中创建调度任务 _updatingTimer_Elapsed。- 执行频率取自 StoragePoolRefreshTimeInSeconds 系统参数配置。
- 每 10 秒钟刷新一次。
- 执行频率取自 StoragePoolRefreshTimeInSeconds 系统参数配置。
- ovirt 4.2.3 版本中
IrsProxy
类中创建调度任务 updatingTimerElapsed。- 执行频率取自 StoragePoolRefreshTimeInSeconds 系统参数配置。
- 每 10 秒钟刷新一次。
- 执行频率取自 StoragePoolRefreshTimeInSeconds 系统参数配置。
1.1 状态说明
-
StoragePoolStatus
类中定义了所有的数据中心状态。
数据中心状态 | 说明 | 值 |
---|---|---|
Uninitialized | 未初始化 | 0 |
Up | 运行 | 1 |
Maintenance | 维护 | 2 |
NotOperational | 不可操作 | 3 |
NonResponsive | 无响应 | 4 |
Contend | 竞争 | 5 |
1.1.1 Uninitialized
- 新增数据中心时设置。
-
AddEmptyStoragePoolCommand
类中设置。- 新建数据中心给定的一个状态默认值。
-
protected void addStoragePoolToDb() {
getStoragePool().setId(Guid.newGuid());
getStoragePool().setStatus(StoragePoolStatus.Uninitialized);
getStoragePoolDAO().save(getStoragePool());
}
1.1.2 Up
- 主存储状态正常时设置(3.4.5)。
-
IrsBrokerCommand
类的_updatingTimer_Elapsed
调度中验证。 - 主存储状态正常返回 SPM 状态时设置。
-
DbFacade.getInstance().getStoragePoolDao().updateStatus(storagePool.getId(), StoragePoolStatus.Up);
storagePool.setStatus(StoragePoolStatus.Up);
ResourceManager.getInstance().getEventListener().storagePoolStatusChanged(storagePool.getId(), storagePool.getStatus());
-
主存储状态正常时设置(4.2.3)。
- 与 3.4.5 版本一样,只是验证放到了
IrsProxy
类的updatingTimerElapsed
方法里。
- 与 3.4.5 版本一样,只是验证放到了
-
master 存储域为激活状态时设置
-
StorageHandlingCommandBase
类中设置。
-
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
- 添加存储域之前设置。
-
AddStoragePoolWithStoragesCommand
类中设置。
-
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;
}
});
- 维护存储域(最后的 master 存储域)
-
DeactivateStorageDomainCommand
类中设置。
-
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());
-
master 存储域为维护状态时设置
-
StorageHandlingCommandBase
类中设置。
-
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());
-
master 存储域为 InActive 状态时设置(3.4.5)。
-
IrsBrokerCommand
类中设置。
-
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);
}
}
-
master 存储域为 InActive 状态时设置(4.2.3)。
- 与 3.4.5 版本一样,只是验证放到了
IrsProxy
类的updatingTimerElapsed
方法里。
- 与 3.4.5 版本一样,只是验证放到了
1.1.4 NotOperational
- 主机无响应时设置。
-
VdsNotRespondingTreatmentCommand
类中设置。
-
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
- 重新初始化数据中心,重构 master 存储域时。
-
RecoveryStoragePoolCommand
类中设置。
-
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);
-
master 存储域非激活状态时设置。
-
StorageHandlingCommandBase
类中设置。
-
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());
- 主存储状态不正常时设置(3.4.5)。
-
IrsBrokerCommand
类的_updatingTimer_Elapsed
调度中验证。 - 主存储状态正常返回非 SPM 状态时设置。
-
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);
}
- 存储状态不正常时设置(4.2.3)。
-
StoragePoolStatusHandler
类的handleTimeout
调度中验证。- 调度 3 分钟刷新一次。
-
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
- 重选 SPM 时设置(3.4.5)。
-
IrsBrokerCommand
类的_updatingTimer_Elapsed
调度中验证。
-
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;
}
});
- 重选 SPM 时设置(4.2.3)。
- 与 3.4.5 版本一样,只是验证放到了 IrsProxy 类的 updatingTimerElapsed 方法里。
2. 存储域
- ovirt 3.4.5 版本中
IrsBrokerCommand
类中创建调度任务 _updatingTimer_Elapsed。- 执行频率取自 StoragePoolRefreshTimeInSeconds 系统参数配置。
- 每 10 秒钟刷新一次
- 执行频率取自 StoragePoolRefreshTimeInSeconds 系统参数配置。
- 存储域状态等信息都通过调度中执行
GetStoragePoolInfo
获取。- _result.mStoragePoolInfo 中包含 master_uuid。
-
_result.mDomainsList 中包含了数据中心下所有存储域信息,进行一个循环。
- 存储域的 id 与 master_uuid 相同的则是 master,否则为普通存储域。
- status 为存储域状态信息。
- disktotal 为空间总量信息。
- diskfree 为空闲空间信息。
- alerts 为错误警告信息。
- ovirt 4.2.3 版本中
IrsProxy
类中创建调度任务 updatingTimerElapsed,相关流程一致,返回一致。
2.1 状态说明
-
StorageDomainStatus
类中定义了所有的存储域状态。
存储域状态 | 说明 | 值 | 版本 |
---|---|---|---|
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
- 分离存储域时设置。
-
DeactivateStorageDomainCommand
类中设置。
-
final StoragePoolIsoMap map =
getStoragePoolIsoMapDAO().get
(new StoragePoolIsoMapId(getParameters().getStorageDomainId(),
getParameters().getStoragePoolId()));
map.setStatus(StorageDomainStatus.Unknown);
......
2.1.2 Uninitialized
- 由节点获得状态,再通过 spmStatus 方法提供给 engine。
# 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
- 激活存储域时设置。
-
ActivateStorageDomainCommand
类中设置。
-
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;
}
});
- 维护 master 存储后,另一个存储域激活为 master 时设置。
-
DeactivateStorageDomainCommand
类中设置。
-
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;
}
});
- 扩展 SAN 类似存储域时设置。
-
ExtendSANStorageDomainCommand
类中设置。
-
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;
}
});
- 重新初始化数据中心时设置。
-
RecoveryStoragePoolCommand
类中设置。
-
StoragePoolIsoMap domainPoolMap = new StoragePoolIsoMap(getParameters().getNewMasterDomainId(), getParameters().getStoragePoolId(), StorageDomainStatus.Active);
DbFacade.getInstance().getStoragePoolIsoMapDao().save(domainPoolMap);
2.1.5 InActive
- 激活存储域失败后设置。
-
AddStoragePoolWithStoragesCommand
类中设置。
-
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;
}
- 维护存储域时设置,维护的存储域不是最后一个 master 存储域。
-
DeactivateStorageDomainCommand
类中设置。
-
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;
}
});
- 重建 master 存储域时设置。
-
ReconstructMasterDomainCommand
类中设置。
-
setStorageDomainStatus(StorageDomainStatus.InActive, getCompensationContext());
calcStoragePoolStatusByDomainsStatus();
getCompensationContext().stateChanged();
2.1.6 Locked
- 更新存储服务器连接时设置。
-
UpdateStorageServerConnectionCommand
类中设置。
-
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);
}
}
- 当存储域类型为 master,激活存储域时设置。
-
ActivateStorageDomainCommand
类中设置。
-
changeStorageDomainStatusInTransaction(map,
(getStorageDomain().getStorageDomainType() == StorageDomainType.Master) ?
StorageDomainStatus.Locked : StorageDomainStatus.Activating);
- 附加存储域时设置。
-
AttachStorageDomainToPoolCommand
类中设置。
-
executeInNewTransaction(() -> {
map = new StoragePoolIsoMap(getStorageDomain().getId(), getParameters()
.getStoragePoolId(), StorageDomainStatus.Locked);
storagePoolIsoMapDao.save(map);
getCompensationContext().snapshotNewEntity(map);
getCompensationContext().stateChanged();
return null;
});
- 维护存储域时设置。
-
DeactivateStorageDomainCommand
类中设置。
-
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;
});
- 扩展 SAN 存储域时设置。
-
ExtendSANStorageDomainCommand
类中设置。
-
executeInNewTransaction(() -> {
setStorageDomainStatus(StorageDomainStatus.Locked, getCompensationContext());
getCompensationContext().stateChanged();
return null;
});
- 刷新 Lun 大小时设置。
-
RefreshLunsSizeCommand
类中设置。
-
changeStorageDomainStatusInTransaction(getStorageDomain().getStoragePoolIsoMapData(), StorageDomainStatus.Locked);
- 增加存储域时设置。
-
AddStoragePoolWithStoragesCommand
类中设置。
-
storageDomain.setStatus(StorageDomainStatus.Locked);
- 分离 master 存储域时设置(3.4.5)。
-
DetachStorageDomainFromPoolCommand
类中设置。
-
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;
});
}
- 分离 master 存储域时设置(4.2.3)。
-
StorageHandlingCommandBase
类中设置。
-
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
- 更新存储服务器连接时设置。
-
UpdateStorageServerConnectionCommand
类中设置。
-
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);
}
- 附加存储域时设置。
-
AttachStorageDomainToPoolCommand
类中设置。
-
executeInNewTransaction(() -> {
final StorageDomainType sdType = getStorageDomain().getStorageDomainType();
map.setStatus(StorageDomainStatus.Maintenance);
storagePoolIsoMapDao.updateStatus(map.getId(), map.getStatus());
......
- 维护最后一个 master 存储域,存储域置为维护状态。
-
DeactivateStorageDomainCommand
类中设置。
-
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
- 维护存储域时设置。(4.2.3)
-
DeactivateStorageDomainCommand
类中设置。
-
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
- 分离存储域时设置。(4.2.3)
-
DetachStorageDomainFromPoolCommand
类中设置。
-
log.info("Start detach storage domain");
changeStorageDomainStatusInTransaction(getStorageDomain().getStoragePoolIsoMapData(), StorageDomainStatus.Detaching);
2.1.9 Activating
- 激活存储域时设置。
-
ActivateStorageDomainCommand
类中设置。
-
changeStorageDomainStatusInTransaction(map,(getStorageDomain().getStorageDomainType() == StorageDomainType.Master) ?StorageDomainStatus.Locked : StorageDomainStatus.Activating);
3. 主机
- ovirt 3.4.5 中
VdsManager
类中创建调度任务 onTimer。- 执行频率取自 VdsRefreshRate 系统参数配置。
- 每 3 × 1000 毫秒刷新一次。
- 执行频率取自 VdsRefreshRate 系统参数配置。
- 主机状态等信息通过调用中执行
GetStatsVDSCommand
获取。- 返回的所有信息包含在 infoReturn.mInfo 中。
......
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));
......
- ovirt 4.2.3 中同样使用了
VdsManager
类,创建调度任务。- 通过主机状态监控器
HostMonitoring
,实际调用GetStatsAsync
获取。 - 返回的所有信息包含在 infoReturn.info 中。
- 通过主机状态监控器
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 状态说明
-
VDSStatus
类中定义了所有的主机状态。
主机状态 | 说明 | 值 | 版本 |
---|---|---|---|
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
- 添加主机根据初始化结果设置不同状态。
-
ResourceManager
类中设置。
-
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());
}
......
- 激活主机时设置。
-
ActivateVdsCommand
类中设置。
-
setSucceeded(runVdsCommand(VDSCommandType.SetVdsStatus, new SetVdsStatusVDSCommandParameters(getVdsId(), VDSStatus.Unassigned)).getSucceeded()
- 批准主机时设置。
-
ApproveVdsCommand
类中设置。
-
Backend.getInstance().getResourceManager().RunVdsCommand(VDSCommandType.SetVdsStatus, new SetVdsStatusVDSCommandParameters(getVds().getId(), VDSStatus.Unassigned));
3.1.2 Down
- 通过 SSH 电源关闭主机(4.2.3)。
-
VdsPowerDownCommand
类中设置。
-
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
- 安装主机(3.4.5)。
-
InstallVdsCommand
类中设置。
-
if (VDSStatus.Maintenance.equals(vdsInitialStatus)) {
setVdsStatus(VDSStatus.Maintenance);
......
- 安装主机(4.2.3)。
-
InstallVdsInternalCommand
类中设置。
-
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);
}
- 通过电源管理重启主机(3.4.5)。
-
StartVdsCommand
类中设置。
-
protected void setStatus() {
if (getParameters().isChangeHostToMaintenanceOnStart()) {
setStatus(VDSStatus.Maintenance);
}
else {
setStatus(VDSStatus.NonResponsive);
}
}
- 从准备维护到维护状态更新(3.4.5)。
-
VdsUpdateRunTimeInfo
类中设置。
-
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());
......
- 从准备维护到维护状态更新(4.2.3)。
-
HostMonitoring
类中设置。
-
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();
}
}
}
- 主机登记证书(4.2.3)。
-
HostEnrollCertificateInternalCommand
类中设置。
-
vdsDeploy.setCorrelationId(getCorrelationId());
vdsDeploy.useDefaultKeyPair();
vdsDeploy.execute();
setVdsStatus(VDSStatus.Maintenance);
......
3.1.4 Up
- 添加主机根据初始化结果设置不同状态。
-
ResourceManager
类中设置。
-
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());
}
......
- 在可信任列表中的主机(可访问配置的信任服务器)直接修改为开机状态。
-
AttestThread
类中设置。
-
private void moveVdsToUp(VDS vds) {
trustedVdses.add(vds.getId());
vds.setStatus(VDSStatus.Up);
DbFacade.getInstance().getVdsDynamicDao().update(vds.getDynamicData());
}
- 主机错误恢复。
-
VdsManager
类中设置。
-
/**
* 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
-
添加主机根据初始化结果设置不同状态。
-
ResourceManager
类中设置。
-
-
重启主机失败。
-
RestartVdsCommand
类中设置。
-
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));
}
- 安装主机网络异常(3.4.5)。
-
InstallVdsCommand
类中设置。
-
if (!networkConfigurator.awaitVdsmResponse()) {
throw new VdsInstallException(VDSStatus.NonResponsive, "Network error during communication with the host");
}
- 通过电源管理重启主机(3.4.5)。
-
StartVdsCommand
类中设置。
-
protected void setStatus() {
if (getParameters().isChangeHostToMaintenanceOnStart()) {
setStatus(VDSStatus.Maintenance);
}
else {
setStatus(VDSStatus.NonResponsive);
}
}
- 通过电源管理重启后运行。
-
VdsCommand
类中设置。
-
protected void RunSleepOnReboot() {
RunSleepOnReboot(VDSStatus.NonResponsive);
}
- 升级节点后重启运行(4.2.3)。
-
UpgradeOvirtNodeInternalCommand
类中设置。
-
case Reboot:
setVdsStatus(VDSStatus.Reboot);
markVdsReinstalled();
runSleepOnReboot(getStatusOnReboot());
......
- 通过 SSH 电源重启主机(4.2.3)。
-
SshHostRebootCommand
类中设置。
-
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
- 当主机上运行的虚拟机数量大于限制(3.4.5)。
-
VdsManager
类中设置。 - NumberOfFailedRunsOnVds 主机上运行的错误虚拟机数量限制,默认值为 3。
-
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));
......
- 主机状态信息刷新异常(4.2.3)。
-
HostMonitoring
类中设置。
-
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
- 增加主机,安装主机开关打开,则更新为正在安装状态。
-
AddVdsCommand
类中设置。 - InstallVds 开关值默认为 true。
-
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);
}
- 安装主机过程中(3.4.5)。
-
InstallVdsCommand
类中设置。
-
setVdsStatus(VDSStatus.Installing);
installer.execute();
- 升级主机过程中(3.4.5)。
-
InstallVdsCommand
类中设置。
-
setVdsStatus(VDSStatus.Installing);
upgrade.execute();
- 主机登记证书(4.2.3)。
-
HostEnrollCertificateInternalCommand
类中设置。
-
@Override
protected void executeCommand() {
setVdsStatus(VDSStatus.Installing);
......
- 安装主机过程中(4.2.3)。
-
InstallVdsInternalCommand
类中设置。
-
setVdsStatus(VDSStatus.Installing);
deploy.execute();
- 升级主机过程中(4.2.3)。
-
UpgradeHostInternalCommand
类中设置。
-
setVdsStatus(VDSStatus.Installing);
upgradeManager.update(getVds());
......
setVdsStatus(VDSStatus.Installing);
upgrade.execute();
3.1.8 InstallFailed
- 安装主机失败(3.4.5)。
-
InstallVdsCommand
类中设置。
-
case Failed:
throw new VdsInstallException(VDSStatus.InstallFailed, StringUtils.EMPTY);
case Incomplete:
throw new VdsInstallException(VDSStatus.InstallFailed, "Partial installation");
- 升级主机失败(3.4.5)。
-
InstallVdsCommand
类中设置。
-
switch (upgrade.getDeployStatus()) {
case Failed:
throw new VdsInstallException(VDSStatus.InstallFailed, StringUtils.EMPTY);
- 主机登记证书失败(4.2.3)。
-
HostEnrollCertificateInternalCommand
类中设置。
-
} catch (final Exception e) {
log.error("Failed to enroll certificate for host '{}': {}", getVds().getName(), e.getMessage());
log.error("Exception", e);
setVdsStatus(VDSStatus.InstallFailed);
}
- 安装主机失败(4.2.3)。
-
InstallVdsInternalCommand
类中设置。
-
case Failed:
throw new VdsInstallException(VDSStatus.InstallFailed, StringUtils.EMPTY);
case Incomplete:
markCurrentCmdlineAsStored();
throw new VdsInstallException(VDSStatus.InstallFailed, "Partial installation");
- 升级主机失败(4.2.3)。
-
UpgradeHostInternalCommand
类中设置。 -
UpgradeOvirtNodeInternalCommand
类中设置。(ISO 升级)
-
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
- 通过电源管理重启主机。
-
FenceVdsBaseCommand
类中设置。
-
protected void setStatus() {
Backend.getInstance()
.getResourceManager()
.RunVdsCommand(VDSCommandType.SetVdsStatus,
new SetVdsStatusVDSCommandParameters(getVdsId(), VDSStatus.Reboot));
RunSleepOnReboot();
}
- 主机安装完成后的重启(3.4.5)。
-
InstallVdsCommand
类中设置。
-
case Reboot:
setVdsStatus(VDSStatus.Reboot);
RunSleepOnReboot(getStatusOnReboot());
- 主机升级完成后的重启(3.4.5)。
-
InstallVdsCommand
类中设置。
-
case Reboot:
setVdsStatus(VDSStatus.Reboot);
RunSleepOnReboot(getStatusOnReboot());
- 重启主机前的关闭主机。
-
StopVdsCommand
类中设置。
-
@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);
}
- 主机安装完成后的重启(4.2.3)。
-
InstallVdsInternalCommand
类中设置。
-
case Reboot:
markCurrentCmdlineAsStored();
markVdsReinstalled();
setVdsStatus(VDSStatus.Reboot);
runSleepOnReboot(getStatusOnReboot());
- 主机升级完成后的重启(4.2.3)。
-
InstallVdsInternalCommand
类中设置。
-
case Reboot:
setVdsStatus(VDSStatus.Reboot);
markVdsReinstalled();
runSleepOnReboot(getStatusOnReboot());
- 通过 SSH 电源重启主机(4.2.3)。
-
SshHostRebootCommand
类中设置。
-
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
- 维护主机。
-
MaintenanceNumberOfVdssCommand
类中设置。
-
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
- 信任列表中的主机在系统初始化时,先设置为该状态。
-
Backend
类中设置。
-
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());
}
- 安装主机发生异常(3.4.5)。
-
InstallVdsCommand
类中设置。
-
} catch (Exception e) {
throw new VdsInstallException(VDSStatus.NonOperational, "Failed to configure management network on the host", e);
}
- 刷新主机能力,发生网络异常。
-
VdsManager
类中设置。
-
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);
}
}
- 主机刷新检测网络错误(3.4.5)。
-
VdsUpdateRunTimeInfo
类中设置。
-
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);
- 仿真机不匹配设置该状态。
-
VirtMonitoringStrategy
类中设置。
-
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);
}
- 主机状态信息刷新异常(4.2.3)。
-
HostMonitoring
类中设置。
-
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);
......
- 安装主机发生异常(4.2.3)。
-
InstallVdsInternalCommand
类中设置。
-
} 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 设置不可操作状态操作
-
SetNonOperationalVdsCommand
类中设置。
setVdsStatus(VDSStatus.NonOperational, getParameters().getNonOperationalReason());
- 修改 CPU 架构或者改变群集。
-
HandleVdsCpuFlagsOrClusterChangedCommand
类中设置。
-
SetNonOperationalVdsParameters tempVar2 = new SetNonOperationalVdsParameters(getVdsId(), NonOperationalReason.CPU_TYPE_INCOMPATIBLE_WITH_CLUSTER);
tempVar2.setSaveToDb(true);
Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, tempVar2, ExecutionHandler.createInternalJobContext());
- 刷新存储域列表中所有存储域。
-
ActivateStorageDomainCommand
类中设置。
-
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());
}
}
- 改变 VDSM 版本。
-
HandleVdsVersionCommand
类中设置。
-
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());
}
- 初始化主机。
-
InitVdsOnUpCommand
类中设置。
-
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());
}
- 在可信任列表中主机操作。
-
AttestThread
类中设置。
-
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());
}
- 分布式存储同步任务操作。
-
GlusterSyncJob
类中设置。
-
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());
}
- 主机的事件监听。
-
VdsEventListener
类中设置。
-
@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());
}
- 存储连接发现部分问题报失败(4.2.3)。
-
StorageHelperBase
类中设置。
-
protected void setNonOperational(CommandContext cmdContext, Guid vdsId, NonOperationalReason reason) {
backend.runInternalAction(ActionType.SetNonOperationalVds, new SetNonOperationalVdsParameters(vdsId, reason), ExecutionHandler.createInternalJobContext(cmdContext));
}
3.1.12 PendingApproval
- 添加待审批主机。
-
AddVdsCommand
类中设置。
-
if (getParameters().getAddPending()) {
vdsDynamic.setStatus(VDSStatus.PendingApproval);
}
- 注册批准状态主机。
-
ApproveVdsCommand
类中设置。
-
} 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
- 安装主机校验通过后安装之前设置(3.4.5)。
-
InstallVdsCommand
类中设置。
-
setVdsStatus(VDSStatus.Initializing);
- 恢复主机失败后尝试再恢复。
-
VdsManager
类中设置。 - VdsRecoveryTimeoutInMintues 恢复主机的调用周期为 3 分钟。
-
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);
}
}
- 升级主机(3.4.5)。
-
InstallVdsCommand
类中设置。
-
setVdsStatus(VDSStatus.Initializing);
- 安装主机校验通过后安装之前设置(4.2.3)。
-
InstallVdsInternalCommand
类中设置。
-
setVdsStatus(VDSStatus.Initializing);
- 升级主机(4.2.3)。
-
UpgradeHostInternalCommand
类中设置。
-
if (getVds().getVdsType() == VDSType.VDS && !getParameters().isReboot()) {
if (getParameters().getInitialStatus() == VDSStatus.Maintenance) {
setVdsStatus(VDSStatus.Maintenance);
} else {
setVdsStatus(VDSStatus.Initializing);
}
}
- 分布式存储连接失败(4.2.3)。
-
ManageGlusterServiceCommand
类中设置。
-
//only if cluster supports only gluster service
if (!getCluster().supportsVirtService()) {
runVdsCommand(VDSCommandType.SetVdsStatus, new SetVdsStatusVDSCommandParameters(getVdsId(), VDSStatus.Initializing));
}
3.1.14 Connecting
- 主机网络错误尝试连接。
-
VdsManager
类中设置。 - VDSAttemptsToResetCount 尝试通信次数默认为 2。
-
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;
}
- 通过 SSH 执行重启 VDSM 命令完成后设置(3.4.5)。
-
VdsManager
类中设置。
-
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
- 添加预分配主机(4.2.3)。
-
AddVdsCommand
类中设置。
-
else if (getParameters().isProvisioned()) {
vdsDynamic.setStatus(VDSStatus.InstallingOS);
}
3.1.16 Kdumping
- 主机资源释放检测(4.2.3)。
-
VdsKdumpDetectionCommand
类中设置。 - FenceKdumpListenerTimeout 资源释放超时时间为 90 × 1000 毫秒。
- KdumpStartedTimeout 资源释放操作启动超时时间为 30 秒。
- FenceKdumpMessageInterval 资源释放操作返回信息的周期,默认为 5 秒。
-
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();
}