From 4698e4fa18f652019b8f06fef1b2b8813446f5e0 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.
---
opends/src/server/org/opends/server/backends/task/TaskBackend.java | 75 +++++++++++++++++++++++--------------
1 files changed, 47 insertions(+), 28 deletions(-)
diff --git a/opends/src/server/org/opends/server/backends/task/TaskBackend.java b/opends/src/server/org/opends/server/backends/task/TaskBackend.java
index beed09f6..b6f90b1 100644
--- a/opends/src/server/org/opends/server/backends/task/TaskBackend.java
+++ b/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