opends/src/server/org/opends/server/api/EntryCache.java
@@ -526,19 +526,6 @@ /** * 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. */ public abstract String toVerboseString(); /** * Retrieves the maximum length of time in milliseconds to wait for * a lock before giving up. * opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
@@ -210,17 +210,6 @@ /** * {@inheritDoc} */ public String toVerboseString() { // This implementation does not store entries. return null; } /** * {@inheritDoc} */ public boolean isConfigurationChangeAcceptable( EntryCacheCfg configuration, List<Message> unacceptableReasons opends/src/server/org/opends/server/extensions/FIFOEntryCache.java
@@ -57,6 +57,7 @@ import org.opends.server.types.InitializationException; import org.opends.server.types.ResultCode; 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.*; @@ -865,59 +866,6 @@ /** * {@inheritDoc} */ public String toVerboseString() { String verboseString = new String(); Map<DN,CacheEntry> dnMapCopy; Map<Backend,HashMap<Long,CacheEntry>> idMapCopy; // Grab cache lock to prevent any modifications // to the cache maps until a snapshot is taken. cacheLock.lock(); try { // Examining the real maps will hold the lock and can cause map // modifications in case of any access order maps, make copies // instead. dnMapCopy = new LinkedHashMap<DN,CacheEntry>(dnMap); idMapCopy = new HashMap<Backend,HashMap<Long,CacheEntry>>(idMap); } finally { cacheLock.unlock(); } // Check dnMap first. for(DN dn : dnMapCopy.keySet()) { verboseString = verboseString + dn.toString() + ":" + (dnMapCopy.get(dn) != null ? Long.toString(dnMapCopy.get(dn).getEntryID()) : null) + ":" + (dnMapCopy.get(dn) != null ? dnMapCopy.get(dn).getBackend().getBackendID() : null) + "\n"; } // See if there is anything on idMap that isnt reflected on // dnMap in case maps went out of sync. for (Backend backend : idMapCopy.keySet()) { for (Long id : idMapCopy.get(backend).keySet()) { if ((idMapCopy.get(backend).get(id) == null) || !dnMapCopy.containsKey( idMapCopy.get(backend).get(id).getDN())) { verboseString = verboseString + (idMapCopy.get(backend).get(id) != null ? idMapCopy.get(backend).get(id).getDN().toString() : null) + ":" + id.toString() + ":" + backend.getBackendID() + "\n"; } } } return (verboseString.length() > 0 ? verboseString : null); } /** * {@inheritDoc} */ @Override() public boolean isConfigurationAcceptable(EntryCacheCfg configuration, List<Message> unacceptableReasons) @@ -1144,5 +1092,72 @@ return errorHandler.getIsAcceptable(); } /** * 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. */ private String toVerboseString() { String verboseString = new String(); StringBuilder sb = new StringBuilder(); Map<DN,CacheEntry> dnMapCopy; Map<Backend,HashMap<Long,CacheEntry>> idMapCopy; // Grab cache lock to prevent any modifications // to the cache maps until a snapshot is taken. cacheLock.lock(); try { // Examining the real maps will hold the lock and can cause map // modifications in case of any access order maps, make copies // instead. dnMapCopy = new LinkedHashMap<DN,CacheEntry>(dnMap); idMapCopy = new HashMap<Backend,HashMap<Long,CacheEntry>>(idMap); } finally { cacheLock.unlock(); } // Check dnMap first. for (DN dn : dnMapCopy.keySet()) { sb.append(dn.toString()); sb.append(":"); sb.append((dnMapCopy.get(dn) != null ? Long.toString(dnMapCopy.get(dn).getEntryID()) : null)); sb.append(":"); sb.append((dnMapCopy.get(dn) != null ? dnMapCopy.get(dn).getBackend().getBackendID() : null)); sb.append(ServerConstants.EOL); } // See if there is anything on idMap that isnt reflected on // dnMap in case maps went out of sync. for (Backend backend : idMapCopy.keySet()) { for (Long id : idMapCopy.get(backend).keySet()) { if ((idMapCopy.get(backend).get(id) == null) || !dnMapCopy.containsKey( idMapCopy.get(backend).get(id).getDN())) { sb.append((idMapCopy.get(backend).get(id) != null ? idMapCopy.get(backend).get(id).getDN().toString() : null)); sb.append(":"); sb.append(id.toString()); sb.append(":"); sb.append(backend.getBackendID()); sb.append(ServerConstants.EOL); } } } verboseString = sb.toString(); return (verboseString.length() > 0 ? verboseString : null); } } opends/src/server/org/opends/server/extensions/FileSystemEntryCache.java
@@ -74,6 +74,7 @@ import org.opends.server.types.DebugLogLevel; import org.opends.server.types.OpenDsException; import org.opends.server.loggers.debug.DebugTracer; import org.opends.server.util.ServerConstants; import static org.opends.server.loggers.debug.DebugLogger.*; import static org.opends.server.loggers.ErrorLogger.logError; import static org.opends.server.config.ConfigConstants.*; @@ -1022,64 +1023,6 @@ /** * {@inheritDoc} */ public String toVerboseString() { String verboseString = new String(); Map<DN,Long> dnMapCopy; Map<Backend,Map<Long,DN>> backendMapCopy; // Grab write lock to prevent any modifications // to the cache maps until a snapshot is taken. cacheWriteLock.lock(); try { // Examining the real maps will hold the lock // and can cause map modifications in case of // any access order maps, make copies instead. dnMapCopy = new LinkedHashMap<DN,Long>(dnMap); backendMapCopy = new LinkedHashMap<Backend,Map<Long,DN>> (backendMap); } finally { cacheWriteLock.unlock(); } // Check dnMap first. for (DN dn : dnMapCopy.keySet()) { Backend backend = null; Iterator<Backend> backendIterator = backendMapCopy.keySet().iterator(); while (backendIterator.hasNext()) { backend = backendIterator.next(); Map<Long, DN> map = backendMapCopy.get(backend); if ((map.get(dnMapCopy.get(dn)) != null) && (map.get(dnMapCopy.get(dn)).equals(dn))) { break; } } } // See if there is anything on backendMap that isnt reflected on dnMap // in case maps went out of sync. Backend backend = null; Iterator<Backend> backendIterator = backendMapCopy.keySet().iterator(); while (backendIterator.hasNext()) { backend = backendIterator.next(); Map<Long, DN> map = backendMapCopy.get(backend); for (Long id : map.keySet()) { if (!dnMapCopy.containsKey(map.get(id)) || map.get(id) == null) { verboseString = verboseString + (map.get(id) != null ? map.get(id) : null) + ":" + id.toString() + ":" + backend.getBackendID() + "\n"; } } } return (verboseString.length() > 0 ? verboseString : null); } /** * {@inheritDoc} */ @Override() public boolean isConfigurationAcceptable(EntryCacheCfg configuration, List<Message> unacceptableReasons) @@ -1553,6 +1496,86 @@ } } /** * 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. */ private String toVerboseString() { String verboseString = new String(); StringBuilder sb = new StringBuilder(); Map<DN,Long> dnMapCopy; Map<Backend,Map<Long,DN>> backendMapCopy; // Grab write lock to prevent any modifications // to the cache maps until a snapshot is taken. cacheWriteLock.lock(); try { // Examining the real maps will hold the lock // and can cause map modifications in case of // any access order maps, make copies instead. dnMapCopy = new LinkedHashMap<DN,Long>(dnMap); backendMapCopy = new LinkedHashMap<Backend,Map<Long,DN>> (backendMap); } finally { cacheWriteLock.unlock(); } // Check dnMap first. for (DN dn : dnMapCopy.keySet()) { sb.append(dn.toString()); sb.append(":"); sb.append((dnMapCopy.get(dn) != null ? dnMapCopy.get(dn).toString() : null)); sb.append(":"); Backend backend = null; String backendID = null; Iterator<Backend> backendIterator = backendMapCopy.keySet().iterator(); while (backendIterator.hasNext()) { backend = backendIterator.next(); Map<Long, DN> map = backendMapCopy.get(backend); if ((map != null) && (map.get(dnMapCopy.get(dn)) != null) && (map.get(dnMapCopy.get(dn)).equals(dn))) { backendID = backend.getBackendID(); break; } } sb.append(backendID); sb.append(ServerConstants.EOL); } // See if there is anything on backendMap that isnt reflected on dnMap // in case maps went out of sync. Backend backend = null; Iterator<Backend> backendIterator = backendMapCopy.keySet().iterator(); while (backendIterator.hasNext()) { backend = backendIterator.next(); Map<Long, DN> map = backendMapCopy.get(backend); for (Long id : map.keySet()) { if (!dnMapCopy.containsKey(map.get(id)) || map.get(id) == null) { sb.append((map.get(id) != null ? map.get(id) : null)); sb.append(":"); sb.append(id.toString()); sb.append(":"); sb.append(backend.getBackendID()); sb.append(ServerConstants.EOL); } } } verboseString = sb.toString(); return (verboseString.length() > 0 ? verboseString : null); } /** * This inner class exist solely to override <CODE>removeEldestEntry()</CODE> * method of the LinkedHashMap. opends/src/server/org/opends/server/extensions/SoftReferenceEntryCache.java
@@ -53,6 +53,7 @@ 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.*; @@ -448,28 +449,6 @@ /** * {@inheritDoc} */ public String toVerboseString() { String verboseString = new String(); // There're no locks in this cache to keep dnMap and idMap in // sync. Examine dnMap only since its more likely to be up to // date than idMap. Dont bother with copies either since this // is SoftReference based implementation. for(SoftReference<CacheEntry> ce : dnMap.values()) { verboseString = verboseString + ce.get().getDN().toString() + ":" + Long.toString(ce.get().getEntryID()) + ":" + ce.get().getBackend().getBackendID() + "\n"; } return (verboseString.length() > 0 ? verboseString : null); } /** * {@inheritDoc} */ @Override() public boolean isConfigurationAcceptable(EntryCacheCfg configuration, List<Message> unacceptableReasons) @@ -669,5 +648,39 @@ } } } /** * 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. */ private String toVerboseString() { String verboseString = new String(); StringBuilder sb = new StringBuilder(); // There're no locks in this cache to keep dnMap and idMap in // sync. Examine dnMap only since its more likely to be up to // date than idMap. Dont bother with copies either since this // is SoftReference based implementation. for(SoftReference<CacheEntry> ce : dnMap.values()) { sb.append(ce.get().getDN().toString()); sb.append(":"); sb.append(Long.toString(ce.get().getEntryID())); sb.append(":"); sb.append(ce.get().getBackend().getBackendID()); sb.append(ServerConstants.EOL); } verboseString = sb.toString(); return (verboseString.length() > 0 ? verboseString : null); } }