Ravi Nori has uploaded a new change for review. Change subject: engine : Introduction of Poller, CommandEntity and interfaces for caching ......................................................................
engine : Introduction of Poller, CommandEntity and interfaces for caching The poller interface eliminates all dependencies from the AsyncTaskManager and the bll package The CommandEntity has all required parameters to recreate the command The CommandEntityDAO is a place holder that will persist the commands to the db Change-Id: I2172333255131652bb78623352fb805d16fb4a1b Signed-off-by: Ravi Nori <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheProviderFactory.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheWrapper.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityUtils.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/MapWrapperImpl.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/CommandEntity.java 10 files changed, 284 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/35/26335/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheProviderFactory.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheProviderFactory.java new file mode 100644 index 0000000..e1a7765 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheProviderFactory.java @@ -0,0 +1,7 @@ +package org.ovirt.engine.core.bll.tasks; + +public class CacheProviderFactory { + public static <K, V> CacheWrapper<K, V> getCacheWrapper(String name) { + return new MapWrapperImpl<K, V>(); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheWrapper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheWrapper.java new file mode 100644 index 0000000..4ce085c --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheWrapper.java @@ -0,0 +1,12 @@ +package org.ovirt.engine.core.bll.tasks; + +public interface CacheWrapper<K, V> { + + void put(K key, V value); + + V get(K key); + + void remove(final K key); + + public boolean containsKey(K key); +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java index 4393a6f..9032f64 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java @@ -22,6 +22,7 @@ import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.businessentities.AsyncTasks; +import org.ovirt.engine.core.common.businessentities.CommandEntity; import org.ovirt.engine.core.common.job.ExternalSystemType; import org.ovirt.engine.core.common.job.Step; import org.ovirt.engine.core.common.job.StepEnum; @@ -40,6 +41,7 @@ private static final CommandCoordinatorImpl instance = new CommandCoordinatorImpl(); private static final Log log = LogFactory.getLog(CommandCoordinator.class); + private CommandsCache commandsCache = new CommandsCacheImpl(); public static CommandCoordinatorImpl getInstance() { return instance; @@ -86,6 +88,10 @@ SPMAsyncTask task = concreteCreateTask(taskId, command, asyncTaskCreationInfo, parentCommand); task.setEntitiesMap(entitiesMap); AsyncTaskUtils.addOrUpdateTaskInDB(task); + commandsCache.put(task.getParameters().getDbAsyncTask().getStepId(), + command.getCommandId(), + command.getParameters().getParentParameters() == null ? Guid.Empty : command.getParameters().getParentParameters().getCommandId(), + task); getAsyncTaskManager().lockAndAddTaskToManager(task); Guid vdsmTaskId = task.getVdsmTaskId(); ExecutionHandler.updateStepExternalId(taskStep, vdsmTaskId, ExternalSystemType.VDSM); @@ -261,10 +267,28 @@ VdcActionType actionType, AsyncTasks dbAsyncTask, ExecutionContext context) { + Guid commandId = dbAsyncTask.getActionParameters().getCommandId(); VdcActionParametersBase parameters = dbAsyncTask.getActionParameters(); - CommandBase<?> command = CommandsFactory.getInstance().createCommand(actionType, parameters); - command.setContext(new CommandContext(context)); - return command.endAction(); + try { + if (stepId != null) { + CommandEntity commandEntity = commandsCache.get(commandId); + if (!actionType.equals(commandEntity.getCommandType())) { + throw new RuntimeException("action types dont match"); + } else { + log.info("in CommandManager.endAction action types match " + actionType.toString()); + } + if (!parameters.equals(commandEntity.getCommandType())) { + throw new RuntimeException("parameters dont match"); + } else { + log.info("in CommandManager.endAction parameters match " + parameters.toString()); + } + } + CommandBase<?> command = CommandsFactory.getInstance().createCommand(actionType, parameters); + command.setContext(new CommandContext(context)); + return command.endAction(); + } finally { + commandsCache.remove(commandId); + } } private AsyncTaskManager getAsyncTaskManager() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityUtils.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityUtils.java new file mode 100644 index 0000000..ae1ee7b --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityUtils.java @@ -0,0 +1,23 @@ +package org.ovirt.engine.core.bll.tasks; + +import java.util.HashMap; + +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.businessentities.CommandEntity; + +public class CommandEntityUtils { + + private static final String PARAMETERS_KEY = "params"; + + public static void setParameters(CommandEntity commandEntity, VdcActionParametersBase params) { + if (commandEntity.getData() == null) { + commandEntity.setData(new HashMap<String, Object>()); + } + commandEntity.getData().put(PARAMETERS_KEY, params); + } + + public static VdcActionParametersBase getParameters(CommandEntity commandEntity) { + return commandEntity.getData() != null ? (VdcActionParametersBase) commandEntity.getData().get(PARAMETERS_KEY) + : null; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java new file mode 100644 index 0000000..5e21eff --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCache.java @@ -0,0 +1,14 @@ +package org.ovirt.engine.core.bll.tasks; + +import org.ovirt.engine.core.common.businessentities.CommandEntity; +import org.ovirt.engine.core.compat.Guid; + +public interface CommandsCache { + + public CommandEntity get(Guid commandId); + + public void remove(Guid commandId); + + public void put(Guid stepId, Guid commandId, Guid parentCommandId, SPMAsyncTask task); + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java new file mode 100644 index 0000000..63aa3ff --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandsCacheImpl.java @@ -0,0 +1,37 @@ +package org.ovirt.engine.core.bll.tasks; + +import org.ovirt.engine.core.common.businessentities.CommandEntity; +import org.ovirt.engine.core.compat.Guid; + +public class CommandsCacheImpl implements CommandsCache { + + private static final String COMMAND_MAP_NAME = "commandMap"; + CacheWrapper<Guid, CommandEntity> commandMap; + + public CommandsCacheImpl() { + commandMap = CacheProviderFactory.<Guid, CommandEntity> getCacheWrapper(COMMAND_MAP_NAME); + } + + @Override + public CommandEntity get(Guid commandId) { + return commandMap.get(commandId); + } + + @Override + public void remove(Guid commandId) { + commandMap.remove(commandId); + } + + @Override + public void put(Guid stepId, Guid commandId, Guid parentCommandId, SPMAsyncTask task) { + commandMap.put(stepId, buildGetCommandEntity(commandId, parentCommandId, task)); + } + + private CommandEntity buildGetCommandEntity(Guid commandId, Guid parentCommandId, SPMAsyncTask task) { + CommandEntity entity = new CommandEntity(); + entity.setId(commandId); + entity.setParentCommandId(parentCommandId); + CommandEntityUtils.setParameters(entity, task.getParameters().getDbAsyncTask().getActionParameters()); + return entity; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/MapWrapperImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/MapWrapperImpl.java new file mode 100644 index 0000000..a511600 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/MapWrapperImpl.java @@ -0,0 +1,36 @@ +package org.ovirt.engine.core.bll.tasks; + +import java.util.HashMap; +import java.util.Map; + +public class MapWrapperImpl<K, V> implements CacheWrapper<K, V> { + + private final Map<K, V> cache = new HashMap<>(); + + public MapWrapperImpl() { + } + + @Override + public void put(final K key, final V value) { + getCache().put(key, value); + } + + @Override + public V get(final K key) { + return getCache().get(key); + } + + @Override + public void remove(final K key) { + getCache().remove(key); + } + + public Map<K, V> getCache() { + return cache; + } + + @Override + public boolean containsKey(final K key) { + return getCache().containsKey(key); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java index 0f8b6f9..bed992b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java @@ -1,4 +1,4 @@ package org.ovirt.engine.core.bll.tasks.interfaces; -public abstract class CommandCoordinator implements CallBack, TaskHelper { +public abstract class CommandCoordinator implements CallBack, TaskHelper, Poller { } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java new file mode 100644 index 0000000..32c7b2d --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java @@ -0,0 +1,9 @@ +package org.ovirt.engine.core.bll.tasks.interfaces; + +import java.util.Map; +import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; +import org.ovirt.engine.core.compat.Guid; + +public interface Poller { + Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID); +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/CommandEntity.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/CommandEntity.java new file mode 100644 index 0000000..508e902 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/CommandEntity.java @@ -0,0 +1,118 @@ +package org.ovirt.engine.core.common.businessentities; + +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.compat.Guid; + +public class CommandEntity implements BusinessEntity<Guid> { + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((commandId == null) ? 0 : commandId.hashCode()); + result = prime * result + ((commandType == null) ? 0 : commandType.hashCode()); + result = prime * result + ((createdAt == null) ? 0 : createdAt.hashCode()); + result = prime * result + ((data == null) ? 0 : data.hashCode()); + result = prime * result + ((parentCommandId == null) ? 0 : parentCommandId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof CommandEntity)) + return false; + CommandEntity other = (CommandEntity) obj; + if (commandId == null) { + if (other.commandId != null) + return false; + } else if (!commandId.equals(other.commandId)) + return false; + if (commandType != other.commandType) + return false; + if (createdAt == null) { + if (other.createdAt != null) + return false; + } else if (!createdAt.equals(other.createdAt)) + return false; + if (data == null) { + if (other.data != null) + return false; + } else if (!data.equals(other.data)) + return false; + if (parentCommandId == null) { + if (other.parentCommandId != null) + return false; + } else if (!parentCommandId.equals(other.parentCommandId)) + return false; + return true; + } + + /** + * + */ + private static final long serialVersionUID = 5293055556971973650L; + private Guid commandId; + private Guid parentCommandId; + private VdcActionType commandType; + private Map<String, Object> data; + private Date createdAt; + + public Set<Guid> getChildCommandIds() { + return childCommandIds; + } + + public void setChildCommandIds(Set<Guid> childCommandIds) { + this.childCommandIds = childCommandIds; + } + + private Set<Guid> childCommandIds = Collections.newSetFromMap(new ConcurrentHashMap<Guid, Boolean>()); + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Map<String, Object> getData() { + return data; + } + + public void setData(Map<String, Object> data) { + this.data = data; + } + + public Guid getId() { + return commandId; + } + + public void setId(Guid commandId) { + this.commandId = commandId; + } + + public Guid getParentCommandId() { + return parentCommandId; + } + + public void setParentCommandId(Guid parentCommandId) { + this.parentCommandId = parentCommandId; + } + + public VdcActionType getCommandType() { + return commandType; + } + + public void setCommandType(VdcActionType type) { + this.commandType = type; + } +} -- To view, visit http://gerrit.ovirt.org/26335 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2172333255131652bb78623352fb805d16fb4a1b Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
