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

Reply via email to