You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2014/01/16 09:06:20 UTC

svn commit: r1558711 - in /stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking: FstLinkingEngineComponent.java cache/EntityCacheManager.java cache/FastLRUCacheManager.java

Author: rwesten
Date: Thu Jan 16 08:06:20 2014
New Revision: 1558711

URL: http://svn.apache.org/r1558711
Log:
fix for STANBOL-1258 for the 0.12 branch. This also greatly imrpoves DEBUG level logging for the EntityCache. The FST Linking engine will now show INFO level logging with the size of the EntityCache during activation

Modified:
    stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/FstLinkingEngineComponent.java
    stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/EntityCacheManager.java
    stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java

Modified: stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/FstLinkingEngineComponent.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/FstLinkingEngineComponent.java?rev=1558711&r1=1558710&r2=1558711&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/FstLinkingEngineComponent.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/FstLinkingEngineComponent.java Thu Jan 16 08:06:20 2014
@@ -476,12 +476,13 @@ public class FstLinkingEngineComponent {
         } else {
             ecSize = -1;
         }
-        if(ecSize < 0){
-            documentCacheFactory = new FastLRUCacheManager(DEFAULT_ENTITY_CACHE_SIZE);
-        } else if(ecSize == 0){
+        if(ecSize == 0){
+            log.info(" ... EntityCache deactivated");
             documentCacheFactory = null;
         } else {
-            documentCacheFactory = new FastLRUCacheManager(ecSize);
+            int size = ecSize < 0 ? DEFAULT_ENTITY_CACHE_SIZE : ecSize;
+        	log.info(" ... create EntityCache (size: {})",size);
+            documentCacheFactory = new FastLRUCacheManager(size);
         }
         
         //(7) parse the Entity type field
@@ -776,6 +777,10 @@ public class FstLinkingEngineComponent {
         engineMetadata = null;
         textProcessingConfig = null;
         entityLinkerConfig = null;
+        if(documentCacheFactory != null){
+        	documentCacheFactory.close(); //ensure that old caches are cleared
+        }
+        documentCacheFactory = null;
         bundleContext = null;
         skipAltTokensConfig = null;
     }

Modified: stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/EntityCacheManager.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/EntityCacheManager.java?rev=1558711&r1=1558710&r2=1558711&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/EntityCacheManager.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/EntityCacheManager.java Thu Jan 16 08:06:20 2014
@@ -49,4 +49,9 @@ public interface EntityCacheManager {
      */
     RefCounted<EntityCache> getCache(Object version);
 
+    /**
+     * Called if the EntityCacheManager is no longer used
+     */
+    void close();
+    
 }

Modified: stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java?rev=1558711&r1=1558710&r2=1558711&view=diff
==============================================================================
--- stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java (original)
+++ stanbol/branches/release-0.12/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java Thu Jan 16 08:06:20 2014
@@ -20,13 +20,13 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.lucene.document.Document;
 import org.apache.solr.search.CacheRegenerator;
 import org.apache.solr.search.FastLRUCache;
 import org.apache.solr.search.SolrCache;
 import org.apache.solr.util.RefCounted;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Implementation of the {@link EntityCacheManager} based on the Solr
@@ -37,6 +37,8 @@ import org.apache.solr.util.RefCounted;
  */
 public class FastLRUCacheManager implements EntityCacheManager {
 
+	private final Logger log = LoggerFactory.getLogger(getClass());
+	
     RefCounted<EntityCache> current;
     private final CacheRegenerator regenerator;
     private final Map<String,String> config;
@@ -75,21 +77,49 @@ public class FastLRUCacheManager impleme
     public RefCounted<EntityCache> getCache(Object version) {
         if(current == null || !current.get().getVersion().equals(version)){
             if(current != null){
-                //the the old one as outdated!
-                ((RefCountedImpl)current).setOutdated();
+            	log.debug(" > invalidate EntityCache for version {}", current.get().getVersion());
+            	//remove the reference to the old instance. This will allow to
+            	//destroy the old cache as soon as it is no longer used
+            	current.decref(); 
+            	log.debug("  ... {} remaining users for invalidated Cache", current.getRefcount());
+            	current = null;
             }
             //create a new cache
+            log.debug(" > create EntityCache for version {}", version);
             SolrCache<Integer,Document> cache = new FastLRUCache<Integer,Document>();
             cache.init(config, null, regenerator);
             current = new RefCountedImpl(new SolrEntityCache(version, cache));
-        }
-        current.incref();
+            //add a reference to the new cache by this class. This will be removed
+            //as soon as the instance is outdated
+            current.incref(); 
+        }
+        current.incref(); //this increase is for the holder of the returned instance
+        log.debug(" > increase RefCount for EntityCache for version {} to {}", 
+        		version, current.getRefcount());
         return current;
     }
 
+    @Override
+    public void close() {
+    	if(current != null){
+    		current.decref();
+    		current = null;
+    	}
+    }
+    
+    @Override
+    protected void finalize() {
+    	if(current != null){
+    		log.warn("[finalize] EntityCache Manager was not closed. This can "
+    				+ "cause Memory Leaks as Cached Entities will be kept in " 
+    				+ "Memory until finalization!");
+    	}
+    	close();
+    }
+    
     /**
-     * {@link RefCounted} implementation that ensures that outdated caches are
-     * cleared and closed as soon as they are no longer in use.
+     * {@link RefCounted} implementation that closes the {@link SolrEntityCache}
+     * when {@link #close()} is called by the supoer implementation.
      * 
      * @author Rupert Westenthaler
      *
@@ -100,23 +130,23 @@ public class FastLRUCacheManager impleme
             super(resource);
         }
 
-        private boolean outdated;
-
-        /**
-         * Used by the manager implementation to set the RefCounted EntityCache
-         * as outdated
-         */
-        protected void setOutdated() {
-            outdated = true;
+        @Override
+        public void decref() {
+        	super.decref();
+        	if(log.isDebugEnabled()){
+	            log.debug(" > decrease RefCount for EntityCache for version {} to {}", 
+	            		get().getVersion(), current.getRefcount());
+        	}
         }
-
         /**
-         * clears the cache if outdated
+         * closes the {@link SolrEntityCache}
          */
         protected void close(){
-            if(outdated){
-                ((SolrEntityCache)get()).close();
-            }
+        	if(log.isDebugEnabled()){
+        		log.debug(" > close EntityCache for version {}", 
+        				current.get().getVersion());
+        	}
+            ((SolrEntityCache)get()).close();
         }
 
     }