Liron Ar has uploaded a new change for review.

Change subject: core: change domains status to unknown when there are no 
reporting hosts
......................................................................

core: change domains status to unknown when there are no reporting hosts

Currently the monitored pool domains 'change' their statuses according to
the reports received by the pool hosts that are in status UP.

When there are no reporting hosts - the status of the pool domains that are
monitored should be changed to unknown, because otherwise nothing will trigger
the status change. In that case (an example) we might be left with a domain
in 'active' status although there are no reporting hosts.

Change-Id: I8091a4864711aeccee41effb1bc7d9823a1870c7
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=975742
Signed-off-by: Liron Aravot <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SetStoragePoolStatusCommand.java
D 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/storage/StoragePoolDomainHelper.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ReconstructMasterVDSCommand.java
5 files changed, 90 insertions(+), 48 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/26077/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SetStoragePoolStatusCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SetStoragePoolStatusCommand.java
index 1f521a9..94fe74e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SetStoragePoolStatusCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SetStoragePoolStatusCommand.java
@@ -1,6 +1,6 @@
 package org.ovirt.engine.core.bll.storage;
 
-import java.util.List;
+import java.util.EnumSet;
 
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.Backend;
@@ -8,8 +8,8 @@
 import org.ovirt.engine.core.common.action.SetStoragePoolStatusParameters;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
-import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.vdsbroker.storage.StoragePoolDomainHelper;
 
 public class SetStoragePoolStatusCommand<T extends 
SetStoragePoolStatusParameters> extends
         StorageHandlingCommandBase<T> {
@@ -24,17 +24,10 @@
         
DbFacade.getInstance().getStoragePoolDao().updateStatus(getStoragePool().getId(),
 getStoragePool().getStatus());
         if (getParameters().getStatus() == StoragePoolStatus.NonResponsive
                 || getParameters().getStatus() == 
StoragePoolStatus.NotOperational) {
-            List<StoragePoolIsoMap> storagesStatusInPool = 
DbFacade.getInstance()
-                    
.getStoragePoolIsoMapDao().getAllForStoragePool(getStoragePool().getId());
-            for (StoragePoolIsoMap storageStatusInPool : storagesStatusInPool) 
{
-                if (storageStatusInPool.getStatus() != null
-                        && storageStatusInPool.getStatus() == 
StorageDomainStatus.Active) {
-                    storageStatusInPool.setStatus(StorageDomainStatus.Unknown);
-                    DbFacade.getInstance()
-                            .getStoragePoolIsoMapDao()
-                            .updateStatus(storageStatusInPool.getId(), 
storageStatusInPool.getStatus());
-                }
-            }
+            
StoragePoolDomainHelper.updateApplicablePoolDomainsStatuses(getStoragePool().getId(),
+                    EnumSet.of(StorageDomainStatus.Active),
+                    StorageDomainStatus.Unknown,
+                    null);
         }
         StoragePoolStatusHandler.poolStatusChanged(getStoragePool().getId(), 
getStoragePool().getStatus());
         setSucceeded(true);
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
deleted file mode 100644
index f70e1e4..0000000
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.ovirt.engine.core.utils;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
-import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
-
-
-public class StoragePoolDomainHelper {
-
-    public static Map<String, String> 
buildStoragePoolDomainsMap(List<StoragePoolIsoMap> storagePoolIsoMaps) {
-        Map<String, String> storageDomains = new HashMap<String, String>();
-
-        for (StoragePoolIsoMap domain : storagePoolIsoMaps) {
-            if (domain.getStatus() == StorageDomainStatus.Maintenance) {
-                storageDomains.put(domain.getstorage_id().toString(), 
"attached");
-            } else {
-                storageDomains.put(domain.getstorage_id().toString(),
-                        StorageDomainStatus.Active.toString().toLowerCase());
-            }
-        }
-
-        return storageDomains;
-    }
-
-}
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 10380d9..11342cc 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
@@ -78,6 +78,7 @@
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 import org.ovirt.engine.core.vdsbroker.ResourceManager;
+import org.ovirt.engine.core.vdsbroker.storage.StoragePoolDomainHelper;
 import org.ovirt.engine.core.vdsbroker.vdsbroker.BrokerCommandBase;
 import org.ovirt.engine.core.vdsbroker.vdsbroker.VDSExceptionBase;
 import org.ovirt.engine.core.vdsbroker.vdsbroker.VDSNetworkException;
@@ -86,6 +87,7 @@
 @Logged(errorLevel = LogLevel.ERROR)
 public abstract class IrsBrokerCommand<P extends IrsBaseVDSCommandParameters> 
extends BrokerCommandBase<P> {
     private static Map<Guid, IrsProxyData> _irsProxyData = new 
ConcurrentHashMap<Guid, IrsProxyData>();
+    private static final VDSStatus reportingVdsStatus = VDSStatus.Up;
 
     /**
      * process received domain monitoring information from a given vds if 
necessary (according to it's status).
@@ -95,7 +97,7 @@
      */
     public static void updateVdsDomainsData(VDS vds, Guid storagePoolId,
             ArrayList<VDSDomainsData> vdsDomainData) {
-        if (vds.getStatus() == VDSStatus.Up) {
+        if (vds.getStatus() == reportingVdsStatus) {
             IrsProxyData proxy = _irsProxyData.get(storagePoolId);
             if (proxy != null) {
                 proxy.updateVdsDomainsData(vds.getId(), vds.getName(), 
vdsDomainData);
@@ -188,11 +190,24 @@
                     if (!_disposed) {
                         StoragePool storagePool = 
DbFacade.getInstance().getStoragePoolDao()
                                 .get(_storagePoolId);
-                        if (storagePool != null
-                                && (storagePool.getStatus() == 
StoragePoolStatus.Up
-                                        || storagePool.getStatus() == 
StoragePoolStatus.NonResponsive || storagePool
-                                        .getStatus() == 
StoragePoolStatus.Contend)) {
-                            proceedStoragePoolStats(storagePool);
+
+                        if (storagePool != null) {
+                            // when there are no hosts in status up, it means 
that there shouldn't be domain monitoring
+                            // so all the domains need to move to "unknown" 
status as otherwise their status won't change.
+                            if (DbFacade.getInstance()
+                                    .getVdsDao()
+                                    
.getAllForStoragePoolAndStatus(_storagePoolId, reportingVdsStatus)
+                                    .isEmpty()) {
+                                
StoragePoolDomainHelper.updateApplicablePoolDomainsStatuses(_storagePoolId,
+                                        
StoragePoolDomainHelper.storageDomainMonitoredStatus,
+                                        StorageDomainStatus.Unknown, "no 
reporting hosts");
+                            }
+
+                            if (storagePool.getStatus() == StoragePoolStatus.Up
+                                    || storagePool.getStatus() == 
StoragePoolStatus.NonResponsive || storagePool
+                                            .getStatus() == 
StoragePoolStatus.Contend) {
+                                proceedStoragePoolStats(storagePool);
+                            }
                         }
 
                     }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/storage/StoragePoolDomainHelper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/storage/StoragePoolDomainHelper.java
new file mode 100644
index 0000000..a27d642
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/storage/StoragePoolDomainHelper.java
@@ -0,0 +1,62 @@
+package org.ovirt.engine.core.vdsbroker.storage;
+
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
+import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+
+
+public class StoragePoolDomainHelper {
+
+    private static final Log log = 
LogFactory.getLog(StoragePoolDomainHelper.class);
+
+    public static final Set<StorageDomainStatus> storageDomainMonitoredStatus =
+            
Collections.unmodifiableSet(EnumSet.of(StorageDomainStatus.InActive, 
StorageDomainStatus.Active));
+
+    public static Map<String, String> 
buildStoragePoolDomainsMap(List<StoragePoolIsoMap> storagePoolIsoMaps) {
+        Map<String, String> storageDomains = new HashMap<String, String>();
+
+        for (StoragePoolIsoMap domain : storagePoolIsoMaps) {
+            if (domain.getStatus() == StorageDomainStatus.Maintenance) {
+                storageDomains.put(domain.getstorage_id().toString(), 
"attached");
+            } else {
+                storageDomains.put(domain.getstorage_id().toString(),
+                        StorageDomainStatus.Active.toString().toLowerCase());
+            }
+        }
+
+        return storageDomains;
+    }
+
+    public static void updateApplicablePoolDomainsStatuses(Guid storagePoolId,
+            Set<StorageDomainStatus> applicableStatusesForUpdate,
+            StorageDomainStatus newStatus, String reason) {
+        List<StoragePoolIsoMap> storagesStatusInPool = DbFacade.getInstance()
+                .getStoragePoolIsoMapDao().getAllForStoragePool(storagePoolId);
+        for (StoragePoolIsoMap storageStatusInPool : storagesStatusInPool) {
+            if (storageStatusInPool.getStatus() != null
+                    && storageStatusInPool.getStatus() != newStatus
+                    && 
applicableStatusesForUpdate.contains(storageStatusInPool.getStatus())) {
+                log.infoFormat("Storage Pool {0} - Updating Storage Domain {1} 
status from {2} to {3}, reason : {4}",
+                        storagePoolId,
+                        storageStatusInPool.getstorage_id(),
+                        storageStatusInPool.getStatus().name(),
+                        newStatus.name(),
+                        reason);
+                storageStatusInPool.setStatus(newStatus);
+                DbFacade.getInstance()
+                        .getStoragePoolIsoMapDao()
+                        .updateStatus(storageStatusInPool.getId(), 
storageStatusInPool.getStatus());
+            }
+        }
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ReconstructMasterVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ReconstructMasterVDSCommand.java
index 59b6ae5..c3e16b4 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ReconstructMasterVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ReconstructMasterVDSCommand.java
@@ -4,8 +4,8 @@
 
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
-import org.ovirt.engine.core.utils.StoragePoolDomainHelper;
 import 
org.ovirt.engine.core.common.vdscommands.ReconstructMasterVDSCommandParameters;
+import org.ovirt.engine.core.vdsbroker.storage.StoragePoolDomainHelper;
 
 public class ReconstructMasterVDSCommand<P extends 
ReconstructMasterVDSCommandParameters> extends VdsBrokerCommand<P> {
     public ReconstructMasterVDSCommand(P parameters) {


-- 
To view, visit http://gerrit.ovirt.org/26077
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8091a4864711aeccee41effb1bc7d9823a1870c7
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.4
Gerrit-Owner: Liron Ar <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to