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

Reply via email to