Hello Liron Aravot,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/31274

to review the following change.

Change subject: core: SyncLunsInfo - avoidable executions/db deadlock
......................................................................

core: SyncLunsInfo - avoidable executions/db deadlock

Currently SyncLunsInfoForBlockStorageDomainCommand is being executed
when connecting to a domain storage server. This command is resposible
to check if any of the luns of the domain were changed and in case it
did, update the DB accordingly.

When a storage domain is being activated all of it's hosts are being
connected simoltenously to the domain, which leads that
SyncLunsInfoForBlockStorageDomainCommand is executed multiple times
(once for each host) which is unneeded as it's exactly the same as
having response from one host (even if the responses of the hosts are
different, we can't decide which response is correct).

When being executed simoltenously, possibly concurrent updates from the
different threads can be made - as the order of the updates isn't
garuanteed, there's a chance for a deadlock.

This patch solves it by executes the operation for only one hosts at a
time, only in case of failure (which should be rare) the engine will
attempt to sync the luns through a different host.

Change-Id: I725964aa51ac38bf16d83cc498c5298720031632
Related-To-Bug-Url: https://bugzilla.redhat.com/1115845
Signed-off-by: Liron Aravot <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FCPStorageHelper.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IStorageHelper.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHelperBase.java
5 files changed, 40 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/74/31274/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java
index 4a206f0..924ee41 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java
@@ -25,12 +25,12 @@
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId;
 import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.eventqueue.Event;
 import org.ovirt.engine.core.common.eventqueue.EventQueue;
 import org.ovirt.engine.core.common.eventqueue.EventResult;
 import org.ovirt.engine.core.common.eventqueue.EventType;
 import org.ovirt.engine.core.common.locks.LockingGroup;
-import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.utils.Pair;
 import 
org.ovirt.engine.core.common.vdscommands.ActivateStorageDomainVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
@@ -81,6 +81,18 @@
         return returnValue;
     }
 
+    private void syncStorageDomainInfo(List<Pair<Guid, Boolean>> 
hostConnectionInfo) {
+        for (Pair<Guid, Boolean> pair : hostConnectionInfo) {
+            if (Boolean.TRUE.equals(pair.getSecond())) {
+                if (StorageHelperDirector.getInstance()
+                        .getItem(getStorageDomain().getStorageType())
+                        .syncDomainInfo(getStorageDomain(), pair.getFirst())) {
+                    break;
+                }
+            }
+        }
+    }
+
     @Override
     protected void executeCommand() {
         final StoragePoolIsoMap map =
@@ -95,7 +107,9 @@
         freeLock();
 
         log.infoFormat("ActivateStorage Domain. Before Connect all hosts to 
pool. Time:{0}", new Date());
-        connectHostsInUpToDomainStorageServer();
+        List<Pair<Guid, Boolean>> hostsConnectionResults = 
connectHostsInUpToDomainStorageServer();
+        syncStorageDomainInfo(hostsConnectionResults);
+
         runVdsCommand(VDSCommandType.ActivateStorageDomain,
                 new 
ActivateStorageDomainVDSCommandParameters(getStoragePool().getId(), 
getStorageDomain().getId()));
         log.infoFormat("ActivateStorage Domain. After Connect all hosts to 
pool. Time:{0}", new Date());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FCPStorageHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FCPStorageHelper.java
index da85123..36b1df1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FCPStorageHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/FCPStorageHelper.java
@@ -3,8 +3,8 @@
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
-import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
 import org.ovirt.engine.core.compat.Guid;
 
 public class FCPStorageHelper extends StorageHelperBase {
@@ -16,11 +16,6 @@
 
     @Override
     public boolean connectStorageToDomainByVdsId(StorageDomain storageDomain, 
Guid vdsId) {
-        // Synchronize LUN details comprising the storage domain with the DB
-        StorageDomainParametersBase parameters = new 
StorageDomainParametersBase(storageDomain.getId());
-        parameters.setVdsId(vdsId);
-        
Backend.getInstance().runInternalAction(VdcActionType.SyncLunsInfoForBlockStorageDomain,
 parameters);
-
         return true;
     }
 
@@ -34,4 +29,12 @@
         removeStorageDomainLuns(storageDomain);
         return true;
     }
+
+    @Override
+    public boolean syncDomainInfo(StorageDomain storageDomain, Guid vdsId) {
+        // Synchronize LUN details comprising the storage domain with the DB
+        StorageDomainParametersBase parameters = new 
StorageDomainParametersBase(storageDomain.getId());
+        parameters.setVdsId(vdsId);
+        return 
Backend.getInstance().runInternalAction(VdcActionType.SyncLunsInfoForBlockStorageDomain,
 parameters).getSucceeded();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
index fa435b9..9280464 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
@@ -65,13 +65,6 @@
             isSuccess = returnValue.getSucceeded();
             if (isSuccess && VDSCommandType.forValue(type) == 
VDSCommandType.ConnectStorageServer) {
                 isSuccess = isConnectSucceeded((Map<String, String>) 
returnValue.getReturnValue(), list);
-
-                if (isSuccess && storageDomain != null) {
-                    // Synchronize LUN details comprising the storage domain 
with the DB
-                    StorageDomainParametersBase parameters = new 
StorageDomainParametersBase(storageDomain.getId());
-                    parameters.setVdsId(vdsId);
-                    
Backend.getInstance().runInternalAction(VdcActionType.SyncLunsInfoForBlockStorageDomain,
 parameters);
-                }
             }
         }
         return isSuccess;
@@ -259,4 +252,12 @@
             StorageDomainStatic storageDomain) {
         return 
DbFacade.getInstance().getStorageServerConnectionDao().getAllForVolumeGroup(storageDomain.getStorage());
     }
+
+    @Override
+    public boolean syncDomainInfo(StorageDomain storageDomain, Guid vdsId) {
+        // Synchronize LUN details comprising the storage domain with the DB
+        StorageDomainParametersBase parameters = new 
StorageDomainParametersBase(storageDomain.getId());
+        parameters.setVdsId(vdsId);
+        return 
Backend.getInstance().runInternalAction(VdcActionType.SyncLunsInfoForBlockStorageDomain,
 parameters).getSucceeded();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IStorageHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IStorageHelper.java
index c31ee27..b646972 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IStorageHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/IStorageHelper.java
@@ -28,4 +28,6 @@
 
     boolean isConnectSucceeded(Map<String, String> returnValue,
             List<StorageServerConnections> connections);
+
+    boolean syncDomainInfo(StorageDomain storageDomain, Guid vdsId);
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHelperBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHelperBase.java
index 99ed8bf..bfcfb23 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHelperBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHelperBase.java
@@ -194,4 +194,9 @@
         }
         return "";
     }
+
+    @Override
+    public boolean syncDomainInfo(StorageDomain storageDomain, Guid vdsId) {
+        return true;
+    }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I725964aa51ac38bf16d83cc498c5298720031632
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Daniel Erez <de...@redhat.com>
Gerrit-Reviewer: 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