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
