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

Reply via email to