Hello Yair Zaslavsky,
I'd like you to do a code review. Please visit
http://gerrit.ovirt.org/15567
to review the following change.
Change subject: core: SPMAsyncTask - change from associatedEntities + single
type to map
......................................................................
core: SPMAsyncTask - change from associatedEntities + single type to map
Change-Id: I8826761f833944e8a4d9159bf91863381cfb1f79
Signed-off-by: Yair Zaslavsky <[email protected]>
---
M backend/manager/dbscripts/async_tasks_sp.sql
M
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
M
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
M
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
M
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
M
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
M
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
7 files changed, 132 insertions(+), 39 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/67/15567/1
diff --git a/backend/manager/dbscripts/async_tasks_sp.sql
b/backend/manager/dbscripts/async_tasks_sp.sql
index 410c841..27c3349 100644
--- a/backend/manager/dbscripts/async_tasks_sp.sql
+++ b/backend/manager/dbscripts/async_tasks_sp.sql
@@ -92,7 +92,22 @@
LANGUAGE plpgsql;
-CREATE OR REPLACE FUNCTION GetAsyncTasksByEntityId(v_entity_id UUID)
+Create or replace FUNCTION InsertAsyncTaskEntities(
+ v_task_id UUID,
+ v_entity_id UUID,
+ v_entity_type varchar(128))
+
+RETURNS VOID
+ AS $procedure$
+BEGIN
+ IF NOT EXISTS (SELECT 1 from async_tasks_entities where async_task_id =
v_task_id and entity_id = v_entity_id) THEN
+ INSERT INTO async_tasks_entities
(async_task_id,entity_id,entity_type) VALUES (v_task_id, v_entity_id,
v_entity_type);
+ END IF;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION GetAsyncTasksIdsByEntityId(v_entity_id UUID)
RETURNS SETOF idUuidType
AS $procedure$
BEGIN
@@ -163,7 +178,7 @@
Create or replace FUNCTION GetAsyncTasksByEntityId(v_entity_id UUID) RETURNS
SETOF async_tasks
AS $procedure$
BEGIN
- RETURN QUERY SELECT *
+ RETURN QUERY SELECT async_tasks.*
FROM async_tasks JOIN async_tasks_entities ON async_task_id = task_id
WHERE entity_id = v_entity_id;
diff --git
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index 5d80672..3f20ced 100644
---
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -1386,9 +1386,8 @@
protected Guid createTask(Guid taskId,
AsyncTaskCreationInfo asyncTaskCreationInfo,
VdcActionType parentCommand,
- VdcObjectType entityType,
- Guid... entityIds) {
- return createTask(taskId, asyncTaskCreationInfo, parentCommand, null,
entityType, entityIds);
+ Map<Guid, VdcObjectType> entitiesMap) {
+ return createTask(taskId, asyncTaskCreationInfo, parentCommand, null,
entitiesMap);
}
/**
@@ -1426,7 +1425,30 @@
*/
protected Guid createTask(Guid taskId, AsyncTaskCreationInfo
asyncTaskCreationInfo,
VdcActionType parentCommand) {
- return createTask(taskId, asyncTaskCreationInfo, parentCommand, null,
null, EMPTY_GUID_ARRAY);
+ return createTask(taskId,
+ asyncTaskCreationInfo,
+ parentCommand,
+ null,
+ Collections.<Guid, VdcObjectType> emptyMap());
+ }
+
+ protected Guid createTask(Guid taskId, AsyncTaskCreationInfo
asyncTaskCreationInfo,
+ VdcActionType parentCommand,
+ VdcObjectType vdcObjectType, Guid... entityIds) {
+ return createTask(taskId,
+ asyncTaskCreationInfo,
+ parentCommand,
+ createEntitiesMapForSingleEntityType(vdcObjectType,
entityIds));
+ }
+
+ protected Guid createTask(Guid taskId, AsyncTaskCreationInfo
asyncTaskCreationInfo,
+ VdcActionType parentCommand,
+ String description, VdcObjectType entityType, Guid... entityIds) {
+ return createTask(taskId,
+ asyncTaskCreationInfo,
+ parentCommand,
+ description,
+ createEntitiesMapForSingleEntityType(entityType, entityIds));
}
/**
@@ -1439,20 +1461,16 @@
* VdcActionType of the command that its EndAction we want to
invoke when tasks are finished.
* @param description
* A message which describes the task
- * @param entityType
- * type of entities that are associated with the task
- * @param entityIds
- * Ids of entities to be associated with task
- * @return Guid of the created task.
+ * @param entitiesMap - map of entities
*/
protected Guid createTask(Guid taskId, AsyncTaskCreationInfo
asyncTaskCreationInfo,
VdcActionType parentCommand,
- String description, VdcObjectType entityType, Guid... entityIds) {
+ String description, Map<Guid, VdcObjectType> entitiesMap) {
Transaction transaction = TransactionSupport.suspend();
try {
- return createTaskImpl(taskId, asyncTaskCreationInfo,
parentCommand, description, entityType, entityIds);
+ return createTaskImpl(taskId, asyncTaskCreationInfo,
parentCommand, description, entitiesMap);
} catch (RuntimeException ex) {
log.errorFormat("Error during CreateTask for command: {0}.
Exception {1}", getClass().getName(), ex);
} finally {
@@ -1464,6 +1482,17 @@
private Guid createTaskImpl(Guid taskId, AsyncTaskCreationInfo
asyncTaskCreationInfo, VdcActionType parentCommand,
String description, VdcObjectType entityType, Guid... entityIds) {
+ return createTaskImpl(taskId,
+ asyncTaskCreationInfo,
+ parentCommand,
+ description,
+ createEntitiesMapForSingleEntityType(entityType, entityIds));
+ }
+
+ private Guid createTaskImpl(Guid taskId,
+ AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType
parentCommand,
+ String description,
+ Map<Guid, VdcObjectType> entitiesMap) {
Step taskStep =
ExecutionHandler.addTaskStep(getExecutionContext(),
StepEnum.getStepNameByTaskType(asyncTaskCreationInfo.getTaskType()),
@@ -1472,13 +1501,21 @@
asyncTaskCreationInfo.setStepId(taskStep.getId());
}
SPMAsyncTask task = concreteCreateTask(taskId, asyncTaskCreationInfo,
parentCommand);
- task.setEntityType(entityType);
- task.setAssociatedEntities(entityIds);
+ task.setEntitiesMap(entitiesMap);
AsyncTaskUtils.addOrUpdateTaskInDB(task);
getAsyncTaskManager().lockAndAddTaskToManager(task);
Guid vdsmTaskId = task.getVdsmTaskId();
ExecutionHandler.updateStepExternalId(taskStep, vdsmTaskId,
ExternalSystemType.VDSM);
return vdsmTaskId;
+
+ }
+
+ private Map<Guid, VdcObjectType>
createEntitiesMapForSingleEntityType(VdcObjectType entityType, Guid...
entityIds) {
+ Map<Guid, VdcObjectType> entitiesMap = new HashMap<Guid,
VdcObjectType>();
+ for (Guid entityId : entityIds) {
+ entitiesMap.put(entityId, entityType);
+ }
+ return entitiesMap;
}
/**
diff --git
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
index 5b4866c..444a372 100644
---
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
+++
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
@@ -2,6 +2,8 @@
import static
org.ovirt.engine.core.common.config.ConfigValues.UknownTaskPrePollingLapse;
+import java.util.Map;
+
import org.ovirt.engine.core.bll.job.ExecutionHandler;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
@@ -25,25 +27,16 @@
}
private AsyncTaskParameters privateParameters;
- private Guid[] associatedEntities;
- private VdcObjectType entityType;
- public void setAssociatedEntities(Guid[] associatedEntities) {
- this.associatedEntities = associatedEntities;
+ private Map<Guid, VdcObjectType> entitiesMap;
+
+ public Map<Guid, VdcObjectType> getEntitiesMap() {
+ return entitiesMap;
}
- public Guid[] getAssociatedEntities() {
- return associatedEntities;
+ public void setEntitiesMap(Map<Guid, VdcObjectType> entitiesMap) {
+ this.entitiesMap = entitiesMap;
}
-
- public VdcObjectType getEntityType() {
- return entityType;
- }
-
- public void setEntityType(VdcObjectType entityType) {
- this.entityType = entityType;
- }
-
public AsyncTaskParameters getParameters() {
return privateParameters;
diff --git
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
index 7aa4b61..4bd25b5 100644
---
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
+++
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
@@ -1,12 +1,19 @@
package org.ovirt.engine.core.bll.tasks;
+import java.util.Map;
+import java.util.Map.Entry;
+
import org.ovirt.engine.core.bll.SPMAsyncTask;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.businessentities.AsyncTasks;
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.AsyncTaskDAO;
import org.ovirt.engine.core.utils.log.Log;
import org.ovirt.engine.core.utils.log.LogFactory;
+import org.ovirt.engine.core.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
/**
* Helper class for async tasks handling
@@ -18,14 +25,22 @@
* exists in DB
* @param asyncTask task to be added or updated
*/
- public static void addOrUpdateTaskInDB(SPMAsyncTask asyncTask) {
+ public static void addOrUpdateTaskInDB(final SPMAsyncTask asyncTask) {
try {
if (asyncTask.getParameters().getDbAsyncTask() != null) {
- DbFacade.getInstance()
- .getAsyncTaskDao()
-
.saveOrUpdate(asyncTask.getParameters().getDbAsyncTask(),
- asyncTask.getEntityType(),
- asyncTask.getAssociatedEntities());
+
TransactionSupport.executeInScope(TransactionScopeOption.Required, new
TransactionMethod<Void>() {
+
+ @Override
+ public Void runInTransaction() {
+
addOrUpdateTaskInDB(asyncTask.getParameters().getDbAsyncTask());
+ Map<Guid, VdcObjectType> entitiesMap =
asyncTask.getEntitiesMap();
+ for (Entry<Guid, VdcObjectType> entry :
entitiesMap.entrySet()) {
+
getAsyncTaskDao().insertAsyncTaskEntity(asyncTask.getParameters()
+ .getDbAsyncTask().getTaskId(),
entry.getKey(), entry.getValue());
+ }
+ return null;
+ }
+ });
}
} catch (RuntimeException e) {
log.error(String.format(
@@ -34,14 +49,17 @@
}
}
+ private static void addOrUpdateTaskInDB(AsyncTasks asyncTask) {
+ getAsyncTaskDao().saveOrUpdate(asyncTask, null, (Guid[]) null);
+ }
+
public static void addOrUpdateTaskInDB(
AsyncTasks task,
VdcObjectType entityType,
Guid... entityIds) {
try {
if (task != null) {
- DbFacade.getInstance()
- .getAsyncTaskDao()
+ getAsyncTaskDao()
.saveOrUpdate(task,
entityType,
entityIds);
@@ -53,6 +71,11 @@
}
}
+ private static AsyncTaskDAO getAsyncTaskDao() {
+ return DbFacade.getInstance()
+ .getAsyncTaskDao();
+ }
+
private static final Log log = LogFactory.getLog(AsyncTaskUtils.class);
}
diff --git
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
index 6898d3e..2dd9745 100644
---
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
+++
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAO.java
@@ -102,4 +102,6 @@
* @return
*/
List<AsyncTasks> getTasksByEntity(Guid entityId);
+
+ void insertAsyncTaskEntity(Guid taskId, Guid entityId, VdcObjectType
value);
}
diff --git
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
index 4edcfee..a608d65 100644
---
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
+++
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java
@@ -193,7 +193,7 @@
public List<Guid> getAsyncTaskIdsByEntity(Guid entityId) {
MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource();
parameterSource.addValue("entity_id", entityId);
- return getCallsHandler().executeReadList("GetAsyncTasksByEntityId",
IdRowMapper.instance, parameterSource);
+ return getCallsHandler().executeReadList("GetAsyncTasksIdsByEntityId",
IdRowMapper.instance, parameterSource);
}
@Override
@@ -211,4 +211,14 @@
AsyncTaskRowMapper.instance,
parameterSource);
}
+
+ @Override
+ public void insertAsyncTaskEntity(Guid taskId, Guid entityId,
VdcObjectType entityType) {
+ MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource();
+ parameterSource.addValue("task_id", taskId).
+ addValue("entity_id", entityId).
+ addValue("entity_type", entityType);
+ getCallsHandler().executeModification("InsertAsyncTaskEntities",
parameterSource);
+
+ }
}
diff --git
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
index 0a0686f..c7ef058 100644
---
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
+++
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/AsyncTaskDAOTest.java
@@ -264,4 +264,17 @@
assertEquals(taskFromDb, newAsyncTask);
}
+
+ @Test
+ public void testInsertAsyncTaskEntities() {
+ dao.save(newAsyncTask);
+ Guid newEntityId = Guid.NewGuid();
+ dao.insertAsyncTaskEntity(newAsyncTask.getTaskId(), newEntityId,
VdcObjectType.VM);
+ List<Guid> taskIds = dao.getAsyncTaskIdsByEntity(newEntityId);
+ assertNotNull(taskIds);
+ assertEquals(1, taskIds.size());
+ Guid taskIdFromDb = taskIds.get(0);
+ assertEquals(newAsyncTask.getTaskId(), taskIdFromDb);
+
+ }
}
--
To view, visit http://gerrit.ovirt.org/15567
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8826761f833944e8a4d9159bf91863381cfb1f79
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Ravi Nori <[email protected]>
Gerrit-Reviewer: Yair Zaslavsky <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches