Liron Ar has uploaded a new change for review. Change subject: core: allow current master domain to be selected as the new master ......................................................................
core: allow current master domain to be selected as the new master Currently the current master domain cannot be selected as the new master, which can cause to the system to not be able to recover in case that it's the only available domain. This patch allows to perform reconstruct using the master domain in case that we know that it's accessible - 1. Getting WrongMasterDomain error from vdsm means that we could get to the master domain metadata. NOTE: in that case, the reconstruct command will be executed with parameter indicating that the current master can be selected as the new master - but the host that return the WrongMasterDomain error or the master domain id as the master domain id as the id of the domain to reconstruct to aren't being passed to the command - this is being done to avoid possible issues (for example: failing to reconstruct to that domain although we can read the metadata, keep trying through the same host..etc). The intention here is to improve the current situation for most of the usecases. 2. When the master domain info in the db is different then the info received from getStoragePoolInfo. Change-Id: I705298d4f94b4afacc3ca028bb0a4e6080ac5a46 Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1016118 Signed-off-by: Liron Aravot <lara...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java 7 files changed, 73 insertions(+), 40 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/31/22431/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java index f8adb51..55c2e0a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java @@ -85,8 +85,16 @@ } @Override - public EventResult masterDomainNotOperational(Guid storageDomainId, Guid storagePoolId, boolean isReconstructToInactiveDomains) { - VdcActionParametersBase parameters = new ReconstructMasterParameters(storagePoolId, storageDomainId, true, isReconstructToInactiveDomains); + public EventResult masterDomainNotOperational(Guid storageDomainId, + Guid storagePoolId, + boolean isReconstructToInactiveDomains, + boolean canReconstructToCurrentMaster) { + VdcActionParametersBase parameters = + new ReconstructMasterParameters(storagePoolId, + storageDomainId, + true, + isReconstructToInactiveDomains, + canReconstructToCurrentMaster); boolean isSucceeded = Backend.getInstance().runInternalAction(VdcActionType.ReconstructMasterDomain, parameters, ExecutionHandler.createInternalJobContext()).getSucceeded(); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java index b529f05..1aa97ee 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java @@ -11,6 +11,7 @@ import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase; import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap; @@ -41,11 +42,12 @@ private StorageDomain _newMaster; protected boolean _isLastMaster; protected boolean canChooseInactiveDomainAsMaster; + protected boolean canChooseCurrentMasterAsNewMaster; private VDS spm; protected StorageDomain getNewMaster(boolean duringReconstruct) { if (_newMaster == null && Guid.Empty.equals(_newMasterStorageDomainId)) { - _newMaster = electNewMaster(duringReconstruct, canChooseInactiveDomainAsMaster); + _newMaster = electNewMaster(duringReconstruct, canChooseInactiveDomainAsMaster, canChooseCurrentMasterAsNewMaster); } else if (_newMaster == null) { _newMaster = getStorageDomainDAO().get(_newMasterStorageDomainId); } @@ -269,34 +271,35 @@ if (getStorageDomain().getStorageDomainType() == StorageDomainType.Master) { final StorageDomain newMaster = getNewMaster(duringReconstruct); if (newMaster != null) { - // increase master domain version - executeInNewTransaction(new TransactionMethod<Object>() { + newMaster.getStorageStaticData().setLastTimeUsedAsMaster(System.currentTimeMillis()); + _newMasterStorageDomainId = newMaster.getId(); - @Override - public Object runInTransaction() { - StoragePoolIsoMap newMasterMap = newMaster.getStoragePoolIsoMapData(); - newMaster.getStorageStaticData().setLastTimeUsedAsMaster(System.currentTimeMillis()); - getCompensationContext().snapshotEntity(newMaster.getStorageStaticData()); - newMaster.setStorageDomainType(StorageDomainType.Master); - _newMasterStorageDomainId = newMaster.getId(); - if (!duringReconstruct) { - newMasterMap.setStatus(StorageDomainStatus.Unknown); - getCompensationContext().snapshotEntityStatus(newMasterMap); - newMaster.setStatus(StorageDomainStatus.Locked); - getStoragePoolIsoMapDAO().updateStatus(newMasterMap.getId(), newMasterMap.getStatus()); + if (newMaster.getStorageDomainType() != StorageDomainType.Master) { + executeInNewTransaction(new TransactionMethod<Object>() { + + @Override + public Object runInTransaction() { + StoragePoolIsoMap newMasterMap = newMaster.getStoragePoolIsoMapData(); + getCompensationContext().snapshotEntity(newMaster.getStorageStaticData()); + newMaster.setStorageDomainType(StorageDomainType.Master); + if (!duringReconstruct) { + newMasterMap.setStatus(StorageDomainStatus.Unknown); + getCompensationContext().snapshotEntityStatus(newMasterMap); + newMaster.setStatus(StorageDomainStatus.Locked); + getStoragePoolIsoMapDAO().updateStatus(newMasterMap.getId(), newMasterMap.getStatus()); + } + updateStorageDomainStaticData(newMaster.getStorageStaticData()); + getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData()); + getStorageDomain().setStorageDomainType(StorageDomainType.Data); + updateStorageDomainStaticData(getStorageDomain().getStorageStaticData()); + getCompensationContext().stateChanged(); + return null; } - DbFacade.getInstance() - .getStorageDomainStaticDao() - .update(newMaster.getStorageStaticData()); - getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData()); - getStorageDomain().setStorageDomainType(StorageDomainType.Data); - DbFacade.getInstance() - .getStorageDomainStaticDao() - .update(getStorageDomain().getStorageStaticData()); - getCompensationContext().stateChanged(); - return null; - } - }); + }); + } else { + updateStorageDomainStaticData(newMaster.getStorageStaticData()); + } + updateStoragePoolMasterDomainVersionInDiffTransaction(); } else { _isLastMaster = true; @@ -304,6 +307,12 @@ } } + private void updateStorageDomainStaticData(StorageDomainStatic storageDomainStatic) { + DbFacade.getInstance() + .getStorageDomainStaticDao() + .update(storageDomainStatic); + } + @Override public AuditLogType getAuditLogTypeValue() { return getParameters().getIsInternal() ? getSucceeded() ? AuditLogType.SYSTEM_DEACTIVATED_STORAGE_DOMAIN diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java index 74856778..642b6a5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java @@ -48,6 +48,7 @@ super(parameters); _newMasterStorageDomainId = parameters.getNewMasterDomainId(); canChooseInactiveDomainAsMaster = parameters.isCanChooseInactiveDomainAsMaster(); + canChooseCurrentMasterAsNewMaster = parameters.isCanChooseCurrentMasterAsNewMaster(); } private boolean checkIsDomainLocked(StoragePoolIsoMap domainMap) { @@ -94,8 +95,8 @@ protected boolean reconstructMaster() { proceedStorageDomainTreatmentByDomainType(true); - // To issue a reconstructMaster you need to set the domain inactive - if (getParameters().isInactive()) { + // To issue a reconstructMaster you need to set the domain inactive unless the selected domain is the current master + if (getParameters().isInactive() && !getStorageDomain().getId().equals(_newMasterStorageDomainId)) { executeInNewTransaction(new TransactionMethod<Void>() { @Override public Void runInTransaction() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java index 957bc1f..4b39812 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java @@ -265,7 +265,7 @@ * is set to True, an Inactive domain will be returned in case that no domain in Active/Unknown status was found. * @return an elected master domain or null */ - protected StorageDomain electNewMaster(boolean duringReconstruct, boolean selectInactiveWhenNoActiveUnknownDomains) { + protected StorageDomain electNewMaster(boolean duringReconstruct, boolean selectInactiveWhenNoActiveUnknownDomains, boolean canChooseCurrentMasterAsNewMaster) { StorageDomain newMaster = null; if (getStoragePool() != null) { List<StorageDomain> storageDomains = getStorageDomainDAO().getAllForStoragePool(getStoragePool().getId()); @@ -275,7 +275,9 @@ for (StorageDomain dbStorageDomain : storageDomains) { if ((storageDomain == null || (duringReconstruct || !dbStorageDomain.getId() .equals(storageDomain.getId()))) - && dbStorageDomain.getStorageDomainType() == StorageDomainType.Data) { + && ((dbStorageDomain.getStorageDomainType() == StorageDomainType.Data) + || + (canChooseCurrentMasterAsNewMaster && dbStorageDomain.getStorageDomainType() == StorageDomainType.Master))) { if (dbStorageDomain.getStatus() == StorageDomainStatus.Active || dbStorageDomain.getStatus() == StorageDomainStatus.Unknown) { newMaster = dbStorageDomain; @@ -298,7 +300,7 @@ * @return an elected master domain or null */ protected StorageDomain electNewMaster(boolean duringReconstruct) { - return electNewMaster(duringReconstruct, false); + return electNewMaster(duringReconstruct, false, false); } @Override diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java index c09fe3c..b7711e8 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java @@ -7,6 +7,7 @@ private Guid privateNewMasterDomainId; private boolean canChooseInactiveDomainAsMaster; + private boolean canChooseCurrentMasterAsNewMaster; public ReconstructMasterParameters() { privateNewMasterDomainId = Guid.Empty; @@ -18,9 +19,10 @@ setInactive(isInactive); } - public ReconstructMasterParameters(Guid storagePoolId, Guid storageDomainId, boolean isInactive, boolean canChooseInactiveDomainAsMaster) { + public ReconstructMasterParameters(Guid storagePoolId, Guid storageDomainId, boolean isInactive, boolean canChooseInactiveDomainAsMaster, boolean canChooseCurrentMasterAsNewMaster) { this(storagePoolId, storageDomainId, isInactive); setCanChooseInactiveDomainAsMaster(canChooseInactiveDomainAsMaster); + setCanChooseCurrentMasterAsNewMaster(canChooseCurrentMasterAsNewMaster); } public ReconstructMasterParameters(Guid storagePoolId, Guid newMasterDomainId) { @@ -43,4 +45,12 @@ public void setNewMasterDomainId(Guid value) { privateNewMasterDomainId = value; } + + public boolean isCanChooseCurrentMasterAsNewMaster() { + return canChooseCurrentMasterAsNewMaster; + } + + public void setCanChooseCurrentMasterAsNewMaster(boolean canChooseCurrentMasterAsNewMaster) { + this.canChooseCurrentMasterAsNewMaster = canChooseCurrentMasterAsNewMaster; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java index 616fbe2..90447e1 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java @@ -23,7 +23,7 @@ EventResult storageDomainNotOperational(Guid storageDomainId, Guid storagePoolId); // BLL - EventResult masterDomainNotOperational(Guid storageDomainId, Guid storagePoolId, boolean isReconstructToInactiveDomains); // BLL + EventResult masterDomainNotOperational(Guid storageDomainId, Guid storagePoolId, boolean isReconstructToInactiveDomains, boolean canReconstructToCurrentMaster); // BLL void processOnVmStop(Guid vmId); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java index 6466382..1d7723c 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java @@ -467,7 +467,7 @@ return ResourceManager.getInstance() .getEventListener() - .masterDomainNotOperational(masterDomainId, storagePoolId, false); + .masterDomainNotOperational(masterDomainId, storagePoolId, false, true); } }); @@ -1325,7 +1325,7 @@ log.warnFormat("Domain {0} was reported by all hosts in status UP as problematic. Not moving the domain to NonOperational because it is being reconstructed now.", domainIdTuple); result = ResourceManager.getInstance() - .getEventListener().masterDomainNotOperational(domainId, _storagePoolId, false); + .getEventListener().masterDomainNotOperational(domainId, _storagePoolId, false, false); } } @@ -1543,7 +1543,8 @@ log.errorFormat("IrsBroker::Failed::{0}", getCommandName()); log.errorFormat("Exception: {0}", ex.getMessage()); - if (getCurrentIrsProxyData().getHasVdssForSpmSelection()) { + if ((ex.getVdsError() == null || ex.getVdsError().getCode() != VdcBllErrors.StoragePoolWrongMaster) + && getCurrentIrsProxyData().getHasVdssForSpmSelection()) { failover(); } else { isStartReconstruct = true; @@ -1614,7 +1615,9 @@ public EventResult call() { return ResourceManager.getInstance() .getEventListener().masterDomainNotOperational( - masterDomainId, getParameters().getStoragePoolId(), true); + masterDomainId, getParameters().getStoragePoolId(), true, + getVDSReturnValue().getVdsError() != null && + getVDSReturnValue().getVdsError().getCode() == VdcBllErrors.StoragePoolWrongMaster); } }); } else { -- To view, visit http://gerrit.ovirt.org/22431 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I705298d4f94b4afacc3ca028bb0a4e6080ac5a46 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.3 Gerrit-Owner: Liron Ar <lara...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches