opends/src/server/org/opends/server/api/EntryCache.java
@@ -23,6 +23,7 @@ * * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions copyright 2013 ForgeRock AS. */ package org.opends.server.api; import org.opends.messages.Message; @@ -33,15 +34,12 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.atomic.AtomicLong; import org.opends.server.config.ConfigException; import org.opends.server.types.DN; import org.opends.server.types.Entry; import org.opends.server.types.InitializationException; import org.opends.server.types.LockType; import org.opends.server.types.LockManager; import org.opends.server.types.SearchFilter; import org.opends.server.types.DebugLogLevel; import org.opends.server.admin.std.server.EntryCacheCfg; @@ -101,10 +99,6 @@ private Set<SearchFilter> includeFilters = new HashSet<SearchFilter>(0); // The maximum length of time to try to obtain a lock before giving // up. private long lockTimeout = LockManager.DEFAULT_TIMEOUT; /** * Arbitrary number of cache hits for monitoring. */ @@ -210,13 +204,9 @@ /** * Retrieves the entry with the specified DN from the cache. The * caller should have already acquired a read or write lock for the * entry if such protection is needed. * Note that this method is called from @see #getEntry(DN entryDN, * LockType lockType, List lockList) * Retrieves the entry with the specified DN from the cache. * * @param entryDN The DN of the entry to retrieve. * @param entryDN The DN of the entry to retrieve. * * @return The requested entry if it is present in the cache, or * {@code null} if it is not present. @@ -226,192 +216,28 @@ /** * Retrieves the entry with the specified DN from the cache, * obtaining a lock on the entry before it is returned. If the * entry is present in the cache, then a lock will be obtained for * that entry and appended to the provided list before the entry is * returned. If the entry is not present, then no lock will be * obtained. Note that although this method is declared non-final * it is not recommended for subclasses to implement this method. * * @param entryDN The DN of the entry to retrieve. * @param lockType The type of lock to obtain (it may be * {@code NONE}). * @param lockList The list to which the obtained lock will be * added (note that no lock will be added if the * lock type was {@code NONE}). * * @return The requested entry if it is present in the cache, or * {@code null} if it is not present. */ public Entry getEntry(DN entryDN, LockType lockType, List<Lock> lockList) { if (!containsEntry(entryDN)) { // Indicate cache miss. cacheMisses.getAndIncrement(); return null; } // Obtain a lock for the entry before actually retrieving the // entry itself thus preventing any stale entries being returned, // see Issue #1589 for more details. If an error occurs, then // make sure no lock is held and return null. Otherwise, return // the entry. switch (lockType) { case READ: // Try to obtain a read lock for the entry. Lock readLock = LockManager.lockRead(entryDN, lockTimeout); if (readLock == null) { // We couldn't get the lock, so we have to return null. return null; } else { try { lockList.add(readLock); // and load. Entry entry = getEntry(entryDN); if (entry == null) { lockList.remove(readLock); LockManager.unlock(entryDN, readLock); return null; } return entry; } catch (Exception e) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e); } // The attempt to add the lock to the list failed, // so we need to release the lock and return null. try { LockManager.unlock(entryDN, readLock); } catch (Exception e2) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e2); } } return null; } } case WRITE: // Try to obtain a write lock for the entry. Lock writeLock = LockManager.lockWrite(entryDN, lockTimeout); if (writeLock == null) { // We couldn't get the lock, so we have to return null. return null; } else { try { lockList.add(writeLock); // and load. Entry entry = getEntry(entryDN); if (entry == null) { lockList.remove(writeLock); LockManager.unlock(entryDN, writeLock); return null; } return entry; } catch (Exception e) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e); } // The attempt to add the lock to the list failed, // so we need to release the lock and return null. try { LockManager.unlock(entryDN, writeLock); } catch (Exception e2) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e2); } } return null; } } case NONE: // We don't need to obtain a lock, so just return the entry. Entry entry = getEntry(entryDN); if (entry == null) { return null; } return entry; default: // This is an unknown type of lock, so we'll return null. return null; } } /** * Retrieves the requested entry if it is present in the cache, * obtaining a lock on the entry before it is returned. If the * entry is present in the cache, then a lock will be obtained for * that entry and appended to the provided list before the entry is * returned. If the entry is not present, then no lock will be * obtained. Note that although this method is declared non-final * it is not recommended for subclasses to implement this method. * Retrieves the requested entry if it is present in the cache. * * @param backend The backend associated with the entry to * retrieve. * @param entryID The entry ID within the provided backend for * the specified entry. * @param lockType The type of lock to obtain (it may be * {@code NONE}). * @param lockList The list to which the obtained lock will be * added (note that no lock will be added if the * lock type was {@code NONE}). * * @return The requested entry if it is present in the cache, or * {@code null} if it is not present. */ public Entry getEntry(Backend backend, long entryID, LockType lockType, List<Lock> lockList) { public Entry getEntry(Backend backend, long entryID) { // Translate given backend/entryID pair to entryDN. DN entryDN = getEntryDN(backend, entryID); if (entryDN == null) { if (entryDN == null) { // Indicate cache miss. cacheMisses.getAndIncrement(); return null; } // Delegate to by DN lock and load method. return getEntry(entryDN, lockType, lockList); return getEntry(entryDN); } @@ -615,34 +441,6 @@ /** * Retrieves the maximum length of time in milliseconds to wait for * a lock before giving up. * * @return The maximum length of time in milliseconds to wait for a * lock before giving up. */ public long getLockTimeout() { return lockTimeout; } /** * Specifies the maximum length of time in milliseconds to wait for * a lock before giving up. * * @param lockTimeout The maximum length of time in milliseconds * to wait for a lock before giving up. */ public void setLockTimeout(long lockTimeout) { this.lockTimeout = lockTimeout; } /** * Retrieves the set of search filters that may be used to determine * whether an entry should be excluded from the cache. * @@ -789,4 +587,19 @@ return true; } /** * Return a verbose string representation of the current cache maps. This is * useful primary for debugging and diagnostic purposes such as in the entry * cache unit tests. * <p> * This method is invoked by unit tests for debugging. * * @return String verbose string representation of the current cache maps in * the following format: dn:id:backend one cache entry map * representation per line or <CODE>null</CODE> if all maps are empty. */ public abstract String toVerboseString(); } opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -1283,7 +1283,6 @@ DatabaseEntry data = new DatabaseEntry(); DatabaseEntry key = new DatabaseEntry(begin); List<Lock> lockList = new ArrayList<Lock>(1); int lookthroughCount = 0; int lookthroughLimit = @@ -1337,10 +1336,8 @@ Entry entry; Entry cacheEntry; // Try the entry cache first. Note no need to take a lock. lockList.clear(); cacheEntry = entryCache.getEntry(backend, entryID.longValue(), LockType.NONE, lockList); // Try the entry cache first. cacheEntry = entryCache.getEntry(backend, entryID.longValue()); if (cacheEntry == null) { @@ -1495,135 +1492,116 @@ // Iterate through the index candidates. if (continueSearch) { List<Lock> lockList = new ArrayList<Lock>(); Iterator<EntryID> iterator = entryIDList.iterator(begin); while (iterator.hasNext()) { EntryID id = iterator.next(); Entry entry; Entry cacheEntry; // Try the entry cache first. Note no need to take a lock. lockList.clear(); cacheEntry = entryCache.getEntry(backend, id.longValue(), LockType.NONE, lockList); // Release any entry lock whatever happens during this block. // (This is actually redundant since we did not take a lock). try // Try the entry cache first. Entry cacheEntry = entryCache.getEntry(backend, id.longValue()); if (cacheEntry == null) { if (cacheEntry == null) // Fetch the candidate entry from the database. try { // Fetch the candidate entry from the database. try { entry = id2entry.get(null, id, LockMode.DEFAULT); } catch (Exception e) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e); } continue; } entry = id2entry.get(null, id, LockMode.DEFAULT); } else catch (Exception e) { entry = cacheEntry; if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e); } continue; } } else { entry = cacheEntry; } // Process the candidate entry. if (entry != null) // Process the candidate entry. if (entry != null) { boolean isInScope = false; DN entryDN = entry.getDN(); if (candidatesAreInScope) { boolean isInScope = false; DN entryDN = entry.getDN(); if (candidatesAreInScope) isInScope = true; } else if (searchScope == SearchScope.SINGLE_LEVEL) { // Check if this entry is an immediate child. if ((entryDN.getNumComponents() == aBaseDN.getNumComponents() + 1) && entryDN.isDescendantOf(aBaseDN)) { isInScope = true; } else if (searchScope == SearchScope.SINGLE_LEVEL) } else if (searchScope == SearchScope.WHOLE_SUBTREE) { if (entryDN.isDescendantOf(aBaseDN)) { // Check if this entry is an immediate child. if ((entryDN.getNumComponents() == aBaseDN.getNumComponents() + 1) && entryDN.isDescendantOf(aBaseDN)) { isInScope = true; } isInScope = true; } else if (searchScope == SearchScope.WHOLE_SUBTREE) } else if (searchScope == SearchScope.SUBORDINATE_SUBTREE) { if ((entryDN.getNumComponents() > aBaseDN.getNumComponents()) && entryDN.isDescendantOf(aBaseDN)) { if (entryDN.isDescendantOf(aBaseDN)) { isInScope = true; } isInScope = true; } else if (searchScope == SearchScope.SUBORDINATE_SUBTREE) { if ((entryDN.getNumComponents() > aBaseDN.getNumComponents()) && entryDN.isDescendantOf(aBaseDN)) { isInScope = true; } } } // Put this entry in the cache if it did not come from the cache. if (cacheEntry == null) { // Put the entry in the cache making sure not to overwrite // a newer copy that may have been inserted since the time // we read the cache. entryCache.putEntryIfAbsent(entry, backend, id.longValue()); } // Put this entry in the cache if it did not come from the cache. if (cacheEntry == null) { // Put the entry in the cache making sure not to overwrite // a newer copy that may have been inserted since the time // we read the cache. entryCache.putEntryIfAbsent(entry, backend, id.longValue()); } // Filter the entry if it is in scope. if (isInScope) // Filter the entry if it is in scope. if (isInScope) { if (manageDsaIT || entry.getReferralURLs() == null) { if (manageDsaIT || entry.getReferralURLs() == null) if (searchOperation.getFilter().matchesEntry(entry)) { if (searchOperation.getFilter().matchesEntry(entry)) if (pageRequest != null && searchOperation.getEntriesSent() == pageRequest.getSize()) { if (pageRequest != null && searchOperation.getEntriesSent() == pageRequest.getSize()) { // The current page is full. // Set the cookie to remember where we were. byte[] cookieBytes = id.getDatabaseEntry().getData(); ByteString cookie = ByteString.wrap(cookieBytes); PagedResultsControl control; control = new PagedResultsControl(pageRequest.isCritical(), 0, cookie); searchOperation.getResponseControls().add(control); return; } // The current page is full. // Set the cookie to remember where we were. byte[] cookieBytes = id.getDatabaseEntry().getData(); ByteString cookie = ByteString.wrap(cookieBytes); PagedResultsControl control; control = new PagedResultsControl(pageRequest.isCritical(), 0, cookie); searchOperation.getResponseControls().add(control); return; } if (!searchOperation.returnEntry(entry, null)) { // We have been told to discontinue processing of the // search. This could be due to size limit exceeded or // operation cancelled. break; } if (!searchOperation.returnEntry(entry, null)) { // We have been told to discontinue processing of the // search. This could be due to size limit exceeded or // operation cancelled. break; } } } } } finally { // Release any entry lock acquired by the entry cache // (This is actually redundant since we did not take a lock). for (Lock lock : lockList) { lock.unlock(); } } searchOperation.checkIfCanceled(false); } searchOperation.checkIfCanceled(false); } // Before we return success from the search we must ensure the base entry opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
@@ -23,18 +23,17 @@ * * * Copyright 2008-2010 Sun Microsystems, Inc. * Portions Copyright 2011 ForgeRock AS * Portions Copyright 2011-2013 ForgeRock AS */ package org.opends.server.extensions; import java.lang.reflect.Method; import org.opends.messages.Message; import java.util.ArrayList; import java.util.List; import java.util.SortedMap; import java.util.concurrent.locks.Lock; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.std.server.EntryCacheCfg; @@ -50,7 +49,6 @@ import org.opends.server.types.DebugLogLevel; import org.opends.server.types.Entry; import org.opends.server.types.InitializationException; import org.opends.server.types.LockType; import org.opends.server.types.ResultCode; import static org.opends.server.loggers.debug.DebugLogger.*; @@ -110,7 +108,7 @@ @Override public void finalizeEntryCache() { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { entryCache.finalizeEntryCache(); } // ReInitialize cache order array. @@ -128,7 +126,7 @@ return false; } for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { if (entryCache.containsEntry(entryDN)) { return true; } @@ -142,52 +140,23 @@ * {@inheritDoc} */ @Override public Entry getEntry(DN entryDN, LockType lockType, List<Lock> lockList) public Entry getEntry(Backend backend, long entryID) { Entry entry = null; for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder) { entry = entryCache.getEntry(entryDN, lockType, lockList); if (entry != null) { break; for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder) { Entry entry = entryCache.getEntry(backend, entryID); if (entry != null) { return entry.duplicate(true); } } // Indicate global cache miss. if ((entry == null) && (cacheOrder.length != 0)) { if (cacheOrder.length != 0) { cacheMisses.getAndIncrement(); } return (entry != null ? entry.duplicate(true) : null); } /** * {@inheritDoc} */ @Override public Entry getEntry(Backend backend, long entryID, LockType lockType, List<Lock> lockList) { Entry entry = null; for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder) { entry = entryCache.getEntry(backend, entryID, lockType, lockList); if (entry != null) { break; } } // Indicate global cache miss. if ((entry == null) && (cacheOrder.length != 0)) { cacheMisses.getAndIncrement(); } return (entry != null ? entry.duplicate(true) : null); return null; } @@ -197,21 +166,21 @@ @Override public Entry getEntry(DN entryDN) { Entry entry = null; for (EntryCache entryCache : cacheOrder) { entry = entryCache.getEntry(entryDN); if (entry != null) { break; for (EntryCache<? extends EntryCacheCfg> entryCache : cacheOrder) { Entry entry = entryCache.getEntry(entryDN); if (entry != null) { return entry.duplicate(true); } } // Indicate global cache miss. if ((entry == null) && (cacheOrder.length != 0)) { if (cacheOrder.length != 0) { cacheMisses.getAndIncrement(); } return (entry != null ? entry.duplicate(true) : null); return null; } @@ -222,16 +191,15 @@ @Override public long getEntryID(DN entryDN) { long entryID = -1; for (EntryCache entryCache : cacheOrder) { entryID = entryCache.getEntryID(entryDN); if (entryID != -1) { break; for (EntryCache<?> entryCache : cacheOrder) { long entryID = entryCache.getEntryID(entryDN); if (entryID != -1) { return entryID; } } return entryID; return -1; } @@ -242,16 +210,15 @@ @Override public DN getEntryDN(Backend backend, long entryID) { DN entryDN = null; for (EntryCache entryCache : cacheOrder) { entryDN = entryCache.getEntryDN(backend, entryID); if (entryDN != null) { break; for (EntryCache<?> entryCache : cacheOrder) { DN entryDN = entryCache.getEntryDN(backend, entryID); if (entryDN != null) { return entryDN; } } return entryDN; return null; } @@ -262,7 +229,7 @@ @Override public void putEntry(Entry entry, Backend backend, long entryID) { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { // The first cache in the order which can take this entry // gets it. if (entryCache.filtersAllowCaching(entry)) { @@ -281,7 +248,7 @@ @Override public boolean putEntryIfAbsent(Entry entry, Backend backend, long entryID) { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { // The first cache in the order which can take this entry // gets it. if (entryCache.filtersAllowCaching(entry)) { @@ -301,7 +268,7 @@ @Override public void removeEntry(DN entryDN) { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { if (entryCache.containsEntry(entryDN)) { entryCache.removeEntry(entryDN); break; @@ -317,7 +284,7 @@ @Override public void clear() { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { entryCache.clear(); } } @@ -330,7 +297,7 @@ @Override public void clearBackend(Backend backend) { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { entryCache.clearBackend(backend); } } @@ -343,7 +310,7 @@ @Override public void clearSubtree(DN baseDN) { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { entryCache.clearSubtree(baseDN); } } @@ -356,7 +323,7 @@ @Override public void handleLowMemory() { for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { entryCache.handleLowMemory(); } } @@ -413,7 +380,7 @@ // implementations. Long currentEntryCacheCount = new Long(0); for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { // Get cache hits and counts from every active cache. entryCacheHits += entryCache.getCacheHits(); currentEntryCacheCount += entryCache.getCacheCount(); @@ -447,7 +414,7 @@ { Long cacheCount = new Long(0); for (EntryCache entryCache : cacheOrder) { for (EntryCache<?> entryCache : cacheOrder) { cacheCount += entryCache.getCacheCount(); } @@ -457,41 +424,20 @@ /** * Return a verbose string representation of the current cache maps. * This is useful primary for debugging and diagnostic purposes such * as in the entry cache unit tests. * @return String verbose string representation of the current cache * maps in the following format: dn:id:backend * one cache entry map representation per line * or <CODE>null</CODE> if all maps are empty. * {@inheritDoc} */ private String toVerboseString() public String toVerboseString() { StringBuilder sb = new StringBuilder(); for (EntryCache entryCache : cacheOrder) { final Method[] cacheMethods = entryCache.getClass().getDeclaredMethods(); for (int i = 0; i < cacheMethods.length; ++i) { if (cacheMethods[i].getName().equals("toVerboseString")) { cacheMethods[i].setAccessible(true); try { Object cacheVerboseString = cacheMethods[i].invoke(entryCache, (Object[]) null); if (cacheVerboseString != null) { sb.append((String) cacheVerboseString); } } catch (Exception e) { if (debugEnabled()) { TRACER.debugCaught(DebugLogLevel.ERROR, e); } } } for (EntryCache<?> entryCache : cacheOrder) { String s = entryCache.toVerboseString(); if (s != null) { sb.append(s); } } String verboseString = sb.toString(); return (verboseString.length() > 0 ? verboseString : null); } opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
@@ -23,7 +23,7 @@ * * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions Copyright 2011-2012 ForgeRock AS * Portions Copyright 2011-2013 ForgeRock AS */ package org.opends.server.extensions; @@ -53,6 +53,7 @@ import org.opends.server.types.DN; import org.opends.server.types.Entry; import org.opends.server.types.InitializationException; import org.opends.server.types.LockManager; import org.opends.server.types.SearchFilter; import org.opends.server.types.Attribute; import org.opends.server.util.ServerConstants; @@ -126,6 +127,10 @@ // Currently registered configuration object. private FIFOEntryCacheCfg registeredConfiguration; // The maximum length of time to try to obtain a lock before giving // up. private long lockTimeout = LockManager.DEFAULT_TIMEOUT; /** @@ -320,7 +325,7 @@ // Obtain a lock on the cache. If this fails, then don't do anything. try { if (!cacheWriteLock.tryLock(getLockTimeout(), TimeUnit.MILLISECONDS)) if (!cacheWriteLock.tryLock(lockTimeout, TimeUnit.MILLISECONDS)) { return; } @@ -450,7 +455,7 @@ // Obtain a lock on the cache. If this fails, then don't do anything. try { if (!cacheWriteLock.tryLock(getLockTimeout(), TimeUnit.MILLISECONDS)) if (!cacheWriteLock.tryLock(lockTimeout, TimeUnit.MILLISECONDS)) { // We can't rule out the possibility of a conflict, so return false. return false; @@ -1026,11 +1031,9 @@ { maxEntries = newMaxEntries; maxAllowedMemory = newMaxAllowedMemory; setLockTimeout(newLockTimeout); lockTimeout = newLockTimeout; setIncludeFilters(newIncludeFilters); setExcludeFilters(newExcludeFilters); registeredConfiguration = configuration; } @@ -1083,15 +1086,9 @@ /** * Return a verbose string representation of the current cache maps. * This is useful primary for debugging and diagnostic purposes such * as in the entry cache unit tests. * @return String verbose string representation of the current cache * maps in the following format: dn:id:backend * one cache entry map representation per line * or <CODE>null</CODE> if all maps are empty. * {@inheritDoc} */ private String toVerboseString() public String toVerboseString() { StringBuilder sb = new StringBuilder(); opends/src/server/org/opends/server/extensions/FileSystemEntryCache.java
@@ -23,7 +23,7 @@ * * * Copyright 2008 Sun Microsystems, Inc. * Portions Copyright 2011-2012 ForgeRock AS * Portions Copyright 2011-2013 ForgeRock AS */ package org.opends.server.extensions; @@ -169,7 +169,7 @@ // Class database, catalog and binding for serialization. private Database entryCacheClassDB; private StoredClassCatalog classCatalog; private EntryBinding entryCacheDataBinding; private EntryBinding<FileSystemEntryCacheIndex> entryCacheDataBinding; // JE naming constants. private static final String ENTRYCACHEDBNAME = "EntryCacheDB"; @@ -187,6 +187,10 @@ // Currently registered configuration object. private FileSystemEntryCacheCfg registeredConfiguration; // The maximum length of time to try to obtain a lock before giving // up. private long lockTimeout = LockManager.DEFAULT_TIMEOUT; /** * Creates a new instance of this entry cache. */ @@ -207,7 +211,6 @@ * {@inheritDoc} */ @Override @SuppressWarnings("unchecked") public void initializeEntryCache(FileSystemEntryCacheCfg configuration) throws ConfigException, InitializationException { @@ -304,9 +307,8 @@ classCatalog = new StoredClassCatalog(entryCacheClassDB); //This line causes an unchecked call error if the SuppressWarnings //annotation is removed at the beginning of this method. entryCacheDataBinding = new SerialBinding(classCatalog, FileSystemEntryCacheIndex.class); entryCacheDataBinding = new SerialBinding<FileSystemEntryCacheIndex>( classCatalog, FileSystemEntryCacheIndex.class); // Get the root configuration object. ServerManagementContext managementContext = @@ -336,9 +338,7 @@ if (OperationStatus.SUCCESS == entryCacheDB.get(null, indexKey, indexData, LockMode.DEFAULT)) { entryCacheIndex = (FileSystemEntryCacheIndex) entryCacheDataBinding.entryToObject(indexData); entryCacheIndex = entryCacheDataBinding.entryToObject(indexData); } else { throw new CacheIndexNotFoundException(); } @@ -434,7 +434,6 @@ * {@inheritDoc} */ @Override @SuppressWarnings("unchecked") public void finalizeEntryCache() { cacheWriteLock.lock(); @@ -590,17 +589,18 @@ */ @Override public DN getEntryDN(Backend backend, long entryID) { DN entryDN = null; cacheReadLock.lock(); try { // Get the map for the provided backend. If it isn't present, then // return null. Map map = entryCacheIndex.backendMap.get(backend.getBackendID()); if ( !(map == null) ) { Map<Long, String> map = entryCacheIndex.backendMap.get(backend .getBackendID()); if (map != null) { // Get the entry DN from the map by its ID. If it isn't present, // then return null. entryDN = DN.decode((String) map.get(entryID)); entryDN = DN.decode(map.get(entryID)); } } catch (Exception e) { // Ignore. @@ -706,7 +706,6 @@ * {@inheritDoc} */ @Override @SuppressWarnings("unchecked") public void clear() { cacheWriteLock.lock(); @@ -732,8 +731,8 @@ classCatalog = new StoredClassCatalog(entryCacheClassDB); //This line causes an unchecked call error if the SuppressWarnings //annotation is removed at the beginning of this method. entryCacheDataBinding = new SerialBinding(classCatalog, FileSystemEntryCacheIndex.class); entryCacheDataBinding = new SerialBinding<FileSystemEntryCacheIndex>( classCatalog, FileSystemEntryCacheIndex.class); } } catch (Exception e) { if (debugEnabled()) { @@ -1142,7 +1141,7 @@ ); // Iterate through native JE properties. try { Map paramsMap = EnvironmentParams.SUPPORTED_PARAMS; Map<String, ConfigParam> paramsMap = EnvironmentParams.SUPPORTED_PARAMS; // If this entry cache is disabled then there is no open JE // environment to check against, skip mutable check if so. if (configuration.isEnabled()) { @@ -1156,7 +1155,7 @@ if (st.countTokens() == 2) { String jePropertyName = st.nextToken(); String jePropertyValue = st.nextToken(); ConfigParam param = (ConfigParam) paramsMap.get(jePropertyName); ConfigParam param = paramsMap.get(jePropertyName); if (!param.isMutable()) { String oldValue = oldEnvConfig.getConfigParam(param.getName()); String newValue = jePropertyValue; @@ -1262,7 +1261,7 @@ encodeConfig = new EntryEncodeConfig(true, newCompactEncoding, newCompactEncoding); setLockTimeout(newLockTimeout); lockTimeout = newLockTimeout; setIncludeFilters(newIncludeFilters); setExcludeFilters(newExcludeFilters); @@ -1368,7 +1367,7 @@ ByteStringBuilder entryBytes) { try { // Obtain a lock on the cache. If this fails, then don't do anything. if (!cacheWriteLock.tryLock(getLockTimeout(), TimeUnit.MILLISECONDS)) { if (!cacheWriteLock.tryLock(lockTimeout, TimeUnit.MILLISECONDS)) { return false; } // See if the current fs space usage is within acceptable constraints. If @@ -1488,15 +1487,9 @@ } /** * Return a verbose string representation of the current cache maps. * This is useful primary for debugging and diagnostic purposes such * as in the entry cache unit tests. * @return String verbose string representation of the current cache * maps in the following format: dn:id:backend * one cache entry map representation per line * or <CODE>null</CODE> if all maps are empty. * {@inheritDoc} */ private String toVerboseString() public String toVerboseString() { StringBuilder sb = new StringBuilder(); @@ -1580,7 +1573,7 @@ * @return boolean {@code true} if the eldest entry should be removed * from the map; {@code false} if it should be retained. */ protected boolean removeEldestEntry(Map.Entry eldest) { protected boolean removeEldestEntry(Map.Entry<String, Long> eldest) { // Check if we hit the limit on max entries and if so remove // the eldest entry otherwise do nothing. if (entryCacheIndex.dnMap.size() > maxEntries.longValue()) { @@ -1588,8 +1581,8 @@ cacheWriteLock.lock(); try { // Remove the the eldest entry from supporting maps. String entryStringDN = (String) eldest.getKey(); long entryID = ((Long) eldest.getValue()).longValue(); String entryStringDN = eldest.getKey(); long entryID = eldest.getValue(); cacheEntryKey.setData(entryStringDN.getBytes("UTF-8")); Set<String> backendSet = entryCacheIndex.backendMap.keySet(); Iterator<String> backendIterator = backendSet.iterator(); @@ -1630,9 +1623,6 @@ private class CacheIndexNotFoundException extends OpenDsException { static final long serialVersionUID = 6444756053577853869L; public CacheIndexNotFoundException() {} public CacheIndexNotFoundException(Message message) { super(message); } } /** @@ -1643,9 +1633,6 @@ private class CacheIndexImpairedException extends OpenDsException { static final long serialVersionUID = -369455697709478407L; public CacheIndexImpairedException() {} public CacheIndexImpairedException(Message message) { super(message); } } } opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
@@ -23,7 +23,7 @@ * * * Copyright 2006-2009 Sun Microsystems, Inc. * Portions Copyright 2011 ForgeRock AS * Portions Copyright 2011-2013 ForgeRock AS */ package org.opends.server.extensions; @@ -55,11 +55,9 @@ import org.opends.server.types.DN; import org.opends.server.types.Entry; import org.opends.server.types.InitializationException; import org.opends.server.types.LockManager; import org.opends.server.types.SearchFilter; import org.opends.server.util.ServerConstants; import static org.opends.server.loggers.debug.DebugLogger.*; import static org.opends.messages.ExtensionMessages.*; @@ -116,7 +114,6 @@ setExcludeFilters(new HashSet<SearchFilter>()); setIncludeFilters(new HashSet<SearchFilter>()); setLockTimeout(LockManager.DEFAULT_TIMEOUT); referenceQueue = new ReferenceQueue<CacheEntry>(); } @@ -562,13 +559,11 @@ { // Local variables to read configuration. DN newConfigEntryDN; long newLockTimeout; HashSet<SearchFilter> newIncludeFilters = null; HashSet<SearchFilter> newExcludeFilters = null; // Read configuration. newConfigEntryDN = configuration.dn(); newLockTimeout = configuration.getLockTimeout(); // Get include and exclude filters. switch (errorHandler.getConfigPhase()) @@ -593,7 +588,6 @@ if (applyChanges && errorHandler.getIsAcceptable()) { setLockTimeout(newLockTimeout); setIncludeFilters(newIncludeFilters); setExcludeFilters(newExcludeFilters); @@ -710,15 +704,9 @@ /** * Return a verbose string representation of the current cache maps. * This is useful primary for debugging and diagnostic purposes such * as in the entry cache unit tests. * @return String verbose string representation of the current cache * maps in the following format: dn:id:backend * one cache entry map representation per line * or <CODE>null</CODE> if all maps are empty. * {@inheritDoc} */ private String toVerboseString() public String toVerboseString() { StringBuilder sb = new StringBuilder(); opends/src/server/org/opends/server/types/LockManager.java
@@ -23,6 +23,7 @@ * * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions copyright 2013 ForgeRock AS. */ package org.opends.server.types; @@ -182,7 +183,7 @@ * @return The read lock that was acquired, or {@code null} if it * was not possible to obtain a read lock for some reason. */ public static Lock tryLockRead(DN entryDN) private static Lock tryLockRead(DN entryDN) { ReentrantReadWriteLock entryLock = new ReentrantReadWriteLock(fair); @@ -297,7 +298,7 @@ * it was not possible to obtain a read lock for some * reason. */ public static Lock lockRead(DN entryDN, long timeout) private static Lock lockRead(DN entryDN, long timeout) { // First, try to get the lock without blocking. Lock readLock = tryLockRead(entryDN); @@ -396,7 +397,7 @@ * if it was not possible to obtain a write lock for some * reason. */ public static Lock tryLockWrite(DN entryDN) private static Lock tryLockWrite(DN entryDN) { ReentrantReadWriteLock entryLock = new ReentrantReadWriteLock(fair); @@ -508,7 +509,7 @@ * if it was not possible to obtain a read lock for some * reason. */ public static Lock lockWrite(DN entryDN, long timeout) private static Lock lockWrite(DN entryDN, long timeout) { // First, try to get the lock without blocking. Lock writeLock = tryLockWrite(entryDN); opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CommonEntryCacheTestCase.java
@@ -23,14 +23,13 @@ * * * Copyright 2008 Sun Microsystems, Inc. * Portions copyright 2013 ForgeRock AS. */ package org.opends.server.extensions; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.concurrent.locks.Lock; import org.opends.server.TestCaseUtils; import org.opends.server.api.Backend; @@ -38,7 +37,6 @@ import org.opends.server.core.DirectoryServer; import org.opends.server.types.DN; import org.opends.server.types.Entry; import org.opends.server.types.LockType; import org.opends.server.admin.std.server.EntryCacheCfg; import org.opends.server.util.ServerConstants; @@ -48,8 +46,9 @@ /** * A common set of test cases for all entry cache implementations. * @param <C> The type of entry cache configuration. */ public abstract class CommonEntryCacheTestCase public abstract class CommonEntryCacheTestCase<C extends EntryCacheCfg> extends ExtensionsTestCase { /** @@ -87,37 +86,14 @@ /** * Cache implementation instance. */ protected EntryCache cache; protected EntryCache<C> cache; /** * Entry cache configuration instance. */ protected EntryCacheCfg configuration; /** * Reflection of the toVerboseString implementation method. */ protected String toVerboseString() throws Exception { final Method[] cacheMethods = cache.getClass().getDeclaredMethods(); for (int i = 0; i < cacheMethods.length; ++i) { if (cacheMethods[i].getName().equals("toVerboseString")) { cacheMethods[i].setAccessible(true); Object verboseString = cacheMethods[i].invoke(cache, (Object[]) null); return (String) verboseString; } } return null; } protected C configuration; @@ -129,9 +105,9 @@ public void testContainsEntry() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -139,14 +115,14 @@ assertFalse(cache.containsEntry(testEntriesList.get(0).getDN()), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); cache.putEntry(testEntriesList.get(0), b, 1); assertTrue(cache.containsEntry(testEntriesList.get(0).getDN()), "Expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -163,9 +139,9 @@ public void testGetEntry1() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -173,14 +149,14 @@ assertNull(cache.getEntry(testEntriesList.get(0).getDN()), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); cache.putEntry(testEntriesList.get(0), b, 1); assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()), "Expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -194,30 +170,27 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testGetEntry2() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); assertNull(cache.getEntry(testEntriesList.get(0).getDN(), LockType.NONE, new ArrayList<Lock>()), assertNull(cache.getEntry(testEntriesList.get(0).getDN()), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); cache.putEntry(testEntriesList.get(0), b, 1); assertNotNull(cache.getEntry(testEntriesList.get(0).getDN(), LockType.NONE, new ArrayList<Lock>()), assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()), "Expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -231,28 +204,27 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testGetEntry3() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); assertNull(cache.getEntry(b, -1, LockType.NONE, new ArrayList<Lock>()), assertNull(cache.getEntry(b, -1), "Not expected to find entry id " + Integer.toString(-1) + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); cache.putEntry(testEntriesList.get(0), b, 1); assertNotNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()), assertNotNull(cache.getEntry(b, 1), "Expected to find entry id " + Integer.toString(1) + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -268,9 +240,9 @@ public void testGetEntryID() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -278,14 +250,14 @@ assertEquals(cache.getEntryID(testEntriesList.get(0).getDN()), -1, "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); cache.putEntry(testEntriesList.get(0), b, 1); assertEquals(cache.getEntryID(testEntriesList.get(0).getDN()), 1, "Expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -298,13 +270,12 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testPutEntry() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -314,12 +285,12 @@ assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()), "Expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNotNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()), assertNotNull(cache.getEntry(b, 1), "Expected to find entry id " + Integer.toString(-1) + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -332,13 +303,12 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testPutEntryIfAbsent() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -346,22 +316,22 @@ assertTrue(cache.putEntryIfAbsent(testEntriesList.get(0), b, 1), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertFalse(cache.putEntryIfAbsent(testEntriesList.get(0), b, 1), "Expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNotNull(cache.getEntry(testEntriesList.get(0).getDN()), "Expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNotNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()), assertNotNull(cache.getEntry(b, 1), "Expected to find entry id " + Integer.toString(-1) + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -374,13 +344,12 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testRemoveEntry() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -392,12 +361,12 @@ assertNull(cache.getEntry(testEntriesList.get(0).getDN()), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()), assertNull(cache.getEntry(b, 1), "Not expected to find entry id " + Integer.toString(-1) + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -410,13 +379,12 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testClear() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -428,12 +396,12 @@ assertNull(cache.getEntry(testEntriesList.get(0).getDN()), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()), assertNull(cache.getEntry(b, 1), "Not expected to find entry id " + Integer.toString(-1) + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -446,13 +414,12 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testClearBackend() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -463,20 +430,20 @@ cache.putEntry(testEntriesList.get(1), c, 1); cache.clearBackend(b); assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()), assertNull(cache.getEntry(b, 1), "Not expected to find entry id " + Integer.toString(1) + " on backend " + b.getBackendID() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); assertNull(cache.getEntry(testEntriesList.get(0).getDN()), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNotNull(cache.getEntry(c, 1, LockType.NONE, new ArrayList<Lock>()), assertNotNull(cache.getEntry(c, 1), "Expected to find entry id " + Integer.toString(1) + " on backend " + c.getBackendID() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -489,13 +456,12 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testClearSubtree() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -512,17 +478,17 @@ assertNull(cache.getEntry(testEntriesList.get(0).getDN()), "Not expected to find " + testEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNull(cache.getEntry(b, 1, LockType.NONE, new ArrayList<Lock>()), assertNull(cache.getEntry(b, 1), "Not expected to find entry id " + Integer.toString(-1) + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); assertNotNull(cache.getEntry(testEntry.getDN()), "Expected to find " + testEntry.getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); // Clear the cache so that other tests can start from scratch. cache.clear(); @@ -538,9 +504,9 @@ public void testHandleLowMemory() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); cache.handleLowMemory(); @@ -556,7 +522,6 @@ * * @throws Exception If an unexpected problem occurs. */ @SuppressWarnings("unchecked") public void testCacheConcurrency() throws Exception { @@ -568,7 +533,7 @@ cache.getEntry(testEntriesList.get(i).getDN()); cache.removeEntry(testEntriesList.get(i).getDN()); cache.putEntryIfAbsent(testEntriesList.get(i), b, i); cache.getEntry(b, i, LockType.NONE, new ArrayList<Lock>()); cache.getEntry(b, i); } } } opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/DefaultEntryCacheTestCase.java
@@ -23,7 +23,7 @@ * * * Copyright 2008 Sun Microsystems, Inc. * Portions copyright 2011 ForgeRock AS * Portions copyright 2011-2013 ForgeRock AS */ package org.opends.server.extensions; @@ -59,12 +59,12 @@ */ @Test(groups = "entrycache", sequential=true) public class DefaultEntryCacheTestCase extends CommonEntryCacheTestCase extends CommonEntryCacheTestCase<EntryCacheCfg> { // Entry cache implementations participating in this test. private EntryCache softRefCache = null; private EntryCache fifoCache = null; private EntryCache fsCache = null; private SoftReferenceEntryCache softRefCache = null; private FIFOEntryCache fifoCache = null; private FileSystemEntryCache fsCache = null; // ... and their configuration entries. Entry cacheSoftReferenceConfigEntry = null; @@ -113,7 +113,7 @@ "ds-cfg-include-filter: uid=test1*", "ds-cfg-exclude-filter: uid=test0*"); softRefCache.initializeEntryCache(AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), cacheSoftReferenceConfigEntry)); SoftReferenceEntryCacheCfgDefn.getInstance(), cacheSoftReferenceConfigEntry)); cacheOrderMap.put(1, softRefCache); fifoCache = new FIFOEntryCache(); @@ -130,7 +130,7 @@ "ds-cfg-include-filter: uid=test2*", "ds-cfg-exclude-filter: uid=test0*"); fifoCache.initializeEntryCache(AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), cacheFIFOConfigEntry)); FIFOEntryCacheCfgDefn.getInstance(), cacheFIFOConfigEntry)); cacheOrderMap.put(2, fifoCache); File cacheDirectory = TestCaseUtils.createTemporaryDirectory("opendj-test"); @@ -151,7 +151,7 @@ "ds-cfg-cache-directory: " + cacheDirectory.getAbsolutePath()); fsCache.initializeEntryCache(AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), cacheFSConfigEntry)); FileSystemEntryCacheCfgDefn.getInstance(), cacheFSConfigEntry)); cacheOrderMap.put(3, fsCache); // Plug all cache implementations into default entry cache. @@ -265,7 +265,7 @@ } // Finilize all entry cache implementations. for (EntryCache entryCache : cacheOrderMap.values()) { for (EntryCache<?> entryCache : cacheOrderMap.values()) { entryCache.finalizeEntryCache(); } @@ -445,9 +445,9 @@ public void testCacheLevels() throws Exception { assertNull(toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + toVerboseString()); cache.toVerboseString()); TestCaseUtils.initializeTestBackend(false); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -466,19 +466,19 @@ "Expected to find " + testSoftRefEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); assertNotNull(super.cache.getEntry( testFIFOEntriesList.get(0).getDN()), "Expected to find " + testFIFOEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); assertNotNull(super.cache.getEntry( testFSEntriesList.get(0).getDN()), "Expected to find " + testFSEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); } // Ensure all test entries landed on their levels. @@ -488,19 +488,19 @@ "Expected to find " + testSoftRefEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); assertNotNull(fifoCache.getEntry( testFIFOEntriesList.get(0).getDN()), "Expected to find " + testFIFOEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); assertNotNull(fsCache.getEntry( testFSEntriesList.get(0).getDN()), "Expected to find " + testFSEntriesList.get(0).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + toVerboseString()); ServerConstants.EOL + cache.toVerboseString()); } // Clear the cache so that other tests can start from scratch. @@ -513,9 +513,9 @@ public void cacheConcurrencySetup() throws Exception { assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FIFOEntryCacheTestCase.java
@@ -23,6 +23,7 @@ * * * Copyright 2008 Sun Microsystems, Inc. * Portions copyright 2013 ForgeRock AS. */ package org.opends.server.extensions; @@ -33,6 +34,7 @@ import org.opends.server.admin.server.AdminTestCaseUtils; import org.testng.annotations.BeforeClass; import org.opends.server.admin.std.meta.*; import org.opends.server.admin.std.server.FIFOEntryCacheCfg; import org.opends.server.api.Backend; import org.opends.server.core.DirectoryServer; import org.opends.server.types.DN; @@ -51,7 +53,7 @@ */ @Test(groups = "entrycache", sequential=true) public class FIFOEntryCacheTestCase extends CommonEntryCacheTestCase extends CommonEntryCacheTestCase<FIFOEntryCacheCfg> { /** * Initialize the entry cache test. @@ -59,7 +61,6 @@ * @throws Exception If an unexpected problem occurs. */ @BeforeClass() @SuppressWarnings("unchecked") public void entryCacheTestInit() throws Exception { @@ -78,7 +79,7 @@ "ds-cfg-enabled: true", "ds-cfg-max-entries: " + Integer.toString(super.MAXENTRIES)); super.configuration = AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), cacheConfigEntry); FIFOEntryCacheCfgDefn.getInstance(), cacheConfigEntry); // Force GC to make sure we have enough memory for // the cache capping constraints to work properly. @@ -289,9 +290,9 @@ public void testHandleLowMemory() throws Exception { assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -308,7 +309,7 @@ super.testEntriesList.get(i).getDN()), "Not expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Clear the cache so that other tests can start from scratch. @@ -321,9 +322,9 @@ public void cacheConcurrencySetup() throws Exception { assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } @@ -361,9 +362,9 @@ public void testCacheRotation() throws Exception { assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -377,7 +378,7 @@ super.testEntriesList.get(i).getDN()), "Not expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Make sure remaining NUMTESTENTRIES are still in the cache. @@ -389,7 +390,7 @@ super.testEntriesList.get(i).getDN()), "Expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Clear the cache so that other tests can start from scratch. opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/FileSystemEntryCacheTestCase.java
@@ -23,7 +23,7 @@ * * * Copyright 2007-2008 Sun Microsystems, Inc. * Portions copyright 2011 ForgeRock AS * Portions copyright 2011-2013 ForgeRock AS */ package org.opends.server.extensions; @@ -56,7 +56,7 @@ */ @Test(groups = "entrycache", sequential=true) public class FileSystemEntryCacheTestCase extends CommonEntryCacheTestCase extends CommonEntryCacheTestCase<FileSystemEntryCacheCfg> { /** * Configuration entry for this cache. @@ -71,7 +71,6 @@ /** * Utility method to restore default cache configuration. */ @SuppressWarnings("unchecked") private void restoreCacheDefaults() throws Exception { @@ -80,16 +79,16 @@ // Configure this cache back to defaults. super.configuration = AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), cacheConfigEntry); FileSystemEntryCacheCfgDefn.getInstance(), cacheConfigEntry); // Initialize the cache. super.cache = new FileSystemEntryCache(); super.cache.initializeEntryCache(configuration); // Make sure the cache is empty. assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } @@ -97,7 +96,6 @@ /** * Utility method to configure the cache with LRU access order. */ @SuppressWarnings("unchecked") private void setupLRUCache() throws Exception { @@ -110,16 +108,16 @@ Attributes.create("ds-cfg-cache-type", "LRU"); newCacheConfigEntry.addAttribute(cacheConfigTypeAttr, null); super.configuration = AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), newCacheConfigEntry); FileSystemEntryCacheCfgDefn.getInstance(), newCacheConfigEntry); // Initialize the cache. super.cache = new FileSystemEntryCache(); super.cache.initializeEntryCache(configuration); // Make sure the cache is empty. assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } @@ -127,7 +125,6 @@ /** * Utility method to initialize persistent cache. */ @SuppressWarnings("unchecked") private void persistentCacheSetup() throws Exception { @@ -154,16 +151,16 @@ Attributes.create("ds-cfg-max-entries", Integer.toString(super.MAXENTRIES)); newCacheConfigEntry.removeAttribute(cacheConfigMaxAttr, null); super.configuration = AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), newCacheConfigEntry); FileSystemEntryCacheCfgDefn.getInstance(), newCacheConfigEntry); // Initialize the cache. super.cache = new FileSystemEntryCache(); super.cache.initializeEntryCache(configuration); // Make sure the cache is empty. assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } @@ -190,7 +187,6 @@ * @throws Exception If an unexpected problem occurs. */ @BeforeClass @SuppressWarnings("unchecked") public void entryCacheTestInit() throws Exception { @@ -212,7 +208,7 @@ "ds-cfg-max-entries: " + Integer.toString(super.MAXENTRIES), "ds-cfg-cache-directory: " + cacheDirectory.getAbsolutePath()); super.configuration = AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), cacheConfigEntry); FileSystemEntryCacheCfgDefn.getInstance(), cacheConfigEntry); // Force GC to make sure we have enough memory for // the cache capping constraints to work properly. @@ -270,8 +266,7 @@ super.cache.finalizeEntryCache(); // Remove default FS cache JE environment. FileSystemEntryCacheCfg config = (FileSystemEntryCacheCfg) super.configuration; FileSystemEntryCacheCfg config = super.configuration; TestCaseUtils.deleteDirectory(new File(config.getCacheDirectory())); } @@ -437,9 +432,9 @@ public void cacheConcurrencySetup() throws Exception { assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } @@ -518,9 +513,9 @@ public void testCacheRotationFIFO() throws Exception { assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); // Put some test entries in the cache. Backend b = DirectoryServer.getBackend(DN.decode("o=test")); @@ -534,7 +529,7 @@ super.testEntriesList.get(i).getDN()), "Not expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Make sure remaining NUMTESTENTRIES are still in the cache. @@ -546,7 +541,7 @@ super.testEntriesList.get(i).getDN()), "Expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Clear the cache so that other tests can start from scratch. @@ -559,7 +554,6 @@ * Tests LRU cache rotation on specific number of entries. */ @Test(groups = "slow") @SuppressWarnings("unchecked") public void testCacheRotationLRU() throws Exception { @@ -584,7 +578,7 @@ "Expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Plus the last cache entry added. @@ -593,7 +587,7 @@ "Expected to find " + super.testEntriesList.get(super.NUMTESTENTRIES - 1).getDN().toString() + " in the cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); // And remaining NUMTESTENTRIES - 1 are now rotated. for(int i = (super.MAXENTRIES - 1); @@ -604,7 +598,7 @@ "Not expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Clear the cache so that other tests can start from scratch. @@ -620,7 +614,6 @@ * Tests cache persistence with consistent backend. */ @Test(groups = "slow") @SuppressWarnings("unchecked") public void testCachePersistence() throws Exception { @@ -653,7 +646,7 @@ "Expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Clear the cache so that other tests can start from scratch. @@ -673,7 +666,6 @@ * Tests cache persistence with inconsistent backend. */ @Test(groups = "slow") @SuppressWarnings("unchecked") public void testCachePersistenceInconsistent() throws Exception { @@ -719,7 +711,7 @@ "Not expected to find " + super.testEntriesList.get(i).getDN().toString() + " in the " + "cache. Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); } // Clear the cache so that other tests can start from scratch. opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/SoftReferenceEntryCacheTestCase.java
@@ -23,6 +23,7 @@ * * * Copyright 2008 Sun Microsystems, Inc. * Portions copyright 2013 ForgeRock AS. */ package org.opends.server.extensions; @@ -33,6 +34,7 @@ import org.opends.server.admin.server.AdminTestCaseUtils; import org.testng.annotations.BeforeClass; import org.opends.server.admin.std.meta.*; import org.opends.server.admin.std.server.SoftReferenceEntryCacheCfg; import org.opends.server.types.Entry; import org.opends.server.util.ServerConstants; import org.testng.annotations.AfterClass; @@ -48,7 +50,7 @@ */ @Test(groups = "entrycache", sequential=true) public class SoftReferenceEntryCacheTestCase extends CommonEntryCacheTestCase extends CommonEntryCacheTestCase<SoftReferenceEntryCacheCfg> { /** * Initialize the entry cache test. @@ -56,7 +58,6 @@ * @throws Exception If an unexpected problem occurs. */ @BeforeClass() @SuppressWarnings("unchecked") public void entryCacheTestInit() throws Exception { @@ -75,7 +76,7 @@ "org.opends.server.extensions.SoftReferenceEntryCache", "ds-cfg-enabled: true"); super.configuration = AdminTestCaseUtils.getConfiguration( EntryCacheCfgDefn.getInstance(), cacheConfigEntry); SoftReferenceEntryCacheCfgDefn.getInstance(), cacheConfigEntry); // Force GC to make sure we have enough memory for // the cache capping constraints to work properly. @@ -295,9 +296,9 @@ public void cacheConcurrencySetup() throws Exception { assertNull(super.toVerboseString(), assertNull(cache.toVerboseString(), "Expected empty cache. " + "Cache contents:" + ServerConstants.EOL + super.toVerboseString()); cache.toVerboseString()); }