Liron Aravot has uploaded a new change for review.

Change subject: core: determine whether domain monitoring result is actual
......................................................................

core: determine whether domain monitoring result is actual

When the domain monitoring results are reported back from vdsm, the
first monitor run may haven't finished yet. In that case the returned
status from vdsm is a dummy status and not an actual result.
The non actual status could lead to a wrong decision making on the engine
status (for example - decide that an inactive domain is now active).

This patch uses the logic added on vdsm side (change I1fea5) to inspect
whether the reported status is actual or not.
For earlier version that doesn't return that info, each returned report
will be considered as actual to leave the behavior as it was.

Change-Id: Iddbba94d81694bd6cb1ce3648872eb81182a50ab
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1183977
Signed-off-by: lara...@redhat.com <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSDomainsData.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.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/vdsbroker/VdsBrokerObjectsBuilder.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java
M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
9 files changed, 65 insertions(+), 21 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/40/38640/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java
index 892f5ba..3f3f3e8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java
@@ -273,7 +273,7 @@
         }
 
         if (result.isSuccess()) {
-            Pair<Boolean, List<StorageDomainStatic>> vdsStatsResults = 
proceedVdsStats(!masterDomainInactiveOrUnknown);
+            Pair<Boolean, List<StorageDomainStatic>> vdsStatsResults = 
proceedVdsStats(!masterDomainInactiveOrUnknown, storagePool);
             result.setSuccess(vdsStatsResults.getFirst());
             if (!result.isSuccess()) {
                 result.setResultData(vdsStatsResults.getSecond());
@@ -300,14 +300,13 @@
         return returnValue;
     }
 
-    private Pair<Boolean, List<StorageDomainStatic>> proceedVdsStats(boolean 
shouldCheckReportedDomains) {
+    private Pair<Boolean, List<StorageDomainStatic>> proceedVdsStats(boolean 
shouldCheckReportedDomains, StoragePool storagePool) {
         Pair<Boolean, List<StorageDomainStatic>> returnValue = new 
Pair<>(true, null);
         try {
             runVdsCommand(VDSCommandType.GetStats, new 
VdsIdAndVdsVDSCommandParametersBase(getVds()));
             if (shouldCheckReportedDomains) {
                 List<Guid> problematicDomainsIds =
-                        
IrsBrokerCommand.fetchDomainsReportedAsProblematic(getVds().getStoragePoolId(),
-                                getVds().getDomains());
+                        
IrsBrokerCommand.fetchDomainsReportedAsProblematic(getVds().getDomains(), 
storagePool);
                 for (Guid domainId : problematicDomainsIds) {
                     StorageDomainStatic domainInfo = 
getStorageDomainStaticDAO().get(domainId);
                     log.errorFormat("Storage Domain {0} of pool {1} is in 
problem in host {2}",
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
index bccc0e6..fb53456 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java
@@ -442,4 +442,12 @@
         return supportedInConfig(ConfigValues.JsonProtocolSupported, version);
     }
 
+    /**
+     * @param version
+     *            Compatibility version to check for.
+     * @return <code>true</code> if report whether domain monitoring result is 
supported for the given version.
+     */
+    public static boolean reportWhetherDomainMonitoringResultIsActual(Version 
version) {
+        return 
supportedInConfig(ConfigValues.ReportWhetherDomainMonitoringResultIsActual, 
version);
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSDomainsData.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSDomainsData.java
index e72b64c..fc44a86 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSDomainsData.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSDomainsData.java
@@ -9,6 +9,7 @@
     private Guid privateDomainId;
     private double lastCheck;
     private double delay;
+    private boolean actual;
 
     public Guid getDomainId() {
         return privateDomainId;
@@ -44,6 +45,14 @@
         return delay;
     }
 
+    public boolean isActual() {
+        return actual;
+    }
+
+    public void setActual(boolean actual) {
+        this.actual = actual;
+    }
+
     public VDSDomainsData() {
         privateDomainId = Guid.Empty;
     }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
index 977aa58..2a84470 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
@@ -2010,5 +2010,9 @@
     @OptionBehaviourAttribute(behaviour = 
OptionBehaviour.CommaSeparatedStringArray)
     UnsupportedLocalesFilter,
 
+    @TypeConverterAttribute(Boolean.class)
+    @DefaultValueAttribute("true")
+    ReportWhetherDomainMonitoringResultIsActual,
+
     Invalid;
 }
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 ec1073e..4124e86 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
@@ -65,10 +65,10 @@
         }
     }
 
-    public static List<Guid> fetchDomainsReportedAsProblematic(Guid 
storagePoolId, List<VDSDomainsData> vdsDomainsData) {
-        IrsProxyData proxy = _irsProxyData.get(storagePoolId);
+    public static List<Guid> 
fetchDomainsReportedAsProblematic(List<VDSDomainsData> vdsDomainsData, 
StoragePool storagePool) {
+        IrsProxyData proxy = _irsProxyData.get(storagePool.getId());
         if (proxy != null) {
-            return proxy.obtainDomainsReportedAsProblematic(vdsDomainsData);
+            return proxy.obtainDomainsReportedAsProblematic(vdsDomainsData, 
storagePool);
         }
         return Collections.emptyList();
     }
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 6da6e7ba..4482a0b 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
@@ -17,6 +17,7 @@
 
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
 import 
org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions;
@@ -1106,14 +1107,14 @@
                 // Unknown domains in pool
                 for (VDSDomainsData tempData : data) {
                     if (domainsInPool.contains(tempData.getDomainId())) {
-                        DomainMonitoringResult domainMonitoringResult = 
analyzeDomainReport(tempData, false);
-                        if (domainMonitoringResult.invalid()) {
+                        DomainMonitoringResult domainMonitoringResult = 
analyzeDomainReport(tempData, storagePool, false);
+                        if (domainMonitoringResult.invalidAndActual()) {
                             
domainsProblematicReportInfo.put(tempData.getDomainId(), 
domainMonitoringResult);
-                        } else if (tempData.getDelay() > Config.<Double> 
getValue(ConfigValues.MaxStorageVdsDelayCheckSec)) {
+                        } else if (domainMonitoringResult.actual() && 
tempData.getDelay() > Config.<Double> 
getValue(ConfigValues.MaxStorageVdsDelayCheckSec)) {
                             logDelayedDomain(vdsId, tempData);
                         }
                     } else if 
(inActiveDomainsInPool.contains(tempData.getDomainId())
-                            && analyzeDomainReport(tempData, false).valid()) {
+                            && analyzeDomainReport(tempData, storagePool, 
false).validAndActual()) {
                         log.warnFormat("Storage Domain {0} was reported by 
Host {1} as Active in Pool {2}, moving to active status",
                                 getDomainIdTuple(tempData.getDomainId()),
                                 vdsName,
@@ -1179,7 +1180,7 @@
                 AuditLogType.VDS_DOMAIN_DELAY_INTERVAL);
     }
 
-    protected List<Guid> 
obtainDomainsReportedAsProblematic(List<VDSDomainsData> vdsDomainsData) {
+    protected List<Guid> 
obtainDomainsReportedAsProblematic(List<VDSDomainsData> vdsDomainsData, 
StoragePool storagePool) {
         List<Guid> domainsInProblem = new LinkedList<>();
         Set<Guid> domainsInPool = new HashSet<Guid>(
                 DbFacade.getInstance().getStorageDomainStaticDao().getAllIds(
@@ -1189,7 +1190,7 @@
         List<Guid> domainWhichWereSeen = new ArrayList<Guid>();
         for (VDSDomainsData vdsDomainData : vdsDomainsData) {
             if (domainsInPool.contains(vdsDomainData.getDomainId())) {
-                if (analyzeDomainReport(vdsDomainData, true).invalid()) {
+                if (analyzeDomainReport(vdsDomainData, storagePool, 
true).invalidAndActual()) {
                     domainsInProblem.add(vdsDomainData.getDomainId());
                 }
                 domainWhichWereSeen.add(vdsDomainData.getDomainId());
@@ -1206,24 +1207,35 @@
     }
 
     private enum DomainMonitoringResult {
-        PROBLEMATIC(false), STORAGE_ACCCESS_ERROR(false), OK(true), 
NOT_REPORTED(false);
+        PROBLEMATIC(Boolean.FALSE), STORAGE_ACCCESS_ERROR(Boolean.FALSE), 
OK(Boolean.TRUE), NOT_REPORTED(Boolean.FALSE), NOT_ACTUAL(null);
 
-        private boolean valid;
+        private Boolean valid;
 
-        private DomainMonitoringResult(boolean valid) {
+        private DomainMonitoringResult(Boolean valid) {
             this.valid = valid;
         }
 
-        public boolean valid() {
-            return valid;
+        public boolean validAndActual() {
+            return actual() && valid;
         }
 
-        public boolean invalid() {
-            return !valid;
+        public boolean invalidAndActual() {
+            return actual() && !valid;
+        }
+
+        public boolean actual() {
+            return this != NOT_ACTUAL;
         }
     }
 
-    private DomainMonitoringResult analyzeDomainReport(VDSDomainsData 
tempData, boolean isLog) {
+    private DomainMonitoringResult analyzeDomainReport(VDSDomainsData 
tempData, StoragePool storagePool, boolean isLog) {
+        if (!tempData.isActual() &&
+                
FeatureSupported.reportWhetherDomainMonitoringResultIsActual(storagePool.getcompatibility_version()))
 {
+            log.warnFormat("Domain '{}' report isn't an actual report",
+                    getDomainIdTuple(tempData.getDomainId()));
+            return DomainMonitoringResult.NOT_ACTUAL;
+        }
+
         if (tempData.getCode() != 0) {
             if (isLog) {
                 log.errorFormat("Domain {0} was reported with error code {1}",
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
index 4d24960..9305232 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java
@@ -933,6 +933,11 @@
                         delay = Double.parseDouble((String) 
internalValue.get(VdsProperties.delay));
                     }
                     data.setDelay(delay);
+                    Boolean actual = Boolean.TRUE;
+                    if (internalValue.containsKey(VdsProperties.actual)) {
+                        actual = 
(Boolean)internalValue.get(VdsProperties.actual);
+                    }
+                    data.setActual(actual);
                     domainsData.add(data);
                 } catch (Exception e) {
                     log.error("failed building domains", e);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java
index ee82ddf..675c0c9 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java
@@ -360,6 +360,7 @@
     public static final String code = "code";
     public static final String lastCheck = "lastCheck";
     public static final String delay = "delay";
+    public static final String actual = "actual";
 
     public static final String DISK_STATS = "diskStats";
     public static final String DISK_STATS_FREE = "free";
diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql 
b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
index 71c27f5..2bb6e50 100644
--- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
+++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
@@ -306,6 +306,12 @@
 select fn_db_add_config_value('ImportDataStorageDomain','false','3.3');
 select fn_db_add_config_value('ImportDataStorageDomain','false','3.4');
 
+select 
fn_db_add_config_value('ReportWhetherDomainMonitoringResultIsActual','false','3.0');
+select 
fn_db_add_config_value('ReportWhetherDomainMonitoringResultIsActual','false','3.1');
+select 
fn_db_add_config_value('ReportWhetherDomainMonitoringResultIsActual','false','3.2');
+select 
fn_db_add_config_value('ReportWhetherDomainMonitoringResultIsActual','false','3.3');
+select 
fn_db_add_config_value('ReportWhetherDomainMonitoringResultIsActual','false','3.4');
+
 -- Mixed domain types in a data center support
 select fn_db_add_config_value('MixedDomainTypesInDataCenter','false','3.0');
 select fn_db_add_config_value('MixedDomainTypesInDataCenter','false','3.1');


-- 
To view, visit https://gerrit.ovirt.org/38640
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iddbba94d81694bd6cb1ce3648872eb81182a50ab
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Liron Aravot <lara...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to