From 97050c54efee9d0cc89afb5fb61b9a1c67f73f6a Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Wed, 16 Nov 2016 19:28:22 +0000
Subject: [PATCH] OPENDJ-3460 Improve management of subordinate backend and naming contexts
---
opendj-server-legacy/src/main/java/org/opends/server/extensions/FIFOEntryCache.java | 108 ++---------------------------------------------------
1 files changed, 5 insertions(+), 103 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/extensions/FIFOEntryCache.java b/opendj-server-legacy/src/main/java/org/opends/server/extensions/FIFOEntryCache.java
index 12aeb51..d2200e9 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/extensions/FIFOEntryCache.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/extensions/FIFOEntryCache.java
@@ -39,10 +39,10 @@
import org.forgerock.opendj.config.server.ConfigurationChangeListener;
import org.forgerock.opendj.server.config.server.EntryCacheCfg;
import org.forgerock.opendj.server.config.server.FIFOEntryCacheCfg;
-import org.opends.server.api.LocalBackend;
import org.opends.server.api.EntryCache;
import org.opends.server.api.MonitorData;
import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.ServerContext;
import org.opends.server.types.CacheEntry;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
@@ -109,6 +109,8 @@
/** The maximum length of time to try to obtain a lock before giving up. */
private long lockTimeout = 2000;
+ private ServerContext serverContext;
+
/** Creates a new instance of this FIFO entry cache. */
public FIFOEntryCache()
{
@@ -117,9 +119,10 @@
}
@Override
- public void initializeEntryCache(FIFOEntryCacheCfg configuration)
+ public void initializeEntryCache(ServerContext serverContext, FIFOEntryCacheCfg configuration)
throws ConfigException, InitializationException
{
+ this.serverContext = serverContext;
registeredConfiguration = configuration;
configuration.addFIFOChangeListener (this);
@@ -596,107 +599,6 @@
}
@Override
- public void clearSubtree(DN baseDN)
- {
- // Determine which backend should be used for the provided base DN. If
- // there is none, then we don't need to do anything.
- LocalBackend<?> backend =
- DirectoryServer.getInstance().getServerContext().getBackendConfigManager().getLocalBackend(baseDN);
- if (backend == null)
- {
- return;
- }
-
- // Acquire a lock on the cache. We should not return until the cache has
- // been cleared, so we will block until we can obtain the lock.
- cacheWriteLock.lock();
-
- // At this point, it is absolutely critical that we always release the lock
- // before leaving this method, so do so in a finally block.
- try
- {
- clearSubtree(baseDN, backend);
- }
- catch (Exception e)
- {
- logger.traceException(e);
-
- // This shouldn't happen, but there's not much that we can do if it does.
- }
- finally
- {
- cacheWriteLock.unlock();
- }
- }
-
- /**
- * Clears all entries at or below the specified base DN that are associated
- * with the given backend. The caller must already hold the cache lock.
- *
- * @param baseDN The base DN below which all entries should be flushed.
- * @param backend The backend for which to remove the appropriate entries.
- */
- private void clearSubtree(DN baseDN, LocalBackend<?> backend)
- {
- // See if there are any entries for the provided backend in the cache. If
- // not, then return.
- Map<Long,CacheEntry> map = idMap.get(backend.getBackendID());
- if (map == null)
- {
- // No entries were in the cache for this backend, so we can return without
- // doing anything.
- return;
- }
-
- // Since the provided base DN could hold a subset of the information in the
- // specified backend, we will have to do this by iterating through all the
- // entries for that backend. Since this could take a while, we'll
- // periodically release and re-acquire the lock in case anyone else is
- // waiting on it so this doesn't become a stop-the-world event as far as the
- // cache is concerned.
- int entriesExamined = 0;
- Iterator<CacheEntry> iterator = map.values().iterator();
- while (iterator.hasNext())
- {
- CacheEntry e = iterator.next();
- DN entryDN = e.getEntry().getName();
- if (entryDN.isSubordinateOrEqualTo(baseDN))
- {
- iterator.remove();
- dnMap.remove(entryDN);
- }
-
- entriesExamined++;
- if ((entriesExamined % 1000) == 0)
- {
- cacheWriteLock.unlock();
- Thread.yield();
- cacheWriteLock.lock();
- }
- }
-
- // See if the backend has any subordinate backends. If so, then process
- // them recursively.
- for (LocalBackend<?> subBackend : backend.getSubordinateBackends())
- {
- boolean isAppropriate = false;
- for (DN subBase : subBackend.getBaseDNs())
- {
- if (subBase.isSubordinateOrEqualTo(baseDN))
- {
- isAppropriate = true;
- break;
- }
- }
-
- if (isAppropriate)
- {
- clearSubtree(baseDN, subBackend);
- }
- }
- }
-
- @Override
public void handleLowMemory()
{
// Grab the lock on the cache and wait until we have it.
--
Gitblit v1.10.0