| | |
| | | import org.opends.server.util.TimeThread; |
| | | |
| | | import static org.opends.server.config.ConfigConstants.*; |
| | | import static org.opends.server.loggers.Debug.*; |
| | | import static org.opends.server.loggers.debug.DebugLogger.debugCought; |
| | | import static org.opends.server.loggers.debug.DebugLogger.debugEnabled; |
| | | import static org.opends.server.loggers.Error.*; |
| | | import org.opends.server.types.DebugLogLevel; |
| | | import static org.opends.server.messages.BackendMessages.*; |
| | | import static org.opends.server.messages.MessageHandler.*; |
| | | import static org.opends.server.util.ServerConstants.*; |
| | |
| | | implements AlertGenerator |
| | | { |
| | | /** |
| | | * The fully-qualified name of this class for debugging purposes. |
| | | * The fully-qualified name of this class. |
| | | */ |
| | | private static final String CLASS_NAME = |
| | | "org.opends.server.backends.task.TaskScheduler"; |
| | |
| | | { |
| | | super("Task Scheduler Thread"); |
| | | |
| | | assert debugConstructor(CLASS_NAME, String.valueOf(taskBackend)); |
| | | |
| | | this.taskBackend = taskBackend; |
| | | |
| | |
| | | boolean scheduleIteration) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "addRecurringTask", |
| | | String.valueOf(recurringTask), |
| | | String.valueOf(scheduleIteration)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | public RecurringTask removeRecurringTask(String recurringTaskID) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "removeRecurringTask", |
| | | String.valueOf(recurringTaskID)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | public void scheduleTask(Task task, boolean writeState) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "scheduleTask", String.valueOf(task)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | */ |
| | | public Task cancelTask(String taskID) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "cancelTask", String.valueOf(taskID)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | public Task removePendingTask(String taskID) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "removePendingTask", String.valueOf(taskID)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | public Task removeCompletedTask(String taskID) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "removeCompletedTask", |
| | | String.valueOf(taskID)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | */ |
| | | public boolean threadDone(TaskThread taskThread, Task completedTask) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "threadDone", String.valueOf(taskThread)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "threadDone", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_ERROR_SCHEDULING_RECURRING_ITERATION; |
| | | String message = getMessage(msgID, recurringTaskID, |
| | |
| | | */ |
| | | public void addCompletedTask(Task completedTask) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "addCompletedTask", |
| | | String.valueOf(completedTask)); |
| | | |
| | | // The scheduler lock is reentrant, so even if we already hold it, we can |
| | | // acquire it again. |
| | |
| | | */ |
| | | public void stopScheduler() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "stopScheduler"); |
| | | |
| | | stopRequested = true; |
| | | |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "stopScheduler", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | |
| | | try |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "stopScheduler", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | |
| | | pendingTasks.clear(); |
| | |
| | | public void interruptRunningTasks(TaskState interruptState, |
| | | String interruptReason, boolean waitForStop) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "interruptRunningTasks", |
| | | String.valueOf(waitForStop)); |
| | | |
| | | |
| | | // Grab a copy of the running threads so that we can operate on them without |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "interruptRunningTasks", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "interruptRunningTasks", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | */ |
| | | public void run() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "run"); |
| | | |
| | | isRunning = true; |
| | | schedulerThread = currentThread(); |
| | |
| | | */ |
| | | private TaskState shouldStart(Task task) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "shouldStart", String.valueOf(task)); |
| | | |
| | | if (! isRunning) |
| | | { |
| | |
| | | private void initializeTasksFromBackingFile() |
| | | throws InitializationException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "initializeTasksFromBackingFile"); |
| | | |
| | | String backingFilePath = taskBackend.getTaskBackingFile(); |
| | | |
| | |
| | | } |
| | | catch (LDIFException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "initializeTasksFromBackingFile", |
| | | le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | if (le.canContinueReading()) |
| | | { |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, |
| | | "initializeTasksFromBackingFile", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_PARSE_ENTRY_FATAL; |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, |
| | | "initializeTasksFromBackingFile", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | int msgID = |
| | | MSGID_TASKSCHED_CANNOT_SCHEDULE_RECURRING_TASK_FROM_ENTRY; |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, |
| | | "initializeTasksFromBackingFile", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_SCHEDULE_TASK_FROM_ENTRY; |
| | | String message = getMessage(msgID, String.valueOf(entryDN), |
| | |
| | | } |
| | | catch (IOException ioe) |
| | | { |
| | | assert debugException(CLASS_NAME, "initializeTasksFromBackingFile", ioe); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, ioe); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_ERROR_READING_TASK_BACKING_FILE; |
| | | String message = getMessage(msgID, String.valueOf(backingFilePath), |
| | |
| | | private void createNewTaskBackingFile() |
| | | throws InitializationException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "createNewTaskBackingFile"); |
| | | |
| | | String backingFile = taskBackend.getTaskBackingFile(); |
| | | LDIFExportConfig exportConfig = |
| | |
| | | } |
| | | catch (IOException ioe) |
| | | { |
| | | assert debugException(CLASS_NAME, "createNewTaskBackingFile", ioe); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, ioe); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_CREATE_BACKING_FILE; |
| | | String message = getMessage(msgID, backingFile, |
| | |
| | | } |
| | | catch (LDIFException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "createNewTaskBackingFile", le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_CREATE_BACKING_FILE; |
| | |
| | | */ |
| | | public void writeState() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "writeState"); |
| | | |
| | | |
| | | String backingFilePath = taskBackend.getTaskBackingFile(); |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "writeState", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "writeState", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_RENAME_CURRENT_BACKING_FILE; |
| | | String message = getMessage(msgID, String.valueOf(backingFilePath), |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "writeState", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_RENAME_NEW_BACKING_FILE; |
| | | String message = getMessage(msgID, String.valueOf(tmpFilePath), |
| | |
| | | } |
| | | catch (IOException ioe) |
| | | { |
| | | assert debugException(CLASS_NAME, "createNewTaskBackingFile", ioe); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, ioe); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_WRITE_BACKING_FILE; |
| | | String message = getMessage(msgID, tmpFilePath, |
| | |
| | | } |
| | | catch (LDIFException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "createNewTaskBackingFile", le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_WRITE_BACKING_FILE; |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "createNewTaskBackingFile", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_WRITE_BACKING_FILE; |
| | | String message = getMessage(msgID, tmpFilePath, |
| | |
| | | */ |
| | | public long getEntryCount() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getEntryCount"); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | */ |
| | | public Entry getTaskRootEntry() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getTaskRootEntry"); |
| | | |
| | | return taskRootEntry; |
| | | } |
| | |
| | | */ |
| | | public Entry getScheduledTaskParentEntry() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getScheduledTaskParentEntry"); |
| | | |
| | | return scheduledTaskParentEntry; |
| | | } |
| | |
| | | */ |
| | | public Entry getRecurringTaskParentEntry() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getRecurringTaskParentEntry"); |
| | | |
| | | return recurringTaskParentEntry; |
| | | } |
| | |
| | | */ |
| | | public Task getScheduledTask(String taskID) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getScheduledTask", String.valueOf(taskID)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | */ |
| | | public Task getScheduledTask(DN taskEntryDN) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getScheduledTask", |
| | | String.valueOf(taskEntryDN)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | */ |
| | | Lock writeLockEntry(DN entryDN) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "lockEntry", String.valueOf(entryDN)); |
| | | |
| | | Lock lock = LockManager.lockWrite(entryDN); |
| | | while (lock == null) |
| | |
| | | Lock readLockEntry(DN entryDN) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "lockEntry", String.valueOf(entryDN)); |
| | | |
| | | Lock lock = LockManager.lockRead(entryDN); |
| | | for (int i=0; ((lock == null) && (i < 4)); i++) |
| | |
| | | */ |
| | | void unlockEntry(DN entryDN, Lock lock) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "unlockEntry", String.valueOf(entryDN), |
| | | String.valueOf(lock)); |
| | | |
| | | LockManager.unlock(entryDN, lock); |
| | | } |
| | |
| | | */ |
| | | public Entry getScheduledTaskEntry(DN scheduledTaskEntryDN) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getScheduledTaskEntry", |
| | | String.valueOf(scheduledTaskEntryDN)); |
| | | |
| | | |
| | | schedulerLock.lock(); |
| | |
| | | public boolean searchScheduledTasks(SearchOperation searchOperation) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "searchScheduledTasks", |
| | | String.valueOf(searchOperation)); |
| | | |
| | | SearchFilter filter = searchOperation.getFilter(); |
| | | |
| | |
| | | */ |
| | | public RecurringTask getRecurringTask(String recurringTaskID) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getRecurringTask", |
| | | String.valueOf(recurringTaskID)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | */ |
| | | public RecurringTask getRecurringTask(DN recurringTaskEntryDN) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getRecurringTask", |
| | | String.valueOf(recurringTaskEntryDN)); |
| | | |
| | | schedulerLock.lock(); |
| | | |
| | |
| | | */ |
| | | public Entry getRecurringTaskEntry(DN recurringTaskEntryDN) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getRecurringTaskEntry", |
| | | String.valueOf(recurringTaskEntryDN)); |
| | | |
| | | |
| | | schedulerLock.lock(); |
| | |
| | | public boolean searchRecurringTasks(SearchOperation searchOperation) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "searchRecurringTasks", |
| | | String.valueOf(searchOperation)); |
| | | |
| | | SearchFilter filter = searchOperation.getFilter(); |
| | | |
| | |
| | | public Task entryToScheduledTask(Entry entry, Operation operation) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "entryToScheduledTask", |
| | | String.valueOf(entry)); |
| | | |
| | | |
| | | // Get the name of the class that implements the task logic. |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "entryToScheduledTask", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_LOAD_CLASS; |
| | | String message = getMessage(msgID, String.valueOf(taskClassName), |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "entryToScheduledTask", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_INSTANTIATE_CLASS_AS_TASK; |
| | | String message = getMessage(msgID, String.valueOf(taskClassName)); |
| | |
| | | } |
| | | catch (InitializationException ie) |
| | | { |
| | | assert debugException(CLASS_NAME, "entryToScheduledTask", ie); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, ie); |
| | | } |
| | | |
| | | int msgID = MSGID_TASKSCHED_CANNOT_INITIALIZE_INTERNAL; |
| | | String message = getMessage(msgID, String.valueOf(taskClassName), |
| | |
| | | public RecurringTask entryToRecurringTask(Entry entry) |
| | | throws DirectoryException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "entryToRecurringTask", |
| | | String.valueOf(entry)); |
| | | |
| | | return new RecurringTask(this, entry); |
| | | } |
| | |
| | | */ |
| | | public DN getComponentEntryDN() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getComponentEntryDN"); |
| | | |
| | | return taskBackend.getConfigEntryDN(); |
| | | } |
| | |
| | | */ |
| | | public String getClassName() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getClassName"); |
| | | |
| | | return CLASS_NAME; |
| | | } |
| | |
| | | */ |
| | | public LinkedHashMap<String,String> getAlerts() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getAlerts"); |
| | | |
| | | LinkedHashMap<String,String> alerts = new LinkedHashMap<String,String>(); |
| | | |