Ravi Nori has uploaded a new change for review.

Change subject: engine : endAction run multiple times When RuntimeException 
occurs
......................................................................

engine : endAction run multiple times When RuntimeException occurs

When RuntimeException occurs at endAction, the
endAction part will be rerun over and over again

Change-Id: I50d7688c9f06ae90bed3d80c286534311f5afb1c
Bug-Url: https://bugzilla.redhat.com/999896
Signed-off-by: Ravi Nori <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandAsyncTask.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandMultiAsyncTasks.java
2 files changed, 31 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/09/18609/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandAsyncTask.java
index aa1e4f5..d70ab5e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandAsyncTask.java
@@ -110,6 +110,7 @@
         CommandMultiAsyncTasks entityInfo = GetCommandMultiAsyncTasks();
         VdcReturnValueBase vdcReturnValue = null;
         ExecutionContext context = null;
+        boolean endActionRuntimeException = false;
 
         AsyncTasks dbAsyncTask = getParameters().getDbAsyncTask();
         ArrayList<VdcActionParametersBase> imagesParameters = new 
ArrayList<VdcActionParametersBase>();
@@ -150,6 +151,7 @@
                 log.debug(ex);
             } catch (RuntimeException ex) {
                 log.error(getErrorMessage(), ex);
+                endActionRuntimeException = true;
             }
         }
 
@@ -157,9 +159,15 @@
             log.error(
                     "CommandAsyncTask::EndCommandAction [within thread]: An 
exception has been thrown (not related to 'EndAction' itself)",
                     Ex2);
+            endActionRuntimeException = true;
         }
 
         finally {
+            // if a RuntimeExcpetion occurs we clear the task from db and 
perform no other action
+            if (endActionRuntimeException) {
+                handleEndActionRuntimeException(entityInfo, dbAsyncTask);
+                return;
+            }
             boolean isTaskGroupSuccess = 
dbAsyncTask.getActionParameters().getTaskGroupSuccess();
             handleEndActionResult(entityInfo, vdcReturnValue, context, 
isTaskGroupSuccess);
         }
@@ -178,6 +186,23 @@
                 
getParameters().getDbAsyncTask().getActionParameters().getCommandType());
     }
 
+    private void handleEndActionRuntimeException(CommandMultiAsyncTasks 
commandInfo, AsyncTasks dbAsyncTask) {
+        try {
+            
commandInfo.clearTaskWithRuntimeException(dbAsyncTask.getVdsmTaskId());
+            RemoveTaskFromDB();
+            if (commandInfo.getAllCleared()) {
+                log.infoFormat(
+                        "CommandAsyncTask::HandleEndActionRuntimeException 
[within thread]: Removing CommandMultiAsyncTasks object for entity '{0}'",
+                        commandInfo.getCommandId());
+                _multiTasksByCommandIds.remove(commandInfo.getCommandId());
+            }
+        }
+
+        catch (RuntimeException ex) {
+            log.error("CommandAsyncTask::HandleEndActionResult [within 
thread]: an exception has been thrown", ex);
+        }
+    }
+
     private void handleEndActionResult(CommandMultiAsyncTasks commandInfo, 
VdcReturnValueBase vdcReturnValue,
             ExecutionContext context,
             boolean isTaskGroupSuccess) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandMultiAsyncTasks.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandMultiAsyncTasks.java
index c758a1a..3c78ecf 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandMultiAsyncTasks.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandMultiAsyncTasks.java
@@ -139,6 +139,12 @@
         }
     }
 
+    public void clearTaskWithRuntimeException(Guid vdsmTaskId) {
+        synchronized (_listTasks) {
+            _listTasks.remove(vdsmTaskId);
+        }
+    }
+
     public void StartPollingTask(Guid TaskID) {
         synchronized (_listTasks) {
             if (_listTasks.containsKey(TaskID) && 
_listTasks.get(TaskID).getParameters() != null


-- 
To view, visit http://gerrit.ovirt.org/18609
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I50d7688c9f06ae90bed3d80c286534311f5afb1c
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