From 22f742fe200dbd0298a4ed36df13fd394ebfa316 Mon Sep 17 00:00:00 2001
From: abobrov <abobrov@localhost>
Date: Tue, 18 Mar 2008 11:22:47 +0000
Subject: [PATCH] - cut down on in heap memory usage by aggregating cache maps into the common index and use String objects in place of DN objects.
---
opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCacheIndex.java | 102 +++++++++++++++++++++++++++++++++++++++------------
1 files changed, 78 insertions(+), 24 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCacheIndex.java b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCacheIndex.java
index 603e78f..c659fd5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCacheIndex.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/extensions/FileSystemEntryCacheIndex.java
@@ -29,6 +29,7 @@
import java.io.Serializable;
import java.util.Map;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.concurrent.ConcurrentHashMap;
@@ -39,35 +40,88 @@
* however due to serialization constraints it has been separated.
*/
class FileSystemEntryCacheIndex implements Serializable {
- static final long serialVersionUID = 4537634108673038611L;
+
+ static final long serialVersionUID = 4537634108673038611L;
+
+ /**
+ * The file system entry cache instance this index belongs to.
+ */
+ transient private FileSystemEntryCache fsEntryCacheInstance;
+
+ /**
+ * Backend to checksum/id map for offline state.
+ */
+ public Map<String, Long> offlineState;
+ /**
+ * The mapping between backends and ID to DN maps.
+ */
+ public Map<String, Map<Long, String>> backendMap;
+ /**
+ * The mapping between DNs and IDs.
+ */
+ public Map<String, Long> dnMap;
+
+ /**
+ * Index constructor.
+ * @param fsEntryCacheInstance The File System Entry Cache instance
+ * this index is associated with.
+ * @param accessOrder The ordering mode for the index map
+ * {@code true} for access-order,
+ * {@code false} for insertion-order.
+ */
+ protected FileSystemEntryCacheIndex(
+ FileSystemEntryCache fsEntryCacheInstance, boolean accessOrder) {
+
+ this.fsEntryCacheInstance = fsEntryCacheInstance;
+
+ offlineState =
+ new ConcurrentHashMap<String, Long>();
+ backendMap =
+ new HashMap<String, Map<Long, String>>();
+ dnMap =
+ new LinkedHashMapRotator<String,Long>(
+ 16, (float) 0.75, accessOrder);
+ }
+
+ /**
+ * This inner class exist solely to override <CODE>removeEldestEntry()</CODE>
+ * method of the LinkedHashMap.
+ *
+ * @see java.util.LinkedHashMap
+ */
+ private class LinkedHashMapRotator<K,V> extends LinkedHashMap<K,V> {
+
+ static final long serialVersionUID = 5271482121415968435L;
/**
- * Backend to Checksum/id map for offline state.
+ * Linked Hash Map Rotator constructor.
+ * @param initialCapacity The initial capacity.
+ * @param loadFactor The load factor.
+ * @param accessOrder The ordering mode - {@code true} for
+ * access-order, {@code false} for
+ * insertion-order.
*/
- public Map<String,Long> offlineState;
+ public LinkedHashMapRotator(int initialCapacity,
+ float loadFactor,
+ boolean accessOrder) {
+ super(initialCapacity, loadFactor, accessOrder);
+ }
/**
- * The mapping between entry backends/IDs and DNs.
+ * This method will get called each time we add a new key/value
+ * pair to the map. The eldest entry will be selected by the
+ * underlying LinkedHashMap implementation based on the access
+ * order configured and will follow either FIFO implementation
+ * by default or LRU implementation if configured so explicitly.
+ * @param eldest The least recently inserted entry in the map,
+ * or if this is an access-ordered map, the least
+ * recently accessed entry.
+ * @return boolean {@code true} if the eldest entry should be
+ * removed from the map; {@code false} if it
+ * should be retained.
*/
- public Map<String,Map<Long,String>> backendMap;
-
- /**
- * The mapping between DNs and IDs.
- */
- public Map<String,Long> dnMap;
-
- /**
- * Default constructor.
- */
- public FileSystemEntryCacheIndex() {
- offlineState =
- // <Backend,Long>
- new ConcurrentHashMap<String,Long>();
- backendMap =
- // <Backend,Map<Long,DN>>
- new LinkedHashMap<String,Map<Long,String>>();
- dnMap =
- // <DN,Long>
- new LinkedHashMap<String,Long>();
+ @Override protected boolean removeEldestEntry(Map.Entry eldest) {
+ return fsEntryCacheInstance.removeEldestEntry(eldest);
}
}
+}
--
Gitblit v1.10.0