Ravi Nori has uploaded a new change for review. Change subject: engine : Introduction of Poller, CommandEntity and Ehcache ......................................................................
engine : Introduction of Poller, CommandEntity and Ehcache 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: I6c1d30c40d9e2bddbae547efc0261cc98154d0fa Signed-off-by: Ravi Nori <[email protected]> --- M backend/manager/modules/bll/pom.xml M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java 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/CommandEntity.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAO.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAOImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EhcacheWrapperImpl.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.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 12 files changed, 245 insertions(+), 17 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/26/13826/1 diff --git a/backend/manager/modules/bll/pom.xml b/backend/manager/modules/bll/pom.xml index 20c92f5..5f7c672 100644 --- a/backend/manager/modules/bll/pom.xml +++ b/backend/manager/modules/bll/pom.xml @@ -111,6 +111,14 @@ <version>1.6</version> <scope>test</scope> </dependency> + + <dependency> + <groupId>net.sf.ehcache</groupId> + <artifactId>ehcache</artifactId> + <version>2.6.5</version> + <type>pom</type> + </dependency> + </dependencies> <build> diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java index 7b5c58a..b649f3e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java @@ -11,7 +11,6 @@ import java.util.concurrent.TimeUnit; import org.apache.commons.lang.exception.ExceptionUtils; -import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask; import org.ovirt.engine.core.common.AuditLogType; @@ -26,7 +25,6 @@ import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllErrors; -import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.DateTime; import org.ovirt.engine.core.compat.Guid; @@ -300,9 +298,7 @@ for (Guid storagePoolID : poolsOfActiveTasks) { try { Map<Guid, AsyncTaskStatus> map = - (Map<Guid, AsyncTaskStatus>) Backend.getInstance().getResourceManager().RunVdsCommand( - VDSCommandType.SPMGetAllTasksStatuses, - new IrsBaseVDSCommandParameters(storagePoolID)).getReturnValue(); + (Map<Guid, AsyncTaskStatus>) coco.getAllTasksStatuses(storagePoolID); if (map != null) { poolsAsyncTaskMap.put(storagePoolID, map); } 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..69f3acb --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CacheProviderFactory.java @@ -0,0 +1,37 @@ +package org.ovirt.engine.core.bll.tasks; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import net.sf.ehcache.config.CacheConfiguration; +import net.sf.ehcache.config.PersistenceConfiguration; +import net.sf.ehcache.store.MemoryStoreEvictionPolicy; + +public class CacheProviderFactory { + private static final int MAX_ELEMENTS = 50; + private static CacheManager manager = CacheManager.create(); + + public static <K, V> CacheWrapper<K, V> getCacheWrapper(String name) { + return new EhcacheWrapperImpl<K, V>(getCache(name)); + } + + private static Cache getCache(String name) { + Cache cache = manager.getCache(name); + if (cache == null) { + cache = initGetCache(name); + manager.addCache(cache); + } + return cache; + } + + private static Cache initGetCache(final String name) { + //Create a Cache specifying its configuration. + Cache cache = new Cache( + new CacheConfiguration(name, MAX_ELEMENTS) + .memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU) + .eternal(true) + .diskExpiryThreadIntervalSeconds(0) + .persistence(new PersistenceConfiguration().strategy(PersistenceConfiguration.Strategy.LOCALTEMPSWAP))); + return cache; + } + +} 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 5f8ec11..6fec449 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 @@ -49,11 +49,11 @@ public static CommandCoordinatorImpl getInstance() { return instance; } - - Map<NGuid, ExecutionContext> executionContextMap; + CacheWrapper<NGuid, ExecutionContext> executionContextMap; + CommandEntityDAO commandEntityDAO = new CommandEntityDAOImpl(); private CommandCoordinatorImpl() { - executionContextMap = new HashMap<>(); + executionContextMap = CacheProviderFactory.<NGuid, ExecutionContext>getCacheWrapper(EXECUTION_CONTEXT_MAP_NAME); } @Override @@ -68,10 +68,25 @@ context = createFinalizingContext(stepId.getValue()); executionContextMap.put(stepId, context); } + if (stepId != null) { + CommandEntity commandEntity = commandEntityDAO.get(stepId); + if (!actionType.equals(commandEntity.getActionType())) { + throw new RuntimeException("action types dont match"); + } else { + log.info("in CommandManager.endAction action types match " + actionType.toString()); + } + if (!parameters.equals(commandEntity.getParameters())) { + 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(); +// return new DecoratedCommand(command, dbAsyncTask).endAction(); } finally { + commandEntityDAO.remove(stepId); } } @@ -153,7 +168,11 @@ task.setEntityType(entityType); task.setAssociatedEntities(entityIds); AsyncTaskUtils.addOrUpdateTaskInDB(task); - + commandEntityDAO.put( + task.getParameters().getDbAsyncTask().getStepId(), + command.getCommandId(), + command.getParameters().getParentParameters() == null ? Guid.Empty : command.getParameters().getParentParameters().getCommandId(), + task); getAsyncTaskManager().lockAndAddTaskToManager(task); retValue = task.getTaskID(); updateStepExternalId(taskStep, retValue, ExternalSystemType.VDSM); @@ -381,6 +400,18 @@ } } + @Override + public AsyncTaskStatus getTaskStatus(Guid storagePoolID, Guid taskID) { + Object tempVar = runVdsCommand(VDSCommandType.SPMGetTaskStatus, + new SPMTaskGuidBaseVDSCommandParameters(storagePoolID, taskID)).getReturnValue(); + return (AsyncTaskStatus) ((tempVar instanceof AsyncTaskStatus) ? tempVar : null); + } + @Override + public Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID) { + return (Map<Guid, AsyncTaskStatus>) runVdsCommand(VDSCommandType.SPMGetAllTasksStatuses, + new IrsBaseVDSCommandParameters(storagePoolID)).getReturnValue(); + } + private BackendInternal getBackend() { return Backend.getInstance(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntity.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntity.java new file mode 100644 index 0000000..11e0dac --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntity.java @@ -0,0 +1,45 @@ +package org.ovirt.engine.core.bll.tasks; + +import java.io.Serializable; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.compat.NGuid; + +public class CommandEntity implements Serializable { + private NGuid commandId; + private NGuid parentCommandId; + private VdcActionType actionType; + private VdcActionParametersBase parameters; + + public NGuid getCommandId() { + return commandId; + } + + public void setCommandId(NGuid commandId) { + this.commandId = commandId; + } + + public NGuid getParentCommandId() { + return parentCommandId; + } + + public void setParentCommandId(NGuid parentCommandId) { + this.parentCommandId = parentCommandId; + } + + public VdcActionType getActionType() { + return actionType; + } + + public void setActionType(VdcActionType actionType) { + this.actionType = actionType; + } + + public VdcActionParametersBase getParameters() { + return parameters; + } + + public void setParameters(VdcActionParametersBase parameters) { + this.parameters = parameters; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAO.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAO.java new file mode 100644 index 0000000..84c66dc --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAO.java @@ -0,0 +1,14 @@ +package org.ovirt.engine.core.bll.tasks; + +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NGuid; + +public interface CommandEntityDAO { + + public CommandEntity get(NGuid stepId); + + public void remove(NGuid stepId); + + public void put(NGuid stepId, Guid commandId, Guid parentCommandId, SPMAsyncTask task); + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAOImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAOImpl.java new file mode 100644 index 0000000..96b8434 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityDAOImpl.java @@ -0,0 +1,38 @@ +package org.ovirt.engine.core.bll.tasks; + +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NGuid; + +public class CommandEntityDAOImpl implements CommandEntityDAO { + + private static final String COMMAND_MAP_NAME = "commandMap"; + CacheWrapper<NGuid, CommandEntity> commandMap; + + public CommandEntityDAOImpl() { + commandMap = CacheProviderFactory.<NGuid, CommandEntity>getCacheWrapper(COMMAND_MAP_NAME); + } + + @Override + public CommandEntity get(NGuid stepId) { + return commandMap.get(stepId); + } + + @Override + public void remove(NGuid stepId) { + commandMap.remove(stepId); + } + + @Override + public void put(NGuid 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.setCommandId(commandId); + entity.setParentCommandId(parentCommandId); + entity.setActionType(task.getParameters().getDbAsyncTask().getaction_type()); + entity.setParameters(task.getParameters().getDbAsyncTask().getActionParameters()); + return entity; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EhcacheWrapperImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EhcacheWrapperImpl.java new file mode 100644 index 0000000..97358a2 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/EhcacheWrapperImpl.java @@ -0,0 +1,42 @@ +package org.ovirt.engine.core.bll.tasks; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.Element; + +public class EhcacheWrapperImpl<K, V> implements CacheWrapper<K, V> { + + private final Cache cache; + + public EhcacheWrapperImpl(final Cache cache) { + this.cache = cache; + } + + @Override + public void put(final K key, final V value) { + getCache().put(new Element(key, value)); + } + + @Override + public V get(final K key) { + Element element = getCache().get(key); + if (element != null) { + return (V) element.getValue(); + } + return null; + } + + @Override + public void remove(final K key) { + getCache().remove(key); + } + + public Cache getCache() { + return cache; + } + + @Override + public boolean containsKey(final K key) { + return getCache().isKeyInCache(key) || getCache().get(key) != null; + } +} + diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java index 0e5668f..0f4c258 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java @@ -1,6 +1,5 @@ package org.ovirt.engine.core.bll.tasks; -import org.ovirt.engine.core.bll.Backend; import static org.ovirt.engine.core.common.config.ConfigValues.UknownTaskPrePollingLapse; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; @@ -12,8 +11,6 @@ import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.job.JobExecutionStatus; -import org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters; -import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; @@ -396,10 +393,7 @@ AsyncTaskStatus returnValue = null; try { - Object tempVar = Backend.getInstance().getResourceManager() - .RunVdsCommand(VDSCommandType.SPMGetTaskStatus, - new SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getTaskID())).getReturnValue(); - returnValue = (AsyncTaskStatus) ((tempVar instanceof AsyncTaskStatus) ? tempVar : null); + returnValue = coco.getTaskStatus(getStoragePoolID(), getTaskID()); } catch (RuntimeException e) { log.error( 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 0a119fc..a7c381a 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,5 +1,5 @@ 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..d0606a7 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java @@ -0,0 +1,11 @@ +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); + AsyncTaskStatus getTaskStatus(Guid storagePoolID, Guid taskID); +} + -- To view, visit http://gerrit.ovirt.org/13826 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6c1d30c40d9e2bddbae547efc0261cc98154d0fa 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
