Daniel Erez has uploaded a new change for review.

Change subject: core: disaster recovery on update connection [wip]
......................................................................

core: disaster recovery on update connection [wip]

* Added disaster recovery flow for iscsi storage domains in
  UpdateStorageServerConnectionCommand.

* On connection update, GetVGInfo is invoked for verifying
  LUN-IDs' consistency (identification is done using PV-ID).

* Passing storage domain ID is mandatory for this flow
  (since VG-ID is needed).

* This proposed solution will be usable only after introducing
  iscsi domains support for the edit connection command.

Change-Id: Id0be9c598ee666df2977ffbc2526e2d3fbd997e6
Signed-off-by: Daniel Erez <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageServerConnectionParametersBase.java
2 files changed, 81 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/33/16533/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
index 210b344..8806c50 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -12,6 +13,8 @@
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.bll.context.CompensationContext;
 import 
org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase;
+import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map;
+import org.ovirt.engine.core.common.businessentities.LUNs;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainType;
@@ -27,11 +30,14 @@
 import org.ovirt.engine.core.common.validation.NfsMountPointConstraint;
 import 
org.ovirt.engine.core.common.vdscommands.ConnectStorageServerVDSCommandParameters;
 import 
org.ovirt.engine.core.common.vdscommands.GetStorageDomainStatsVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.GetVGInfoVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.LunDAO;
 import org.ovirt.engine.core.dao.StorageDomainDynamicDAO;
 import org.ovirt.engine.core.dao.StoragePoolIsoMapDAO;
+import org.ovirt.engine.core.dao.StorageServerConnectionLunMapDAO;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
@@ -167,9 +173,63 @@
                 restoreStateAfterUpdate(map, false);
                 return;
             }
+
+            if (getStorageDomain().getStorageType().equals(StorageType.ISCSI)) 
{
+                ensureLunsConsistency();
+            }
         }
         
getStorageConnDao().update(getParameters().getStorageServerConnection());
         restoreStateAfterUpdate(map, true);
+    }
+
+    /**
+     * Verify LUN ID consistency in the DB - needed for disaster recovery
+     */
+    protected void ensureLunsConsistency() {
+        final ArrayList<LUNs> lunsFromVgInfo = (ArrayList<LUNs>) 
runVdsCommand(VDSCommandType.GetVGInfo,
+                new GetVGInfoVDSCommandParameters(getVds().getId(), 
getStorageDomain().getStorage())).getReturnValue();
+
+        if (lunsFromVgInfo.isEmpty()) {
+            // No LUNs found for specified VG
+            return;
+        }
+
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                String connectionId = 
getParameters().getStorageServerConnection().getid();
+                List<LUNs> lunsFromDb = 
getLunDao().getAllForStorageServerConnection(connectionId);
+
+                if (lunsFromDb.isEmpty()) {
+                    return null;
+                }
+
+                for (LUNs lunFromVgInfo : lunsFromVgInfo) {
+                    for (LUNs lunFromDb : lunsFromDb) {
+                        if (lunFromDb.getphysical_volume_id() == null ||
+                                
!lunFromDb.getphysical_volume_id().equals(lunFromVgInfo.getphysical_volume_id()))
 {
+                            continue;
+                        }
+
+                        if 
(!lunFromDb.getLUN_id().equals(lunFromVgInfo.getLUN_id())) {
+                            // Save new LUN
+                            getLunDao().save(lunFromVgInfo);
+                            getStorageServerConnectionLunMapDao().save(
+                                    new 
LUN_storage_server_connection_map(lunFromVgInfo.getLUN_id(), connectionId));
+
+                            // Remove old LUN
+                            getLunDao().remove(lunFromDb.getLUN_id());
+
+                            log.infoFormat("Recoverd LUN ID: {0} / Removed LUN 
ID: {1}",
+                                    lunFromVgInfo.getLUN_id(),
+                                    lunFromDb.getLUN_id());
+                        }
+                    }
+                }
+
+                return null;
+            }
+        });
     }
 
     protected void restoreStateAfterUpdate(StoragePoolIsoMap map, boolean 
setSucceeded) {
@@ -257,10 +317,20 @@
         return getDbFacade().getStoragePoolIsoMapDao();
     }
 
+    protected LunDAO getLunDao() {
+        return getDbFacade().getLunDao();
+    }
+
+    protected StorageServerConnectionLunMapDAO 
getStorageServerConnectionLunMapDao() {
+        return getDbFacade().getStorageServerConnectionLunMapDao();
+    }
+
     @Override
     protected Map<String, Pair<String, String>> getExclusiveLocks() {
         Map<String, Pair<String, String>> locks = new HashMap<String, 
Pair<String, String>>();
-        domains = 
getStorageDomainsByConnId(getParameters().getStorageServerConnection().getid());
+        setStorageDomainId(getParameters().getStorageDomainId());
+        domains = getStorageDomain() != null ? 
Collections.singletonList(getStorageDomain())
+                : 
getStorageDomainsByConnId(getParameters().getStorageServerConnection().getid());
         if (!domains.isEmpty() && domains.size() == 1) {
             setStorageDomain(domains.get(0));
             locks.put(getStorageDomain().getId().toString(),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageServerConnectionParametersBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageServerConnectionParametersBase.java
index caab264..cacbcec 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageServerConnectionParametersBase.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageServerConnectionParametersBase.java
@@ -11,6 +11,8 @@
     @Valid
     private StorageServerConnections privateStorageServerConnection;
 
+    private Guid storageDomainId;
+
     public StorageServerConnections getStorageServerConnection() {
         return privateStorageServerConnection;
     }
@@ -19,6 +21,14 @@
         privateStorageServerConnection = value;
     }
 
+    public Guid getStorageDomainId() {
+        return storageDomainId;
+    }
+
+    public void setStorageDomainId(Guid value) {
+        storageDomainId = value;
+    }
+
     public StorageServerConnectionParametersBase(StorageServerConnections 
connection, Guid vdsId) {
         super(Guid.Empty);
         setStorageServerConnection(connection);


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

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

Reply via email to