Yaniv Bronhaim has uploaded a new change for review.

Change subject: Handling polling retries for unknown tasks
......................................................................

Handling polling retries for unknown tasks

Task gets to "Unknown status" when after polling the task-id exists in
engine's DB but not in VDSM. Currently in HandleEndedTask if task is
unknown we stop polling it, and call to clearTask that leads to
endAction.

This patch adds retries logic, e.g. leaving task for polling until
configure number of retries. After polling tries reach to maximum, we
perform stopTask and endAction.
For that, getShouldPoll should continue to poll also when task is set to
unknown and retries hasn't reached to maximum.

Bug-Id: https://bugzilla.redhat.com/show_bug.cgi?id=880547
Change-Id: Ia9358215f922693bb69582f7ac309ebba9a217d6
Signed-off-by: Yaniv Bronhaim <ybron...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTaskStatus.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SpmStartVDSCommand.java
4 files changed, 22 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/74/15774/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
index 55259c7..f9d9164 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
@@ -8,6 +8,7 @@
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
 import org.ovirt.engine.core.common.config.Config;
+import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.job.JobExecutionStatus;
 import 
org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters;
@@ -74,12 +75,24 @@
     public boolean getShouldPoll() {
         AsyncTaskState state = getState();
         return (state == AsyncTaskState.Polling || state == 
AsyncTaskState.Ended || state == AsyncTaskState.ClearFailed)
-                && getLastTaskStatus().getStatus() != 
AsyncTaskStatusEnum.unknown
+                && (getLastTaskStatus().getStatus() != 
AsyncTaskStatusEnum.unknown || !unknownPollReachToMax())
                 && (getParameters().getEntityId() == null ? 
isTaskOverPrePollingLapse() : true);
     }
 
     private AsyncTaskStatus _lastTaskStatus = new 
AsyncTaskStatus(AsyncTaskStatusEnum.init);
+    private int _unknownPollRetries = 0;
+    private final int _maxUnknownPollRetries = Config.<Integer> 
GetValue(ConfigValues.MaxUnknownTaskRetries);
 
+    private boolean increaseAndCheckUnknownPollReachToMax() {
+        _unknownPollRetries++;
+        return unknownPollReachToMax();
+    }
+
+    private boolean unknownPollReachToMax() {
+        if (_unknownPollRetries >= _maxUnknownPollRetries)
+            return false;
+        return true;
+    }
     public AsyncTaskStatus getLastTaskStatus() {
         return _lastTaskStatus;
     }
@@ -226,7 +239,7 @@
             OnTaskEndFailure();
         }
 
-        else if (!DoesTaskExist()) {
+        else if (getLastTaskStatus().getStatus() == 
AsyncTaskStatusEnum.unknown && !increaseAndCheckUnknownPollReachToMax()) {
             
ExecutionHandler.endTaskStep(privateParameters.getDbAsyncTask().getStepId(), 
JobExecutionStatus.UNKNOWN);
             OnTaskDoesNotExist();
         }
@@ -252,10 +265,6 @@
 
     private boolean HasTaskEndedInFailure() {
         return !getLastTaskStatus().getTaskIsRunning() && 
!getLastTaskStatus().getTaskEndedSuccessfully();
-    }
-
-    private boolean DoesTaskExist() {
-        return getLastTaskStatus().getStatus() != AsyncTaskStatusEnum.unknown;
     }
 
     protected void OnTaskEndSuccess() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTaskStatus.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTaskStatus.java
index 0872b59..5002246 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTaskStatus.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/AsyncTaskStatus.java
@@ -61,7 +61,8 @@
     }
 
     public boolean getTaskIsRunning() {
-        return getStatus() != AsyncTaskStatusEnum.finished && getStatus() != 
AsyncTaskStatusEnum.unknown;
+        return getStatus() != AsyncTaskStatusEnum.finished &&
+               getStatus() != AsyncTaskStatusEnum.unknown;
     }
 
     public boolean getTaskIsInUnusualState() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
index 9b6d02b..c1f53ce 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
@@ -1374,6 +1374,10 @@
     @DefaultValueAttribute("false")
     MemorySnapshotSupported(511),
 
+    @TypeConverterAttribute(Integer.class)
+    @DefaultValueAttribute("10")
+    MaxUnknownTaskRetries(512),
+
     Invalid(65535);
 
     private int intValue;
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SpmStartVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SpmStartVDSCommand.java
index df1f276..60b1380 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SpmStartVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SpmStartVDSCommand.java
@@ -1,7 +1,6 @@
 package org.ovirt.engine.core.vdsbroker.vdsbroker;
 
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
-import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
 import org.ovirt.engine.core.common.businessentities.SpmStatusResult;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
@@ -43,8 +42,7 @@
                     .runVdsCommand(VDSCommandType.HSMGetTaskStatus,
                             new HSMTaskGuidBaseVDSCommandParameters(vdsId, 
taskId)).getReturnValue();
             log.debugFormat("spmStart polling - task status: {0}", 
taskStatus.getStatus().toString());
-        } while (taskStatus.getStatus() != AsyncTaskStatusEnum.finished
-                && taskStatus.getStatus() != AsyncTaskStatusEnum.unknown);
+        } while (taskStatus.getTaskIsRunning());
 
         log.infoFormat("spmStart polling ended: taskId = {0} task status = 
{1}", taskId, taskStatus.getStatus());
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia9358215f922693bb69582f7ac309ebba9a217d6
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Yaniv Bronhaim <ybron...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to