From 910bb014274dd72ffbe6b9fc60bcab1753624bcf Mon Sep 17 00:00:00 2001
From: abobrov <abobrov@localhost>
Date: Tue, 19 May 2009 14:48:49 +0000
Subject: [PATCH] - attempt to fix possible race condition that might occur when scheduled task changes its state to done but hasnt transitioned to the completed tasks list yet.
---
opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java | 5 ++++-
opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskThread.java | 12 ++++++------
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
index 45e0188..d66f9c2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
@@ -620,17 +620,20 @@
* @param taskThread The thread that has completed processing on its
* previously-assigned task.
* @param completedTask The task for which processing has been completed.
+ * @param taskState The task state for this completed task.
*
* @return <CODE>true</CODE> if the thread should continue running and
* wait for the next task to process, or <CODE>false</CODE> if it
* should exit immediately.
*/
- public boolean threadDone(TaskThread taskThread, Task completedTask)
+ public boolean threadDone(TaskThread taskThread, Task completedTask,
+ TaskState taskState)
{
schedulerLock.lock();
try
{
+ completedTask.setTaskState(taskState);
addCompletedTask(completedTask);
String taskID = completedTask.getTaskID();
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskThread.java b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskThread.java
index 6850344..0c53c92 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskThread.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskThread.java
@@ -193,9 +193,10 @@
continue;
}
+ TaskState taskState = getAssociatedTask().getTaskState();
try
{
- if (!TaskState.isDone(getAssociatedTask().getTaskState()))
+ if (!TaskState.isDone(taskState))
{
Task task = getAssociatedTask();
@@ -203,8 +204,7 @@
task.getDisplayName(), task.getTaskID());
logError(message);
- TaskState returnState = task.execute();
- task.setTaskState(returnState);
+ taskState = task.execute();
message = NOTE_TASK_FINISHED.get(
task.getDisplayName(), task.getTaskID());
@@ -229,7 +229,7 @@
Task completedTask = getAssociatedTask();
setAssociatedTask(null);
- if (! taskScheduler.threadDone(this, completedTask))
+ if (! taskScheduler.threadDone(this, completedTask, taskState))
{
exitRequested = true;
break;
@@ -239,8 +239,8 @@
if (getAssociatedTask() != null)
{
Task task = getAssociatedTask();
- task.setTaskState(TaskState.STOPPED_BY_SHUTDOWN);
- taskScheduler.threadDone(this, task);
+ TaskState taskState = TaskState.STOPPED_BY_SHUTDOWN;
+ taskScheduler.threadDone(this, task, taskState);
}
}
--
Gitblit v1.10.0