Hello Ravi Nori, I'd like you to do a code review. Please visit
http://gerrit.ovirt.org/14103 to review the following change. 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 Change-Id: I7c1e4619819a6e323fd5bf0bd3568b666aff63ff Signed-off-by: Ravi Nori <rn...@redhat.com> Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com> --- 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/CommandEntitCacheHandlerImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityCacheHandler.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 A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/CommandEntity.java 12 files changed, 319 insertions(+), 19 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/03/14103/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..749b15e 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; @@ -46,7 +44,7 @@ /** * AsyncTaskManager: Singleton, manages all tasks in the system. */ -final class AsyncTaskManager { +public final class AsyncTaskManager { private static final Log log = LogFactory.getLog(AsyncTaskManager.class); /** Map which consist all tasks that currently are monitored **/ @@ -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..cf93a5c 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 @@ -1,10 +1,11 @@ package org.ovirt.engine.core.bll.tasks; -import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; + import javax.transaction.Transaction; + import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.CommandsFactory; @@ -12,6 +13,7 @@ import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.job.ExecutionContext; import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator; import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionParametersBase; @@ -24,6 +26,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.JobExecutionStatus; import org.ovirt.engine.core.common.job.Step; @@ -49,11 +52,11 @@ public static CommandCoordinatorImpl getInstance() { return instance; } - - Map<NGuid, ExecutionContext> executionContextMap; + CacheWrapper<NGuid, ExecutionContext> executionContextMap; + CommandEntityCacheHandler commandEntityDAO = new CommandEntitCacheHandlerImpl(); private CommandCoordinatorImpl() { - executionContextMap = new HashMap<>(); + executionContextMap = CacheProviderFactory.<NGuid, ExecutionContext>getCacheWrapper(EXECUTION_CONTEXT_MAP_NAME); } @Override @@ -68,10 +71,27 @@ context = createFinalizingContext(stepId.getValue()); executionContextMap.put(stepId, context); } + if (stepId != null) { + CommandEntity commandEntity = commandEntityDAO.get(stepId); + if (!actionType.equals(commandEntity.getCommandType())) { + throw new RuntimeException("action types dont match"); + } else { + log.info("in CommandManager.endAction action types match " + actionType.toString()); + } + Map<String, Object> data = commandEntity.getData(); + VdcActionParametersBase paramsOfCommand = (VdcActionParametersBase) data.get("params"); + if (!parameters.equals(paramsOfCommand)) { + 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 +173,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 +405,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/CommandEntitCacheHandlerImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntitCacheHandlerImpl.java new file mode 100644 index 0000000..26c5cd0 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntitCacheHandlerImpl.java @@ -0,0 +1,43 @@ +package org.ovirt.engine.core.bll.tasks; + +import java.util.HashMap; +import java.util.Map; + +import org.ovirt.engine.core.common.businessentities.CommandEntity; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NGuid; + +public class CommandEntitCacheHandlerImpl implements CommandEntityCacheHandler { + + private static final String COMMAND_MAP_NAME = "commandMap"; + CacheWrapper<NGuid, CommandEntity> commandMap; + + public CommandEntitCacheHandlerImpl() { + 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.setId(commandId); + entity.setParentCommandId(parentCommandId); + entity.setCommandType(task.getParameters().getDbAsyncTask().getaction_type()); + Map<String, Object> data = new HashMap<String, Object>(); + data.put("params", task.getParameters().getDbAsyncTask().getActionParameters()); + return entity; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityCacheHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityCacheHandler.java new file mode 100644 index 0000000..b358e7f --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandEntityCacheHandler.java @@ -0,0 +1,15 @@ +package org.ovirt.engine.core.bll.tasks; + +import org.ovirt.engine.core.common.businessentities.CommandEntity; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NGuid; + +public interface CommandEntityCacheHandler { + + 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/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); +} + 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..3637092 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/CommandEntity.java @@ -0,0 +1,106 @@ +package org.ovirt.engine.core.common.businessentities; + +import java.util.Date; +import java.util.Map; + +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NGuid; + +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 NGuid parentCommandId; + private VdcActionType commandType; + private Map<String, Object> data; + private Date createdAt; + + 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 NGuid getParentCommandId() { + return parentCommandId; + } + + public void setParentCommandId(NGuid parentCommandId) { + this.parentCommandId = parentCommandId; + } + + public VdcActionType getCommandType() { + return commandType; + } + + public void setCommandType(VdcActionType type) { + this.commandType = type; + } +} -- To view, visit http://gerrit.ovirt.org/14103 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7c1e4619819a6e323fd5bf0bd3568b666aff63ff Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com> Gerrit-Reviewer: Ravi Nori <rn...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches