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 Change-Id: I705298d4f94b4afacc3ca028bb0a4e6080ac5a46 Signed-off-by: Liron Aravot <[email protected]> --- 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, 43 insertions(+), 26 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/16/22016/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 8f16fa4..3b0b6d1 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 @@ -86,7 +86,7 @@ } @Override - public EventResult masterDomainNotOperational(Guid storageDomainId, Guid storagePoolId, boolean isReconstructToInactiveDomains) { + public EventResult masterDomainNotOperational(Guid storageDomainId, Guid storagePoolId, boolean isReconstructToInactiveDomains, boolean canReconstructToCurrentMaster) { VdcActionParametersBase parameters = new ReconstructMasterParameters(storagePoolId, storageDomainId, true, isReconstructToInactiveDomains); boolean isSucceeded = Backend.getInstance().runInternalAction(VdcActionType.ReconstructMasterDomain, parameters, 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..af7c272 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 @@ -41,11 +41,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); } @@ -276,24 +277,27 @@ 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) { + 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()); + } + DbFacade.getInstance() + .getStorageDomainStaticDao() + .update(newMaster.getStorageStaticData()); + getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData()); + getStorageDomain().setStorageDomainType(StorageDomainType.Data); + getCompensationContext().stateChanged(); } - DbFacade.getInstance() - .getStorageDomainStaticDao() - .update(newMaster.getStorageStaticData()); - getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData()); - getStorageDomain().setStorageDomainType(StorageDomainType.Data); + DbFacade.getInstance() .getStorageDomainStaticDao() .update(getStorageDomain().getStorageStaticData()); - getCompensationContext().stateChanged(); return null; } }); 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 67d6f8c..1cefba2 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() && !getNewMaster(true).getId().equals(getStorageDomain().getId())) { 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 19a7d37..805130d 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 @@ -310,7 +310,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()); @@ -320,7 +320,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; @@ -343,7 +345,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..99a9359 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; @@ -43,4 +44,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 b4b23c8..e9876e5 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 @@ -22,7 +22,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 7bc4b95..e45cf4a 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 @@ -466,7 +466,7 @@ return ResourceManager.getInstance() .getEventListener() - .masterDomainNotOperational(masterDomainId, storagePoolId, false); + .masterDomainNotOperational(masterDomainId, storagePoolId, false, true); } }); @@ -1324,7 +1324,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); } } @@ -1542,7 +1542,7 @@ log.errorFormat("IrsBroker::Failed::{0}", getCommandName()); log.errorFormat("Exception: {0}", ex.getMessage()); - if (getCurrentIrsProxyData().getHasVdssForSpmSelection()) { + if (ex.getVdsError().getCode() != VdcBllErrors.StoragePoolWrongMaster && getCurrentIrsProxyData().getHasVdssForSpmSelection()) { failover(); } else { isStartReconstruct = true; @@ -1613,7 +1613,8 @@ public EventResult call() { return ResourceManager.getInstance() .getEventListener().masterDomainNotOperational( - masterDomainId, getParameters().getStoragePoolId(), true); + masterDomainId, getParameters().getStoragePoolId(), true, + getVDSReturnValue().getVdsError().getCode() == VdcBllErrors.StoragePoolWrongMaster); } }); } else { -- To view, visit http://gerrit.ovirt.org/22016 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I705298d4f94b4afacc3ca028bb0a4e6080ac5a46 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liron Ar <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
