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