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

Reply via email to