From a608d0372f24771ac4f40df9980b35140008cabd Mon Sep 17 00:00:00 2001
From: abobrov <abobrov@localhost>
Date: Thu, 23 Apr 2009 15:04:01 +0000
Subject: [PATCH] - fix regression introduced by the fix for issue 3773 in revision 5243. - fix task scheduler completed tasks cleanup. - fix task scheduler retention time calculation. - fix task scheduler to no longer throw alerts if recurring task is not found when scheduling next iteration and remove related alert messages. - fix recurring task unit test to be less prone to timing issues by scheduling test tasks way ahead.

---
 opends/src/messages/messages/backend.properties                                                    |    4 --
 opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java |   22 +++++++----
 opends/src/server/org/opends/server/backends/task/TaskScheduler.java                               |   44 ++++-----------------
 opends/src/server/org/opends/server/util/ServerConstants.java                                      |   23 -----------
 4 files changed, 23 insertions(+), 70 deletions(-)

diff --git a/opends/src/messages/messages/backend.properties b/opends/src/messages/messages/backend.properties
index 78593bf..fdc0654 100644
--- a/opends/src/messages/messages/backend.properties
+++ b/opends/src/messages/messages/backend.properties
@@ -410,10 +410,6 @@
  the same ID
 SEVERE_ERR_TASKSCHED_DUPLICATE_TASK_ID_134=Unable to schedule task %s because \
  another task already exists with the same ID
-SEVERE_ERR_TASKSCHED_CANNOT_FIND_RECURRING_TASK_135=Task %s has completed \
- processing and indicates that it is associated with recurring task %s but no \
- recurring task with that ID is currently defined so it is not possible to \
- schedule the next iteration
 SEVERE_ERR_TASKSCHED_ERROR_SCHEDULING_RECURRING_ITERATION_136=An error \
  occurred while attempting to schedule the next iteration of recurring task \
  %s:  %s
diff --git a/opends/src/server/org/opends/server/backends/task/TaskScheduler.java b/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
index e4a5a46..225b693 100644
--- a/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
+++ b/opends/src/server/org/opends/server/backends/task/TaskScheduler.java
@@ -44,6 +44,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.TreeSet;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -294,19 +295,18 @@
     try
     {
       RecurringTask recurringTask = recurringTasks.remove(recurringTaskID);
-      writeState();
 
       for (Task t : tasks.values())
       {
         if ((t.getRecurringTaskID() != null) &&
             (t.getRecurringTaskID().equals(recurringTaskID)) &&
-            (!TaskState.isDone(t.getTaskState())))
+            !TaskState.isDone(t.getTaskState()))
         {
           cancelTask(t.getTaskID());
         }
-        removeCompletedTask(t.getTaskID());
       }
 
+      writeState();
       return recurringTask;
     }
     finally
@@ -617,25 +617,13 @@
         return false;
       }
 
-
       // See if the task is part of a recurring task.  If so, then schedule the
       // next iteration.
       String recurringTaskID = completedTask.getRecurringTaskID();
       if (recurringTaskID != null)
       {
         RecurringTask recurringTask = recurringTasks.get(recurringTaskID);
-        if (recurringTask == null)
-        {
-          // This shouldn't happen, but handle it anyway.
-          Message message = ERR_TASKSCHED_CANNOT_FIND_RECURRING_TASK.get(
-              String.valueOf(taskID), String.valueOf(recurringTaskID));
-          logError(message);
-
-          DirectoryServer.sendAlertNotification(this,
-                               ALERT_TYPE_CANNOT_FIND_RECURRING_TASK,
-                  message);
-        }
-        else
+        if (recurringTask != null)
         {
           Task newIteration = null;
           try {
@@ -645,8 +633,6 @@
           }
           if (newIteration != null)
           {
-            // FIXME -- What to do if new iteration is null?
-
             try
             {
               scheduleTask(newIteration, false);
@@ -671,10 +657,8 @@
         }
       }
 
-
       writeState();
 
-
       if (isRunning)
       {
         idleThreads.add(taskThread);
@@ -929,8 +913,10 @@
 
 
           // Clean up any completed tasks that have been around long enough.
+          long retentionTimeMillis =
+            TimeUnit.SECONDS.toMillis(taskBackend.getRetentionTime());
           long oldestRetainedCompletionTime =
-                    TimeThread.getTime() - taskBackend.getRetentionTime();
+                    TimeThread.getTime() - retentionTimeMillis;
           iterator = completedTasks.iterator();
           while (iterator.hasNext())
           {
@@ -938,19 +924,11 @@
             if (t.getCompletionTime() < oldestRetainedCompletionTime)
             {
               iterator.remove();
+              tasks.remove(t.getTaskID());
               writeState = true;
             }
-
-            // FIXME -- If the completed tasks list is sorted, can we break out
-            //          of the iterator as soon as we hit one that's not old
-            //          enough to be expired?
           }
 
-
-          // FIXME -- Should we check to see if any of the running jobs have
-          //          logged any messages?
-
-
           // If anything changed, then make sure that the on-disk state gets
           // updated.
           if (writeState)
@@ -970,9 +948,7 @@
           {
             Thread.sleep(sleepTime);
           }
-        } catch (InterruptedException ie){}
-
-        // Clean up any completed tasks that have been around long enough.
+        } catch (InterruptedException ie) {}
       }
     }
     finally
@@ -2156,8 +2132,6 @@
   {
     LinkedHashMap<String,String> alerts = new LinkedHashMap<String,String>();
 
-    alerts.put(ALERT_TYPE_CANNOT_FIND_RECURRING_TASK,
-               ALERT_DESCRIPTION_CANNOT_FIND_RECURRING_TASK);
     alerts.put(ALERT_TYPE_CANNOT_SCHEDULE_RECURRING_ITERATION,
                ALERT_DESCRIPTION_CANNOT_SCHEDULE_RECURRING_ITERATION);
     alerts.put(ALERT_TYPE_CANNOT_RENAME_CURRENT_TASK_FILE,
diff --git a/opends/src/server/org/opends/server/util/ServerConstants.java b/opends/src/server/org/opends/server/util/ServerConstants.java
index f87175f..db00003 100644
--- a/opends/src/server/org/opends/server/util/ServerConstants.java
+++ b/opends/src/server/org/opends/server/util/ServerConstants.java
@@ -1288,29 +1288,6 @@
 
   /**
    * The description for the alert type that will be used for the alert
-   * notification generated if a recurring task cannot be found to schedule the
-   * next iteration after the previous iteration has completed.
-   */
-  public static final String ALERT_DESCRIPTION_CANNOT_FIND_RECURRING_TASK =
-      "This alert type will be used to notify administrators if the " +
-      "Directory Server is unable to locate a recurring task definition in " +
-      "order to schedule the next iteration once the previous iteration has " +
-      "completed.";
-
-
-
-  /**
-   * The alert type string that will be used for the alert notification
-   * generated if a recurring task cannot be found to schedule the next
-   * iteration after the previous iteration has completed.
-   */
-  public static final String ALERT_TYPE_CANNOT_FIND_RECURRING_TASK =
-       "org.opends.server.CannotFindRecurringTask";
-
-
-
-  /**
-   * The description for the alert type that will be used for the alert
    * notification generated if an error occurs while attempting to rename the
    * current tasks backing file.
    */
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
index 32452cc..27be97a 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/task/TaskBackendTestCase.java
@@ -479,20 +479,25 @@
   @Test
   public void testRecurringTask() throws Exception
   {
-    String taskID = "testRecurringTask";
-    String taskDN =
-        "ds-recurring-task-id=" + taskID
-            + ",cn=Recurring Tasks,cn=tasks";
-    String taskSchedule = "00 * * * *";
-
     GregorianCalendar calendar = new GregorianCalendar();
     calendar.setFirstDayOfWeek(GregorianCalendar.SUNDAY);
     calendar.setLenient(false);
+    calendar.add(GregorianCalendar.MONTH, 1);
     calendar.add(GregorianCalendar.HOUR_OF_DAY, 1);
     calendar.set(GregorianCalendar.MINUTE, 0);
     calendar.set(GregorianCalendar.SECOND, 0);
 
     Date scheduledDate = calendar.getTime();
+    int scheduledMonth =
+      calendar.get(GregorianCalendar.MONTH) + 1;
+
+    String taskID = "testRecurringTask";
+    String taskDN =
+        "ds-recurring-task-id=" + taskID
+            + ",cn=Recurring Tasks,cn=tasks";
+    String taskSchedule = "00 * * " +
+      Integer.toString(scheduledMonth) + " *";
+
     String scheduledTaskID = taskID + " - " + scheduledDate.toString();
     String scheduledTaskDN =
         "ds-task-id=" + scheduledTaskID
@@ -519,8 +524,9 @@
     assertEquals(resultCode, 0);
     assertFalse(DirectoryServer.entryExists(DN.decode(taskDN)));
 
-    // Make sure scheduled task iteration got canceled and removed.
-    assertFalse(DirectoryServer.entryExists(DN.decode(scheduledTaskDN)));
+    // Make sure recurring task iteration got canceled.
+    scheduledTask = TasksTestCase.getTask(DN.decode(scheduledTaskDN));
+    assertTrue(TaskState.isCancelled(scheduledTask.getTaskState()));
   }
 
 

--
Gitblit v1.10.0