Sergey Gotliv has uploaded a new change for review. Change subject: engine: Speed up SPM re-selection process. ......................................................................
engine: Speed up SPM re-selection process. Engine trying to send stopSPM command during SPM re-selection proccess, sometimes SPM is already stopped by other thread so engine gets "Not SPM" response, which is interpreted as a failure. In this case engine must move forward to re-select the SPM instead of failover as it today. Change-Id: I2c191ad8d4ec0fb4f5f8ff68b84fa5189ecc7114 Bug-Url: https://bugzilla.redhat.com/986961 Signed-off-by: Sergey Gotliv <sgot...@redhat.com> --- M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java 1 file changed, 64 insertions(+), 43 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/13/18013/1 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 b7fe7c4..5cdd4f1 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 @@ -899,28 +899,19 @@ if (map != null) { VDS vdsToFenceObject = DbFacade.getInstance().getVdsDao().get(map.getId()); if (vdsToFenceObject != null) { - log.infoFormat("SPM selection - vds seems as spm {0}", vdsToFenceObject.getName()); + log.infoFormat("SPM selection - vds seems as SPM {0}", vdsToFenceObject.getName()); if (vdsToFenceObject.getStatus() == VDSStatus.NonResponsive) { - log.warn("spm vds is non responsive, stopping spm selection."); + log.warn("SPM vds is non responsive, stopping spm selection."); selectedVds.argvalue = null; return spmStatus; + } else if (stopSpm(vdsToFenceObject.getId())) { + // if spm stop succeeded no need to fence, continue with spm selection + log.info("SPM stop succeeded, continue with SPM selection!"); } else { - // try to stop spm - VDSReturnValue spmStopReturnValue = ResourceManager.getInstance().runVdsCommand( - VDSCommandType.SpmStop, - new SpmStopVDSCommandParameters(vdsToFenceObject.getId(), _storagePoolId)); - // if spm stop succeeded no need to fence, - // continue with spm selection - if (spmStopReturnValue != null && spmStopReturnValue.getSucceeded()) { - log.info("spm stop succeeded, continuing with spm selection"); - } - // if spm stop failed for any reason we stop spm - // selection - else { - log.warn("spm stop on spm failed, stopping spm selection!"); - selectedVds.argvalue = null; - return spmStatus; - } + // if spm stop failed for any reason we stop spm selection + log.warn("SPM stop is failed, stopping spm selection!"); + selectedVds.argvalue = null; + return spmStatus; } } } @@ -938,35 +929,15 @@ log.infoFormat("starting spm on vds {0}, storage pool {1}, prevId {2}, LVER {3}", selectedVds.argvalue.getName(), storagePool.getName(), spmStatus.getSpmId(), spmStatus.getSpmLVER()); - spmStatus = (SpmStatusResult) ResourceManager - .getInstance() - .runVdsCommand( - VDSCommandType.SpmStart, - new SpmStartVDSCommandParameters(selectedVds.argvalue.getId(), _storagePoolId, - spmStatus.getSpmId(), spmStatus.getSpmLVER(), storagePool - .getrecovery_mode(), vdsSpmIdToFence != -1, storagePool.getStoragePoolFormatType())).getReturnValue(); + + spmStatus = startSpm(selectedVds.argvalue.getId(), spmStatus, storagePool, vdsSpmIdToFence); + if (spmStatus != null && spmStatus.getSpmStatus() == SpmStatus.SPM) { _isSpmStartCalled = true; } else { - ResourceManager - .getInstance() - .getEventListener() - .storagePoolStatusChange(storagePool.getId(), - StoragePoolStatus.NonResponsive, - AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_PROBLEMATIC, - VdcBllErrors.ENGINE, - TransactionScopeOption.RequiresNew); + fireStoragePoolStatusChangedToNonResponsiveEvent(storagePool); if (spmStatus != null) { - TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() { - @Override - public Object runInTransaction() { - StoragePool pool = - DbFacade.getInstance().getStoragePoolDao().get(storagePool.getId()); - pool.setspm_vds_id(null); - DbFacade.getInstance().getStoragePoolDao().update(pool); - return null; - } - }); + clearSpmVdsIdOnPool(storagePool); } throw new IrsSpmStartFailedException(); } @@ -975,6 +946,56 @@ return spmStatus; } + private boolean stopSpm(Guid vdsId) { + VDSReturnValue returnValue = ResourceManager.getInstance().runVdsCommand( + VDSCommandType.SpmStop, + new SpmStopVDSCommandParameters(vdsId, _storagePoolId) + ); + return returnValue != null && (returnValue.getSucceeded() || isNotSPM(returnValue)); + } + + private boolean isNotSPM(VDSReturnValue returnValue) { + return returnValue != null && returnValue.getVdsError() != null && + returnValue.getVdsError().getCode() == VdcBllErrors.SpmStatusError; + } + + private SpmStatusResult startSpm(Guid vdsId, + SpmStatusResult spmStatus, + StoragePool storagePool, + int vdsSpmIdToFence) { + SpmStartVDSCommandParameters params = new SpmStartVDSCommandParameters( + vdsId, _storagePoolId, spmStatus.getSpmId(), spmStatus.getSpmLVER(), + storagePool.getrecovery_mode(), vdsSpmIdToFence != -1, storagePool.getStoragePoolFormatType() + ); + + return (SpmStatusResult) ResourceManager.getInstance().runVdsCommand( + VDSCommandType.SpmStart, params + ).getReturnValue(); + } + + private void fireStoragePoolStatusChangedToNonResponsiveEvent(StoragePool storagePool) { + ResourceManager.getInstance().getEventListener().storagePoolStatusChange( + storagePool.getId(), + StoragePoolStatus.NonResponsive, + AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_PROBLEMATIC, + VdcBllErrors.ENGINE, + TransactionScopeOption.RequiresNew + ); + } + + private void clearSpmVdsIdOnPool(final StoragePool storagePool) { + TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() { + @Override + public Object runInTransaction() { + StoragePool pool = + DbFacade.getInstance().getStoragePoolDao().get(storagePool.getId()); + pool.setspm_vds_id(null); + DbFacade.getInstance().getStoragePoolDao().update(pool); + return null; + } + }); + } + public String getIsoPrefix() { synchronized (syncObj) { if (mIsoPrefix == null || mIsoPrefix.length() == 0) { -- To view, visit http://gerrit.ovirt.org/18013 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2c191ad8d4ec0fb4f5f8ff68b84fa5189ecc7114 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sergey Gotliv <sgot...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches