Sahina Bose has uploaded a new change for review. Change subject: engine: Changes to brick sync for storage network ......................................................................
engine: Changes to brick sync for storage network Added changes to brick sync to take into account, a different network that may have been used while adding the brick. Change-Id: I99f1ed0d9718be79ffac2ac04a36999c93a79ef2 Bug-Url: https://bugzilla.redhat.com/1049994 Signed-off-by: Sahina Bose <sab...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java M packaging/dbscripts/gluster_volumes_sp.sql 6 files changed, 115 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/38148/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java index 334f06b..3c6b302 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSyncJob.java @@ -10,6 +10,7 @@ import java.util.Objects; import java.util.Set; +import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.common.AuditLogType; @@ -19,6 +20,7 @@ import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.gluster.BrickDetails; import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; @@ -30,10 +32,12 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity; import org.ovirt.engine.core.common.businessentities.gluster.PeerStatus; import org.ovirt.engine.core.common.businessentities.gluster.TransportType; +import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; import org.ovirt.engine.core.common.gluster.GlusterFeatureSupported; import org.ovirt.engine.core.common.utils.ListUtils; +import org.ovirt.engine.core.common.utils.ObjectUtils; import org.ovirt.engine.core.common.utils.gluster.GlusterCoreUtil; import org.ovirt.engine.core.common.vdscommands.RemoveVdsVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; @@ -43,6 +47,7 @@ import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumesListVDSParameters; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.TransactionScopeOption; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.gluster.GlusterDBUtils; import org.ovirt.engine.core.utils.lock.EngineLock; import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation; @@ -542,9 +547,48 @@ fetchedVolume.getName()); return; } + // updateNetworkOnFetchedBricks(fetchedBricks); removeDeletedBricks(existingVolume, fetchedBricks); updateExistingAndNewBricks(existingVolume, fetchedBricks); + } + + private void updateNetworkOnFetchedBricks(List<GlusterBrickEntity> fetchedBricks) { + for (GlusterBrickEntity brick : fetchedBricks) { + if (!StringUtils.isEmpty(brick.getNetworkAddress())) { + VdsStatic server = DbFacade.getInstance().getVdsStaticDao().get(brick.getServerId()); + Network network = getGlusterNetworkId(server, brick.getNetworkAddress()); + if (network != null) { + brick.setNetworkId(network.getId()); + } + } + } + + } + + private Network getGlusterNetworkId(VdsStatic server, String networkAddress) { + List<Network> allNetworksInCluster = + DbFacade.getInstance().getNetworkDao().getAllForCluster(server.getVdsGroupId()); + + for (Network network : allNetworksInCluster) { + if (network.getCluster().isGluster() + && isSameNetworkAddress(server.getId(), network.getName(), networkAddress)) { + return network; + } + } + return null; + } + + private Boolean isSameNetworkAddress(Guid hostId, String glusterNetworkName, String networkAddress) { + final List<VdsNetworkInterface> nics = + DbFacade.getInstance().getInterfaceDao().getAllInterfacesForVds(hostId); + + for (VdsNetworkInterface nic : nics) { + if (glusterNetworkName.equals(nic.getNetworkName())) { + return networkAddress.equals(nic.getAddress()); + } + } + return false; } @SuppressWarnings("serial") @@ -605,6 +649,13 @@ fetchedBrick.getBrickOrder()); getBrickDao().updateBrickOrder(existingBrick.getId(), fetchedBrick.getBrickOrder()); } + // update network id, if different + if (!ObjectUtils.objectsEqual(existingBrick.getNetworkId(), fetchedBrick.getNetworkId())) { + log.info("Network address for brick '{}' detected as '{}'. Updating engine DB accordingly.", + existingBrick.getQualifiedName(), + fetchedBrick.getNetworkAddress()); + getBrickDao().updateBrickNetworkId(existingBrick.getId(), fetchedBrick.getNetworkId()); + } } } } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java index 74c3de1..a804aca 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java @@ -62,4 +62,6 @@ public void updateBrickProperties(BrickProperties brickProperties); public void updateBrickProperties(List<GlusterBrickEntity> bricks); + + public void updateBrickNetworkId(Guid brickId, Guid networkId); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java index 25ae268..bfa7f10 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java @@ -267,6 +267,14 @@ } @Override + public void updateBrickNetworkId(Guid brickId, Guid networkId) { + getCallsHandler().executeModification("UpdateGlusterVolumeBrickNetworkId", + getCustomMapSqlParameterSource(). + addValue("id", brickId). + addValue("network_id", networkId)); + } + + @Override public void updateAllBrickTasksByHostIdBrickDirInBatch(Collection<GlusterBrickEntity> bricks) { getCallsHandler().executeStoredProcAsBatch("UpdateGlusterBrickTaskByServerIdBrickDir", bricks, getBatchMapper()); diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java index 49032e2..b2afc20 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java @@ -394,4 +394,17 @@ assertEquals(FixturesTool.GLUSTER_ASYNC_TASK_ID1, newEntity1.getAsyncTask().getTaskId()); assertEquals(FixturesTool.GLUSTER_ASYNC_TASK_ID1, newEntity2.getAsyncTask().getTaskId()); } + + @Test + public void testUpdateBrickNetworkId() { + GlusterBrickEntity existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); + assertNotNull(existingBrick); + assertNull(existingBrick.getNetworkId()); + + dao.updateBrickNetworkId(FixturesTool.GLUSTER_BRICK_UUID1, FixturesTool.NETWORK_ENGINE); + + existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); + assertNotNull(existingBrick); + assertEquals(FixturesTool.NETWORK_ENGINE, existingBrick.getNetworkId()); + } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java index 0e96c72..c7e8f42 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumesListReturnForXmlRpc.java @@ -12,6 +12,7 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.gluster.TransportType; +import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.gluster.GlusterDBUtils; @@ -176,7 +177,7 @@ return null; } - return getBrickEntity(clusterId, volumeId, brickOrder, server, brickDir); + return getBrickEntity(clusterId, volumeId, brickOrder, server, brickDir, null, null); } private GlusterBrickEntity getBrick(Guid clusterId, Guid volumeId, Map<String, Object> brickInfoMap, int brickOrder) { @@ -189,6 +190,7 @@ String hostUuid = (String) brickInfoMap.get(HOST_UUID); String brickDir = brickParts[1]; + String hostAddress = brickParts[0]; GlusterServer glusterServer = dbUtils.getServerByUuid(Guid.createGuidFromString(hostUuid)); if (glusterServer == null) { @@ -196,14 +198,25 @@ return null; } VdsStatic server = DbFacade.getInstance().getVdsStaticDao().get(glusterServer.getId()); - return getBrickEntity(clusterId, volumeId, brickOrder, server, brickDir); + String networkAddress = null; + Guid networkId = null; + if (!server.getHostName().equals(hostAddress)) { + networkAddress = hostAddress; + Network network = getGlusterNetworkId(server, networkAddress); + if (network != null) { + networkId = network.getId(); + } + } + return getBrickEntity(clusterId, volumeId, brickOrder, server, brickDir, networkAddress, networkId); } private GlusterBrickEntity getBrickEntity(Guid clusterId, Guid volumeId, int brickOrder, VdsStatic server, - String brickDir) { + String brickDir, + String networkAddress, + Guid networkId) { GlusterBrickEntity brick = new GlusterBrickEntity(); brick.setVolumeId(volumeId); brick.setBrickOrder(brickOrder); @@ -212,9 +225,24 @@ brick.setServerId(server.getId()); brick.setServerName(server.getHostName()); + brick.setNetworkAddress(networkAddress); + brick.setNetworkId(networkId); + return brick; } + private Network getGlusterNetworkId(VdsStatic server, String networkAddress) { + List<Network> allNetworksInCluster = + DbFacade.getInstance().getNetworkDao().getAllForCluster(server.getVdsGroupId()); + + for (Network network : allNetworksInCluster) { + if (network.getCluster().isGluster()) { + return network; + } + } + return null; + } + public Map<Guid, GlusterVolumeEntity> getVolumes() { return volumes; } diff --git a/packaging/dbscripts/gluster_volumes_sp.sql b/packaging/dbscripts/gluster_volumes_sp.sql index 62931cd..89e1e94 100644 --- a/packaging/dbscripts/gluster_volumes_sp.sql +++ b/packaging/dbscripts/gluster_volumes_sp.sql @@ -518,6 +518,16 @@ END; $procedure$ LANGUAGE plpgsql; +Create or replace FUNCTION UpdateGlusterVolumeBrickNetworkId(v_id UUID, v_network_id UUID) + RETURNS VOID + AS $procedure$ +BEGIN + UPDATE gluster_volume_bricks + SET network_id = v_network_id, + _update_date = LOCALTIMESTAMP + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; Create or replace FUNCTION UpdateGlusterVolumeStatus(v_volume_id UUID, v_status VARCHAR(32)) -- To view, visit https://gerrit.ovirt.org/38148 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I99f1ed0d9718be79ffac2ac04a36999c93a79ef2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sahina Bose <sab...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches