Sergey Gotliv has uploaded a new change for review. Change subject: engine: Setup multiple iscsi sessions with the iscsi target ......................................................................
engine: Setup multiple iscsi sessions with the iscsi target Up until now the engine allowed to create single connection to the iscsi target using only one interface. >From now on its possible to configure iscsi multipath which will protect against failing of the single network interface and provide better throughput by using more than one interface. Change-Id: I779f6dd95dfbfc2b74ad7ba3ce2271b7c9ad94db Bug-Url: https://bugzilla.redhat.com/753541 Signed-off-by: Sergey Gotliv <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java M packaging/dbscripts/network_sp.sql 8 files changed, 85 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/98/23198/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java index 88a883d..6bac6d0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java @@ -57,6 +57,10 @@ private boolean connectStorageServer(StorageType type, List<StorageServerConnections> connections) { boolean connectSucceeded = true; if (connections != null && connections.size() > 0) { + if (type == StorageType.ISCSI) { + connections = ISCSIStorageHelper.updateInitiators(connections, getVds().getId()); + } + Map<String, String> retValues = (HashMap<String, String>) Backend .getInstance() .getResourceManager() diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java index b1389de..99d4a5a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java @@ -9,6 +9,7 @@ import org.ovirt.engine.core.bll.InternalCommandAttribute; import org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; +import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.errors.VdcFault; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.vdscommands.StorageServerConnectionManagementVDSParameters; @@ -46,6 +47,10 @@ protected Pair<Boolean, Integer> connectHostToStorage() { List<StorageServerConnections> connections = Arrays.asList(getConnection()); + if (getConnection().getstorage_type() == StorageType.ISCSI) { + connections = ISCSIStorageHelper.updateInitiators(connections, getVds().getId()); + } + Map<String, String> result = (HashMap<String, String>) runVdsCommand( VDSCommandType.ConnectStorageServer, new StorageServerConnectionManagementVDSParameters(getVds().getId(), Guid.Empty, 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 c536841..dbe46cd 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 @@ -14,6 +14,7 @@ import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.vdscommands.StorageServerConnectionManagementVDSParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; @@ -47,6 +48,8 @@ if (VDSCommandType.forValue(type) == VDSCommandType.DisconnectStorageServer) { list = filterConnectionsUsedByOthers(list, storageDomain.getStorage(), lun != null ? lun.getLUN_id() : ""); + } else if (VDSCommandType.forValue(type) == VDSCommandType.ConnectStorageServer) { + list = updateInitiators(list, vdsId); } Guid poolId = storagePoolId; if (storageDomain != null && storageDomain.getStoragePoolId() != null) { @@ -74,6 +77,32 @@ return isSuccess; } + public static List<StorageServerConnections> updateInitiators(List<StorageServerConnections> conns, Guid vdsId) { + List<StorageServerConnections> res = new ArrayList<>(conns); + + for (StorageServerConnections conn : conns) { + // Get list of endpoints (nics or vlans) that will initiate iscsi sessions. + // Targets are represented by StorageServerConnections object (connection, iqn, port, portal). + List<VdsNetworkInterface> initiators = DbFacade.getInstance().getInterfaceDao() + .getIscsiInitiatorsByVdsIdAndStorageTargetId(vdsId, conn.getid()); + + if (initiators != null && !initiators.isEmpty()) { + conn.setInitiatorName(initiators.remove(0).getName()); + + // Iscsi target is represented by connection object, therefore if this target is approachable + // from more than one endpoint(initiator) we have to clone this connection per endpoint. + for (VdsNetworkInterface initiator : initiators) { + StorageServerConnections newConn = StorageServerConnections.copyOf(conn); + newConn.setid(Guid.newGuid().toString()); + newConn.setInitiatorName(initiator.getName()); + res.add(newConn); + } + } + } + + return res; + } + @SuppressWarnings("unchecked") @Override protected List<StorageServerConnections> filterConnectionsUsedByOthers( diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java index 01bb78c..833f9d2 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java @@ -177,6 +177,16 @@ @Max(value = Short.MAX_VALUE, message = "VALIDATION_STORAGE_CONNECTION_NFS_RETRANS") private Short nfsRetrans; + private String initiatorName; + + public String getInitiatorName() { + return initiatorName; + } + + public void setInitiatorName(String initiatorName) { + this.initiatorName = initiatorName; + } + @Override public boolean equals(Object obj) { boolean returnValue = super.equals(obj); @@ -232,6 +242,10 @@ sb.append(this.getNfsRetrans()); sb.append(", nfsTimeo: "); sb.append(this.getNfsTimeo()); + if (getInitiatorName() != null) { + sb.append(", initiatorName: "); + sb.append(this.getInitiatorName()); + } sb.append(" };"); return sb.toString(); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java index 5c2867a..28082cd 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java @@ -166,4 +166,6 @@ * @return all labels defined for the data-center's networks */ Set<String> getAllNetworkLabelsForDataCenter(Guid id); + + List<VdsNetworkInterface> getIscsiInitiatorsByVdsIdAndStorageTargetId(Guid vdsId, String storageTargetId); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java index c8504f3..0f5d885 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java @@ -248,6 +248,13 @@ } + @Override + public List<VdsNetworkInterface> getIscsiInitiatorsByVdsIdAndStorageTargetId(Guid vdsId, String storageTargetId) { + return getCallsHandler().executeReadList("GetIscsiInitiatorsByVdsIdAndStorageTargetId", + vdsNetworkInterfaceRowMapper, + getCustomMapSqlParameterSource().addValue("vds_id", vdsId).addValue("target_id", storageTargetId)); + } + private static final RowMapper<VdsNetworkInterface> vdsNetworkInterfaceRowMapper = new RowMapper<VdsNetworkInterface>() { @SuppressWarnings("unchecked") diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java index 543c6f4..68f0a46 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java @@ -78,6 +78,7 @@ con.put("iqn", connection.getiqn(), ""); con.put("user", connection.getuser_name(), ""); con.put("password", connection.getpassword(), ""); + con.putIfNotEmpty("initiatorName", connection.getInitiatorName()); // storage_pool can be null when discovering iscsi send targets or when connecting // through vds which has no storage pool diff --git a/packaging/dbscripts/network_sp.sql b/packaging/dbscripts/network_sp.sql index 1ab54cb..eaf58ff 100644 --- a/packaging/dbscripts/network_sp.sql +++ b/packaging/dbscripts/network_sp.sql @@ -1242,3 +1242,26 @@ WHERE network_qos_id = v_network_qos_id; END; $procedure$ LANGUAGE plpgsql; + + +Create or replace FUNCTION GetIscsiInitiatorsByVdsIdAndStorageTargetId(v_vds_id UUID, v_target_id varchar(50)) RETURNS SETOF vds_interface_view STABLE + AS $procedure$ +BEGIN + RETURN QUERY SELECT vds_interface_view.* + FROM vds_interface_view, + vds, + network_cluster, + network, + iscsi_bonds_networks_map, + iscsi_bonds_storage_connections_map + WHERE + iscsi_bonds_storage_connections_map.connection_id = v_target_id AND + iscsi_bonds_storage_connections_map.iscsi_bond_id = iscsi_bonds_networks_map.iscsi_bond_id AND + iscsi_bonds_networks_map.network_id = network.id AND + network.id = network_cluster.network_id AND + network.name = vds_interface_view.network_name AND + network_cluster.cluster_id = vds.vds_group_id AND + vds.vds_id = vds_interface_view.vds_id AND + vds_interface_view.vds_id = v_vds_id; +END; $procedure$ +LANGUAGE plpgsql; -- To view, visit http://gerrit.ovirt.org/23198 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I779f6dd95dfbfc2b74ad7ba3ce2271b7c9ad94db Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sergey Gotliv <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
