Ramesh N has uploaded a new change for review. Change subject: engine: Infrastrucutre changes for Start Remove Brick ......................................................................
engine: Infrastrucutre changes for Start Remove Brick Infrastructure changes to enable Start Remove Brick in gluster. Change-Id: I95d27f571e32c5a91823511fbf5964ec79282afa Signed-off-by: Ramesh Nachimuthu <[email protected]> --- M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsDao.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.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/FixturesTool.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java M packaging/dbscripts/gluster_volumes_sp.sql 7 files changed, 183 insertions(+), 40 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/12/19912/1 diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsDao.java index 5b6e267..a986800 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsDao.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsDao.java @@ -43,6 +43,13 @@ void removeAll(Collection<ID> ids); /** + * Calls a remove stored procedure multiple times in a batch + * + * @param entities + */ + void removeAllInBatch(Collection<T> entities); + + /** * Calls an update stored procedure multiple timse in a batch * * @param procedureName diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java index c0e8928..dbc687e 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/MassOperationsGenericDaoDbFacade.java @@ -31,8 +31,7 @@ @Override /** * Enables to send update procedure name as a parameter that overrides the default - * one. - * In case this parameter is null the default procedure is used. + * one. In case this parameter is null the default procedure is used. */ public void updateAll(String procedureName, Collection<T> entities) { if (procedureName == null) { @@ -44,9 +43,8 @@ } /** - * Enables to send update procedure name as a parameter that overrides the default - * one. - * In case this parameter is null the default procedure is used. + * Enables to send update procedure name as a parameter that overrides the default one. In case this parameter is + * null the default procedure is used. */ protected void updateAllInBatch(String procedureName, Collection<T> paramValues, @@ -62,6 +60,21 @@ } } + /** + * Enables to send remove procedure name as a parameter that overrides the default one. In case this parameter is + * null, default procedure is used. + */ + protected void removeAllInBatch(String procedureName, Collection<T> paramValue, MapSqlParameterMapper<T> mapper) { + getCallsHandler().executeStoredProcAsBatch(procedureName == null ? getProcedureNameForRemove() : procedureName, + paramValue, + mapper); + } + + @Override + public void removeAllInBatch(Collection<T> entities) { + removeAllInBatch(getProcedureNameForRemove(), entities, getBatchMapper()); + } + @Override public void saveAll(Collection<T> entities) { for (T entity : entities) { 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 1258690..f4ecd54 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 @@ -1,5 +1,6 @@ package org.ovirt.engine.core.dao.gluster; +import java.util.Collection; import java.util.List; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; @@ -31,4 +32,8 @@ public List<GlusterBrickEntity> getGlusterVolumeBricksByServerId(Guid serverId); public GlusterBrickEntity getBrickByServerIdAndDirectory(Guid serverId, String brickDirectory); + + public void updateBrickTask(Guid brickId, Guid taskId); + + public void updateBrickTasksInBatch(Collection<GlusterBrickEntity> bricks); } 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 e2ebc82..3056a3e 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 @@ -10,7 +10,6 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus; import org.ovirt.engine.core.common.utils.EnumUtils; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.compat.NotImplementedException; import org.ovirt.engine.core.dal.dbbroker.MapSqlParameterMapper; import org.ovirt.engine.core.dao.MassOperationsGenericDaoDbFacade; import org.springframework.jdbc.core.RowMapper; @@ -57,15 +56,13 @@ public void updateBrickStatus(Guid brickId, GlusterStatus status) { getCallsHandler().executeModification("UpdateGlusterVolumeBrickStatus", getCustomMapSqlParameterSource() - .addValue("id", brickId) - .addValue("status", EnumUtils.nameOrNull(status))); + .addValue("id", brickId) + .addValue("status", EnumUtils.nameOrNull(status))); } @Override public void updateBrickStatuses(List<GlusterBrickEntity> bricks) { - for(GlusterBrickEntity brick : bricks) { - updateBrickStatus(brick.getId(), brick.getStatus()); - } + updateAllInBatch("UpdateGlusterVolumeBrickStatus", bricks, getBatchMapper()); } @Override @@ -89,7 +86,6 @@ "GetBricksByGlusterVolumeGuid", brickRowMapper, getCustomMapSqlParameterSource().addValue("volume_id", volumeId)); } - private MapSqlParameterSource createBrickParams(GlusterBrickEntity brick) { return getCustomMapSqlParameterSource().addValue("id", brick.getId()) @@ -120,6 +116,7 @@ brick.setBrickDirectory(rs.getString("brick_dir")); brick.setBrickOrder(rs.getInt("brick_order")); brick.setStatus(GlusterStatus.valueOf(rs.getString("status"))); + brick.getAsyncTask().setTaskId(getGuid(rs, "task_id")); return brick; } @@ -161,10 +158,38 @@ return brickRowMapper; } - @SuppressWarnings("deprecation") @Override public MapSqlParameterMapper<GlusterBrickEntity> getBatchMapper() { - // TODO: Implement this - throw new NotImplementedException("Unsupported operation"); + return new MapSqlParameterMapper<GlusterBrickEntity>() { + @Override + public MapSqlParameterSource map(GlusterBrickEntity entity) { + MapSqlParameterSource paramValue = + new MapSqlParameterSource() + .addValue("volume_id", entity.getVolumeId()) + .addValue("server_id", entity.getServerId()) + .addValue("brick_dir", entity.getBrickDirectory()) + .addValue("status", entity.getStatus().name()) + .addValue("id", entity.getId().toString()) + .addValue("brick_order", entity.getBrickOrder()) + .addValue("task_id", + entity.getAsyncTask() != null ? entity.getAsyncTask().getTaskId().toString() + : ""); + + return paramValue; + } + }; + } + + @Override + public void updateBrickTask(Guid brickId, Guid taskId) { + getCallsHandler().executeModification("UpdateGlusterVolumeBrickAsyncTask", + getCustomMapSqlParameterSource(). + addValue("id", brickId). + addValue("task_id", taskId)); + } + + @Override + public void updateBrickTasksInBatch(Collection<GlusterBrickEntity> bricks) { + getCallsHandler().executeStoredProcAsBatch("UpdateGlusterVolumeBrickAsyncTask", bricks, getBatchMapper()); } } diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java index 7fde9b0..ef25235 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java @@ -426,11 +426,37 @@ public static final Guid GLUSTER_SERVER_UUID2 = new Guid("da9e2f09-2835-4530-9bf5-576c52b11942"); + public static final Guid GLUSTER_SERVER_UUID3 = new Guid("afce7a39-8e8c-4819-ba9c-796d316592e6"); + + public static final Guid GLUSTER_BRICK_SERVER1 = new Guid("23f6d691-5dfb-472b-86dc-9e1d2d3c18f3"); + public static final Guid GLUSTER_SERVER_UUID_NEW = new Guid("da9e2f09-2835-4530-9bf5-576c52b11943"); public static final Guid EXISTING_VDSM_TASK_ID = new Guid("140fd52b-3400-4cdd-8d3f-C9d03704b0aa"); /** + * Gluster volume UUID(s) + */ + public static final Guid GLUSTER_VOLUME_UUID1 = new Guid("0c3f45f6-3fe9-4b35-a30c-be0d1a835ea8"); + + /** + * Gluster brick UUID(s) + */ + public static final Guid GLUSTER_BRICK_UUID1 = new Guid("6ccdc294-d77b-4929-809d-8afe7634b47d"); + + public static final Guid GLUSTER_BRICK_UUID2 = new Guid("61c94fc7-26b0-43e3-9d26-fc9d8cd6a754"); + + /** + * Gluster brick directories + */ + public static final String GLUSTER_BRICK_DIR1 = "/export/test-vol-distribute-1/dir1"; + + /** + * Gluster Async task UUID(s) + */ + public static final Guid GLUSTER_ASYNC_TASK_ID1 = new Guid("61c94fc7-26b0-43e3-9d26-fc9d8cd6a763"); + + /** * A test provider that exists. */ public static final String PROVIDER_NAME = "provider"; 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 2ebe324..f026188 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 @@ -9,20 +9,15 @@ import java.util.List; import org.junit.Test; +import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask; import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.BaseDAOTestCase; +import org.ovirt.engine.core.dao.FixturesTool; public class GlusterBrickDaoTest extends BaseDAOTestCase { - private static final Guid SERVER_ID = new Guid("afce7a39-8e8c-4819-ba9c-796d316592e6"); - private static final Guid EXISTING_VOL_ID = new Guid("0c3f45f6-3fe9-4b35-a30c-be0d1a835ea8"); - private static final Guid EXISTING_BRICK_ID = new Guid("6ccdc294-d77b-4929-809d-8afe7634b47d"); - - private static final Guid BRICK_SERVER_ID = new Guid("23f6d691-5dfb-472b-86dc-9e1d2d3c18f3"); - private static final String BRICK_DIRECTORY = "/export/test-vol-distribute-1/dir1"; - private GlusterBrickDao dao; private VdsStatic server; @@ -30,13 +25,13 @@ public void setUp() throws Exception { super.setUp(); dao = dbFacade.getGlusterBrickDao(); - server = dbFacade.getVdsStaticDao().get(SERVER_ID); + server = dbFacade.getVdsStaticDao().get(FixturesTool.GLUSTER_SERVER_UUID3); } @Test public void testSaveAndGetById() { GlusterBrickEntity brickToAdd = new GlusterBrickEntity(); - brickToAdd.setVolumeId(EXISTING_VOL_ID); + brickToAdd.setVolumeId(FixturesTool.GLUSTER_VOLUME_UUID1); brickToAdd.setServerId(server.getId()); brickToAdd.setServerName(server.getHostName()); brickToAdd.setBrickDirectory("/export/test-vol-distribute-1/dir3"); @@ -52,31 +47,32 @@ @Test public void testGlusterVolumeBricksByServerId() { - List<GlusterBrickEntity> bricks = dao.getGlusterVolumeBricksByServerId(SERVER_ID); + List<GlusterBrickEntity> bricks = dao.getGlusterVolumeBricksByServerId(FixturesTool.GLUSTER_SERVER_UUID3); assertNotNull(bricks); } @Test public void testGetBrickByServerIdAndDirectory() { - GlusterBrickEntity brick = dao.getBrickByServerIdAndDirectory(BRICK_SERVER_ID, BRICK_DIRECTORY); + GlusterBrickEntity brick = + dao.getBrickByServerIdAndDirectory(FixturesTool.GLUSTER_BRICK_SERVER1, FixturesTool.GLUSTER_BRICK_DIR1); assertNotNull(brick); - assertEquals(brick.getServerId(), BRICK_SERVER_ID); - assertEquals(brick.getBrickDirectory(), BRICK_DIRECTORY); + assertEquals(brick.getServerId(), FixturesTool.GLUSTER_BRICK_SERVER1); + assertEquals(brick.getBrickDirectory(), FixturesTool.GLUSTER_BRICK_DIR1); } @Test public void testRemove() { - GlusterBrickEntity existingBrick = dao.getById(EXISTING_BRICK_ID); + GlusterBrickEntity existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); assertNotNull(existingBrick); - dao.removeBrick(EXISTING_BRICK_ID); + dao.removeBrick(FixturesTool.GLUSTER_BRICK_UUID1); - assertNull(dao.getById(EXISTING_BRICK_ID)); + assertNull(dao.getById(FixturesTool.GLUSTER_BRICK_UUID1)); } @Test public void testRemoveMultiple() { - List<GlusterBrickEntity> bricks = dao.getBricksOfVolume(EXISTING_VOL_ID); + List<GlusterBrickEntity> bricks = dao.getBricksOfVolume(FixturesTool.GLUSTER_VOLUME_UUID1); assertEquals(2, bricks.size()); List<Guid> idsToRemove = new ArrayList<Guid>(); @@ -84,17 +80,17 @@ idsToRemove.add(bricks.get(1).getId()); dao.removeAll(idsToRemove); - bricks = dao.getBricksOfVolume(EXISTING_VOL_ID); + bricks = dao.getBricksOfVolume(FixturesTool.GLUSTER_VOLUME_UUID1); assertTrue(bricks.isEmpty()); } @Test public void testReplaceBrick() { - GlusterBrickEntity firstBrick = dao.getById(EXISTING_BRICK_ID); + GlusterBrickEntity firstBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); assertNotNull(firstBrick); GlusterBrickEntity newBrick = new GlusterBrickEntity(); - newBrick.setVolumeId(EXISTING_VOL_ID); + newBrick.setVolumeId(FixturesTool.GLUSTER_VOLUME_UUID1); newBrick.setServerId(server.getId()); newBrick.setServerName(server.getHostName()); newBrick.setBrickDirectory("/export/test-vol-distribute-1/dir3"); @@ -105,7 +101,7 @@ dao.replaceBrick(firstBrick, newBrick); - assertNull(dao.getById(EXISTING_BRICK_ID)); + assertNull(dao.getById(FixturesTool.GLUSTER_BRICK_UUID1)); GlusterBrickEntity retrievedBrick = dao.getById(newBrick.getId()); assertNotNull(retrievedBrick); @@ -114,14 +110,74 @@ @Test public void testUpdateBrickStatus() { - GlusterBrickEntity existingBrick = dao.getById(EXISTING_BRICK_ID); + GlusterBrickEntity existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); assertNotNull(existingBrick); assertEquals(GlusterStatus.UP, existingBrick.getStatus()); - dao.updateBrickStatus(EXISTING_BRICK_ID, GlusterStatus.DOWN); + dao.updateBrickStatus(FixturesTool.GLUSTER_BRICK_UUID1, GlusterStatus.DOWN); - existingBrick = dao.getById(EXISTING_BRICK_ID); + existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); assertNotNull(existingBrick); assertEquals(GlusterStatus.DOWN, existingBrick.getStatus()); } + + @Test + public void testUpdateBrickStatuses() { + GlusterBrickEntity existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); + GlusterBrickEntity existingBrick1 = dao.getById(FixturesTool.GLUSTER_BRICK_UUID2); + assertNotNull(existingBrick); + assertNotNull(existingBrick1); + assertEquals(GlusterStatus.UP, existingBrick.getStatus()); + assertEquals(GlusterStatus.UP, existingBrick1.getStatus()); + + List<GlusterBrickEntity> bricks = new ArrayList<GlusterBrickEntity>(); + bricks.add(existingBrick); + bricks.add(existingBrick1); + dao.updateBrickStatuses(bricks); + } + + @Test + public void testUpdateBrickTask() { + GlusterBrickEntity existingBrick = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); + GlusterAsyncTask asyncTask = new GlusterAsyncTask(); + asyncTask.setTaskId(new Guid("61c94fc7-26b0-43e3-9d26-fc9d8cd6a763")); + + assertNotNull(existingBrick); + assertEquals(GlusterStatus.UP, existingBrick.getStatus()); + + dao.updateBrickTask(existingBrick.getId(), FixturesTool.GLUSTER_ASYNC_TASK_ID1); + + GlusterBrickEntity newEnity = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); + + assertEquals(FixturesTool.GLUSTER_ASYNC_TASK_ID1, newEnity.getAsyncTask().getTaskId()); + } + + @Test + public void testUpdateBrickTasksInBatch() { + GlusterBrickEntity existingBrick1 = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); + GlusterBrickEntity existingBrick2 = dao.getById(FixturesTool.GLUSTER_BRICK_UUID2); + + GlusterAsyncTask asyncTask = new GlusterAsyncTask(); + asyncTask.setTaskId(new Guid("61c94fc7-26b0-43e3-9d26-fc9d8cd6a763")); + + assertNotNull(existingBrick1); + assertNotNull(existingBrick2); + assertEquals(GlusterStatus.UP, existingBrick1.getStatus()); + assertEquals(GlusterStatus.UP, existingBrick2.getStatus()); + + existingBrick1.setAsyncTask(asyncTask); + existingBrick2.setAsyncTask(asyncTask); + + List<GlusterBrickEntity> bricks = new ArrayList<>(); + bricks.add(existingBrick1); + bricks.add(existingBrick2); + + dao.updateBrickTasksInBatch(bricks); + + GlusterBrickEntity newEnity1 = dao.getById(FixturesTool.GLUSTER_BRICK_UUID1); + GlusterBrickEntity newEnity2 = dao.getById(FixturesTool.GLUSTER_BRICK_UUID2); + + assertEquals(FixturesTool.GLUSTER_ASYNC_TASK_ID1, newEnity1.getAsyncTask().getTaskId()); + assertEquals(FixturesTool.GLUSTER_ASYNC_TASK_ID1, newEnity2.getAsyncTask().getTaskId()); + } } diff --git a/packaging/dbscripts/gluster_volumes_sp.sql b/packaging/dbscripts/gluster_volumes_sp.sql index 0d3ff62..52833c2 100644 --- a/packaging/dbscripts/gluster_volumes_sp.sql +++ b/packaging/dbscripts/gluster_volumes_sp.sql @@ -453,6 +453,17 @@ END; $procedure$ LANGUAGE plpgsql; +Create or replace FUNCTION UpdateGlusterVolumeBrickAsyncTask(v_id UUID, v_task_id UUID) + RETURNS VOID + AS $procedure$ +BEGIN + UPDATE gluster_volume_bricks + SET task_id = v_task_id, + _update_date = LOCALTIMESTAMP + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + Create or replace FUNCTION UpdateGlusterVolumeStatusByName(v_cluster_id UUID, v_vol_name VARCHAR(1000), v_status VARCHAR(32)) @@ -503,4 +514,4 @@ _update_date = LOCALTIMESTAMP WHERE id = v_volume_id; END; $procedure$ -LANGUAGE plpgsql; +LANGUAGE plpgsql; \ No newline at end of file -- To view, visit http://gerrit.ovirt.org/19912 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I95d27f571e32c5a91823511fbf5964ec79282afa Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ramesh N <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
