Liron Aravot has uploaded a new change for review. Change subject: core: replacing fenceSpmStorage with logic within engine ......................................................................
core: replacing fenceSpmStorage with logic within engine Currently when the SPM is in different statuses the user can manually confirm that the host has been rebooted in order to attempt to start the spm on a different host. That confirmation propogates to the execution of FenceVdsManuallyCommand that may execute the fenceSpmStorage verb on vdsm through some host. The fenceSpmStorage verb edits the pool metadata to indicate that currently there's no host which is the SPM. Later on when the engine will enter the start spm flow, it will execute the getSpmStatus which should return that there's no spm and then the engine will attempt to start the spm on some host within the data center. On storage pools that use the StoragePoolDiskBackend this flow works, but when using the new MemoryBackend the spm status result is being returned from the cluster lock, the data there isn't editable at the moment so on that case, the spm won't be able to start on other host (as the returned result would indicate that there's a spm). On this patch when a user confirm that the spm has been rebooted, we'll save that in the memory, when the spm selection process will attempt to select a new spm in case that the reported spm was confirmed to be fenced by the user - we'll proceed with starting the spm on another host. Change-Id: I2e489cd4ff1f8e8686c89d8ceab72c3af3653a56 Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1092752 Signed-off-by: Liron Aravot <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FenceVdsManualyCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ResetIrsVDSCommandParameters.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ResetIrsVDSCommand.java 4 files changed, 48 insertions(+), 66 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/89/30889/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FenceVdsManualyCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FenceVdsManualyCommand.java index 2701e2e..f7dadd9 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FenceVdsManualyCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FenceVdsManualyCommand.java @@ -8,13 +8,12 @@ import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; -import org.ovirt.engine.core.common.action.LockProperties; -import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.FenceVdsManualyParameters; +import org.ovirt.engine.core.common.action.LockProperties; +import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdsActionParameters; -import org.ovirt.engine.core.common.businessentities.SpmStatusResult; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; @@ -24,9 +23,7 @@ import org.ovirt.engine.core.common.businessentities.VdsSpmStatus; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.utils.Pair; -import org.ovirt.engine.core.common.vdscommands.FenceSpmStorageVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.ResetIrsVDSCommandParameters; -import org.ovirt.engine.core.common.vdscommands.SpmStatusVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; @@ -98,37 +95,30 @@ @Override protected void executeCommand() { - boolean result = true; setVdsName(_problematicVds.getName()); if (_problematicVds.getSpmStatus() == VdsSpmStatus.SPM) { - result = activateDataCenter(); + activateDataCenter(); } - if ((getParameters()).getClearVMs() && result) { + if ((getParameters()).getClearVMs()) { VdsActionParameters tempVar = new VdsActionParameters(_problematicVds.getId()); tempVar.setSessionId(getParameters().getSessionId()); runInternalActionWithTasksContext( VdcActionType.ClearNonResponsiveVdsVms, tempVar); } - setSucceeded(result); - if (getSucceeded()) { - // Remove all alerts except NOT CONFIG alert - AlertDirector.RemoveAllVdsAlerts(_problematicVds.getId(), false); - } + setSucceeded(true); + // Remove all alerts except NOT CONFIG alert + AlertDirector.RemoveAllVdsAlerts(_problematicVds.getId(), false); } @Override public AuditLogType getAuditLogTypeValue() { if (isInternalExecution()) { - return _fenceSpmCalled != null && !_fenceSpmCalled - ? AuditLogType.VDS_AUTO_FENCE_FAILED_CALL_FENCE_SPM - : getSucceeded() + return getSucceeded() ? AuditLogType.VDS_AUTO_FENCE_STATUS : AuditLogType.VDS_AUTO_FENCE_STATUS_FAILED; } else { - return _fenceSpmCalled != null && !_fenceSpmCalled - ? AuditLogType.VDS_MANUAL_FENCE_FAILED_CALL_FENCE_SPM - : getSucceeded() + return getSucceeded() ? AuditLogType.VDS_MANUAL_FENCE_STATUS : AuditLogType.VDS_MANUAL_FENCE_STATUS_FAILED; } @@ -163,12 +153,7 @@ return result; } - private Boolean _fenceSpmCalled; - - private boolean activateDataCenter() { - boolean result = false; - _fenceSpmCalled = false; - + private void activateDataCenter() { StorageDomain masterDomain = LinqUtils.firstOrNull( DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(getStoragePool().getId()), new Predicate<StorageDomain>() { @@ -184,45 +169,8 @@ && masterDomain.getStatus() != null && (masterDomain.getStatus() == StorageDomainStatus.Active || masterDomain.getStatus() == StorageDomainStatus.Unknown || masterDomain.getStatus() == StorageDomainStatus.Inactive)) { - if (!getStoragePool().isLocal()) { - // if only one\"the fenced" host connected to sp in dc - if (getAmountOfVdssInPool() == 1) { - resetIrs(); - result = true; - } else { - for (VDS vds : getAllRunningVdssInPool()) { - try { - SpmStatusResult statusResult = (SpmStatusResult) runVdsCommand(VDSCommandType.SpmStatus, - new SpmStatusVDSCommandParameters(vds.getId(), getStoragePool().getId())) - .getReturnValue(); - log.infoFormat("Trying to fence spm {0} via vds {1}", - _problematicVds.getName(), - vds.getName()); - if (runVdsCommand( - VDSCommandType.FenceSpmStorage, - new FenceSpmStorageVDSCommandParameters(vds.getId(), - getStoragePool().getId(), - statusResult.getSpmId(), - statusResult.getSpmLVER())) - .getSucceeded()) { - resetIrs(); - result = true; - _fenceSpmCalled = true; - break; - } - } catch (Exception e) { - log.warnFormat("Could not fence spm on vds {0}", vds.getName()); - } - } - } - } else { - resetIrs(); - result = true; - } - } else { - result = true; + resetIrs(); } - return result; } private void resetIrs() { @@ -230,7 +178,7 @@ ResetIrsVDSCommandParameters tempVar = new ResetIrsVDSCommandParameters(getStoragePool() .getId(), getStoragePool().getspm_vds_id()); - tempVar.setIgnoreStopFailed(true); + tempVar.setVdsAlreadyRebooted(true); runVdsCommand(VDSCommandType.ResetIrs, tempVar); } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ResetIrsVDSCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ResetIrsVDSCommandParameters.java index 78f3d8b..16d71c3 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ResetIrsVDSCommandParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ResetIrsVDSCommandParameters.java @@ -8,6 +8,8 @@ private Guid preferredSPMId; + private boolean vdsAlreadyRebooted; + public ResetIrsVDSCommandParameters() { } @@ -29,6 +31,14 @@ privateVdsId = value; } + public boolean isVdsAlreadyRebooted() { + return vdsAlreadyRebooted; + } + + public void setVdsAlreadyRebooted(boolean vdsAlreadyRebooted) { + this.vdsAlreadyRebooted = vdsAlreadyRebooted; + } + private boolean privateIgnoreStopFailed; public boolean getIgnoreStopFailed() { diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java index 996b10b..a81760c 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java @@ -109,6 +109,7 @@ private String privatemCurrentIrsHost; private IIrsServer irsProxy; + private Guid fencedIrs; private IIrsServer getmIrsProxy() { return irsProxy; @@ -132,6 +133,14 @@ private void setProtocol(VdsProtocol value) { this.privateProtocol = value; + } + + public Guid getFencedIrs() { + return fencedIrs; + } + + public void setFencedIrs(Guid fencedIrs) { + this.fencedIrs = fencedIrs; } private Guid _storagePoolId = Guid.Empty; @@ -772,6 +781,7 @@ .getEventListener() .storagePoolStatusChanged(storagePool.getId(), storagePool.getStatus()); + setFencedIrs(null); returnValue = selectedVds.argvalue.getHostName(); log.infoFormat("Initialize Irs proxy from vds: {0}", returnValue); AuditLogableBase logable = new AuditLogableBase(selectedVds.argvalue.getId()); @@ -821,6 +831,12 @@ DbFacade.getInstance().getStoragePoolDao().update(storagePool); } + private boolean wasVdsManuallyFenced(int spmId) { + vds_spm_id_map map = DbFacade.getInstance().getVdsSpmIdMapDao().get( + _storagePoolId, spmId); + return map != null && map.getId().equals(getFencedIrs()); + } + private SpmStatusResult handleSpmStatusResult(Guid curVdsId, List<VDS> vdsByPool, final StoragePool storagePool, @@ -829,7 +845,7 @@ if (spmStatus.getSpmStatus() == SpmStatus.Free) { int vdsSpmIdToFence = -1; boolean startSpm = true; - if (spmStatus.getSpmId() != -1) { + if (spmStatus.getSpmId() != -1 && !wasVdsManuallyFenced(spmStatus.getSpmId())) { int spmId = spmStatus.getSpmId(); Guid spmVdsId = Guid.Empty; VDS spmVds = null; @@ -872,6 +888,7 @@ } } } + try { if (!spmVdsId.equals(Guid.Empty)) { SpmStatusResult destSpmStatus = (SpmStatusResult) ResourceManager diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ResetIrsVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ResetIrsVDSCommand.java index 0eb32ec..b402d3d 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ResetIrsVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ResetIrsVDSCommand.java @@ -20,7 +20,8 @@ protected void executeVDSCommand() { P parameters = getParameters(); Guid vdsId = parameters.getVdsId(); - if (ResourceManager + if (getParameters().isVdsAlreadyRebooted() || + ResourceManager .getInstance() .runVdsCommand(VDSCommandType.SpmStop, new SpmStopVDSCommandParameters(vdsId, parameters.getStoragePoolId())).getSucceeded() @@ -28,7 +29,13 @@ if (getParameters().getPreferredSPMId() != null) { getCurrentIrsProxyData().setPreferredHostId(getParameters().getPreferredSPMId()); } + + if (getParameters().isVdsAlreadyRebooted()) { + getCurrentIrsProxyData().setFencedIrs(vdsId); + } + getCurrentIrsProxyData().resetIrs(); + StoragePool pool = DbFacade.getInstance().getStoragePoolDao().get(parameters.getStoragePoolId()); if (pool != null && (pool.getStatus() == StoragePoolStatus.NotOperational)) { ResourceManager -- To view, visit http://gerrit.ovirt.org/30889 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2e489cd4ff1f8e8686c89d8ceab72c3af3653a56 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Liron Aravot <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
