From c50c2de771f32a0fb4bd530da59d64ad7ad0af4e Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Wed, 03 Jan 2007 16:12:10 +0000
Subject: [PATCH] Update the task backend to properly acquire read locks on task and recurring task entries when evaluating them during search operations, and to acquire write locks for the entries when they are being updated. This should eliminate the possibility of concurrent modification exceptions being thrown in cases where a client issues a search for a task entry at the same time the task entry is being updated within the server.
---
opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java | 75 +++++++++++++++++++++++--------------
1 files changed, 47 insertions(+), 28 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java
index beed09f6..b6f90b1 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/task/TaskBackend.java
@@ -34,6 +34,7 @@
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.concurrent.locks.Lock;
import org.opends.server.api.Backend;
import org.opends.server.api.ConfigurableComponent;
@@ -888,43 +889,61 @@
}
else if (parentDN.equals(scheduledTaskParentDN))
{
- Entry e = taskScheduler.getScheduledTaskEntry(baseDN);
- if (e == null)
- {
- int msgID = MSGID_TASKBE_SEARCH_NO_SUCH_TASK;
- String message = getMessage(msgID, String.valueOf(baseDN));
- throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message,
- msgID, scheduledTaskParentDN, null);
- }
+ Lock lock = taskScheduler.readLockEntry(baseDN);
- if (((searchScope == SearchScope.BASE_OBJECT) ||
- (searchScope == SearchScope.WHOLE_SUBTREE)) &&
- searchFilter.matchesEntry(e))
+ try
{
- searchOperation.returnEntry(e, null);
- }
+ Entry e = taskScheduler.getScheduledTaskEntry(baseDN);
+ if (e == null)
+ {
+ int msgID = MSGID_TASKBE_SEARCH_NO_SUCH_TASK;
+ String message = getMessage(msgID, String.valueOf(baseDN));
+ throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message,
+ msgID, scheduledTaskParentDN, null);
+ }
- return;
+ if (((searchScope == SearchScope.BASE_OBJECT) ||
+ (searchScope == SearchScope.WHOLE_SUBTREE)) &&
+ searchFilter.matchesEntry(e))
+ {
+ searchOperation.returnEntry(e, null);
+ }
+
+ return;
+ }
+ finally
+ {
+ taskScheduler.unlockEntry(baseDN, lock);
+ }
}
else if (parentDN.equals(recurringTaskParentDN))
{
- Entry e = taskScheduler.getRecurringTaskEntry(baseDN);
- if (e == null)
- {
- int msgID = MSGID_TASKBE_SEARCH_NO_SUCH_RECURRING_TASK;
- String message = getMessage(msgID, String.valueOf(baseDN));
- throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message,
- msgID, recurringTaskParentDN, null);
- }
+ Lock lock = taskScheduler.readLockEntry(baseDN);
- if (((searchScope == SearchScope.BASE_OBJECT) ||
- (searchScope == SearchScope.WHOLE_SUBTREE)) &&
- searchFilter.matchesEntry(e))
+ try
{
- searchOperation.returnEntry(e, null);
- }
+ Entry e = taskScheduler.getRecurringTaskEntry(baseDN);
+ if (e == null)
+ {
+ int msgID = MSGID_TASKBE_SEARCH_NO_SUCH_RECURRING_TASK;
+ String message = getMessage(msgID, String.valueOf(baseDN));
+ throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message,
+ msgID, recurringTaskParentDN, null);
+ }
- return;
+ if (((searchScope == SearchScope.BASE_OBJECT) ||
+ (searchScope == SearchScope.WHOLE_SUBTREE)) &&
+ searchFilter.matchesEntry(e))
+ {
+ searchOperation.returnEntry(e, null);
+ }
+
+ return;
+ }
+ finally
+ {
+ taskScheduler.unlockEntry(baseDN, lock);
+ }
}
else
{
--
Gitblit v1.10.0