Author: rwesten
Date: Tue Oct 20 07:42:49 2015
New Revision: 1709524

URL: http://svn.apache.org/viewvc?rev=1709524&view=rev
Log:
STANBOL-1443: merged fix from 0.12.1 to trunk

Modified:
    
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/IndexConfiguration.java
    
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java

Modified: 
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/IndexConfiguration.java
URL: 
http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/IndexConfiguration.java?rev=1709524&r1=1709523&r2=1709524&view=diff
==============================================================================
--- 
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/IndexConfiguration.java
 (original)
+++ 
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/IndexConfiguration.java
 Tue Oct 20 07:42:49 2015
@@ -413,7 +413,7 @@ public class IndexConfiguration {
      */
     public boolean activate() {
         active = true;
-        RefCounted<SolrIndexSearcher> searcherRef = index.getSearcher(true, 
true, null);
+        RefCounted<SolrIndexSearcher> searcherRef = index.getSearcher();
         try {
             return processFstConfig(searcherRef.get().getAtomicReader());
         }catch (RuntimeException e) { //in case of any excpetion

Modified: 
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java
URL: 
http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java?rev=1709524&r1=1709523&r2=1709524&view=diff
==============================================================================
--- 
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java
 (original)
+++ 
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/cache/FastLRUCacheManager.java
 Tue Oct 20 07:42:49 2015
@@ -19,6 +19,8 @@ package org.apache.stanbol.enhancer.engi
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.lucene.document.Document;
 import org.apache.solr.search.CacheRegenerator;
@@ -42,6 +44,8 @@ public class FastLRUCacheManager impleme
     RefCounted<EntityCache> current;
     private final CacheRegenerator regenerator;
     private final Map<String,String> config;
+    private ReadWriteLock lock = new ReentrantReadWriteLock();
+    
     
     /**
      * Creates a cache manager instance with the parsed maximum size and no 
@@ -77,36 +81,63 @@ public class FastLRUCacheManager impleme
     
     @Override
     public RefCounted<EntityCache> getCache(Object version) {
-        if(current == null || !current.get().getVersion().equals(version)){
-            if(current != null){
-               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;
+        lock.readLock().lock();
+        try {
+            if(current != null && current.get().getVersion().equals(version)){
+                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;
+            }
+        } finally {
+            lock.readLock().unlock();
+        }
+        //still here ... looks like we need to build a new one
+        lock.writeLock().lock();
+        try {
+            //check again ... an other thread might have already built the 
cache
+            //for the requested version
+            if(current == null || !current.get().getVersion().equals(version)){
+                if(current != null){
+                       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));
+                //add a reference to the new cache by this class. This will be 
removed
+                //as soon as the instance is outdated
+                current.incref(); 
             }
-            //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));
-            //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;
+        } finally {
+            lock.writeLock().unlock();
         }
-        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;
-       }
+        lock.writeLock().lock();
+        try {
+               if(current != null){
+                   Object version = log.isDebugEnabled() ? 
current.get().getVersion() : null;
+                       current.decref();
+                    log.debug(" > close EntityCache for version {} (remaining 
refCount: {})", 
+                        version , current.getRefcount());
+                       current = null;
+               }
+        } finally{ 
+            lock.writeLock().unlock();
+        }
     }
     
     @Override


Reply via email to