From 4fe7067c6b2211cd098d08125e5662668abfdde4 Mon Sep 17 00:00:00 2001
From: abobrov <abobrov@localhost>
Date: Fri, 24 Apr 2009 00:13:37 +0000
Subject: [PATCH] - restore Issue 3773 fix. - avoid ConcurrentModificationException when removing completed task iterations. - plug possible naming conflict so that task ids from completed tasks can be reused.
---
opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskScheduler.java | 38 ++++++++++++++++++++++++++++++++++----
opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java | 5 ++---
2 files changed, 36 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 c6cfaac..df172ef 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
@@ -43,6 +43,7 @@
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.TreeSet;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
@@ -260,7 +261,14 @@
Task task = recurringTask.scheduleNextIteration();
if (task != null)
{
- // FIXME -- What to do if task is null?
+ // If there is an existing task with the same id
+ // and it is in completed state, take its place.
+ Task t = tasks.get(task.getTaskID());
+ if ((t != null) && TaskState.isDone(t.getTaskState()))
+ {
+ removeCompletedTask(t.getTaskID());
+ }
+
scheduleTask(task, false);
}
}
@@ -295,14 +303,28 @@
try
{
RecurringTask recurringTask = recurringTasks.remove(recurringTaskID);
+ HashMap<String,Task> iterationsMap = new HashMap<String,Task>();
for (Task t : tasks.values())
{
+ // Find any existing task iterations and try to cancel them.
if ((t.getRecurringTaskID() != null) &&
- (t.getRecurringTaskID().equals(recurringTaskID)) &&
- !TaskState.isDone(t.getTaskState()))
+ (t.getRecurringTaskID().equals(recurringTaskID)))
{
- cancelTask(t.getTaskID());
+ if (!TaskState.isDone(t.getTaskState()))
+ {
+ cancelTask(t.getTaskID());
+ }
+ iterationsMap.put(t.getTaskID(), t);
+ }
+ }
+
+ // Remove any completed task iterations.
+ for (Map.Entry<String,Task> iterationEntry : iterationsMap.entrySet())
+ {
+ if (TaskState.isDone(iterationEntry.getValue().getTaskState()))
+ {
+ removeCompletedTask(iterationEntry.getKey());
}
}
@@ -635,6 +657,14 @@
{
try
{
+ // If there is an existing task with the same id
+ // and it is in completed state, take its place.
+ Task t = tasks.get(newIteration.getTaskID());
+ if ((t != null) && TaskState.isDone(t.getTaskState()))
+ {
+ removeCompletedTask(t.getTaskID());
+ }
+
scheduleTask(newIteration, false);
}
catch (DirectoryException de)
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
index 27be97a..e405d56 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
@@ -524,9 +524,8 @@
assertEquals(resultCode, 0);
assertFalse(DirectoryServer.entryExists(DN.decode(taskDN)));
- // Make sure recurring task iteration got canceled.
- scheduledTask = TasksTestCase.getTask(DN.decode(scheduledTaskDN));
- assertTrue(TaskState.isCancelled(scheduledTask.getTaskState()));
+ // Make sure recurring task iteration got canceled and removed.
+ assertFalse(DirectoryServer.entryExists(DN.decode(scheduledTaskDN)));
}
--
Gitblit v1.10.0