You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by yo...@apache.org on 2008/07/21 18:18:22 UTC

svn commit: r678457 - in /lucene/solr/trunk/src: java/org/apache/solr/handler/component/ java/org/apache/solr/spelling/ test/org/apache/solr/spelling/

Author: yonik
Date: Mon Jul 21 09:18:21 2008
New Revision: 678457

URL: http://svn.apache.org/viewvc?rev=678457&view=rev
Log:
SOLR-640: spellcheck reference leaks

Modified:
    lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
    lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java
    lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java
    lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java
    lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java
    lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java

Modified: lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java?rev=678457&r1=678456&r2=678457&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/handler/component/SpellCheckComponent.java Mon Jul 21 09:18:21 2008
@@ -102,7 +102,7 @@
     }
     SolrSpellChecker spellChecker = getSpellChecker(params);
     if (params.getBool(SPELLCHECK_BUILD, false)) {
-      spellChecker.build(rb.req.getCore());
+      spellChecker.build(rb.req.getCore(), rb.req.getSearcher());
       rb.rsp.add("command", "build");
     } else if (params.getBool(SPELLCHECK_RELOAD, false)) {
       spellChecker.reload();

Modified: lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java?rev=678457&r1=678456&r2=678457&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java Mon Jul 21 09:18:21 2008
@@ -36,6 +36,7 @@
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.util.HighFrequencyDictionary;
+import org.apache.solr.search.SolrIndexSearcher;
 
 
 /**
@@ -65,7 +66,7 @@
     return name;
   }
 
-  public void build(SolrCore core) {
+  public void build(SolrCore core, SolrIndexSearcher searcher) {
     try {
       loadExternalFileDictionary(core.getSchema(), core.getResourceLoader());
       spellChecker.clearIndex();

Modified: lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java?rev=678457&r1=678456&r2=678457&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/spelling/IndexBasedSpellChecker.java Mon Jul 21 09:18:21 2008
@@ -69,12 +69,11 @@
     }
   }
 
-  public void build(SolrCore core) {
+  public void build(SolrCore core, SolrIndexSearcher searcher) {
     IndexReader reader = null;
     try {
       if (sourceLocation == null) {
         // Load from Solr's index
-        SolrIndexSearcher searcher = core.getSearcher().get();
         reader = searcher.getReader();
       } else {
         // Load from Lucene index at given sourceLocation

Modified: lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java?rev=678457&r1=678456&r2=678457&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/spelling/SolrSpellChecker.java Mon Jul 21 09:18:21 2008
@@ -22,6 +22,7 @@
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.search.SolrIndexSearcher;
 
 import java.io.IOException;
 import java.util.Collection;
@@ -67,10 +68,8 @@
 
   /**
    * (re)Build The Spelling index.  May be a NOOP if the ipmlementation doesn't require building, or can't be rebuilt
-   *
-   * @param core The SolrCore
    */
-  public abstract void build(SolrCore core);
+  public abstract void build(SolrCore core, SolrIndexSearcher searcher);
 
   /**
    * Assumes count = 1, onlyMorePopular = false, extendedResults = false

Modified: lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java?rev=678457&r1=678456&r2=678457&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java Mon Jul 21 09:18:21 2008
@@ -72,7 +72,7 @@
     SolrCore core = h.getCore();
     String dictName = checker.init(spellchecker, core.getResourceLoader());
     assertTrue(dictName + " is not equal to " + "external", dictName.equals("external") == true);
-    checker.build(core);
+    checker.build(core, null);
 
     IndexReader reader = core.getSearcher().get().getReader();
     Collection<Token> tokens = queryConverter.convert("fob");
@@ -110,7 +110,7 @@
     SolrCore core = h.getCore();
     String dictName = checker.init(spellchecker, core.getResourceLoader());
     assertTrue(dictName + " is not equal to " + "external", dictName.equals("external") == true);
-    checker.build(core);
+    checker.build(core, null);
 
     IndexReader reader = core.getSearcher().get().getReader();
     Collection<Token> tokens = queryConverter.convert("Solar");
@@ -151,7 +151,7 @@
     SolrCore core = h.getCore();
     String dictName = checker.init(spellchecker, core.getResourceLoader());
     assertTrue(dictName + " is not equal to " + "external", dictName.equals("external") == true);
-    checker.build(core);
+    checker.build(core, null);
 
     IndexReader reader = core.getSearcher().get().getReader();
     Collection<Token> tokens = queryConverter.convert("solar");

Modified: lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java?rev=678457&r1=678456&r2=678457&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java Mon Jul 21 09:18:21 2008
@@ -43,6 +43,8 @@
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.util.AbstractSolrTestCase;
+import org.apache.solr.util.RefCounted;
+import org.apache.solr.search.SolrIndexSearcher;
 
 import java.io.File;
 import java.util.Collection;
@@ -105,9 +107,12 @@
     String dictName = checker.init(spellchecker, core.getResourceLoader());
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    checker.build(core);
+    RefCounted<SolrIndexSearcher> holder = core.getSearcher();
+    SolrIndexSearcher searcher = holder.get();
+    try {
+    checker.build(core, searcher);
 
-    IndexReader reader = core.getSearcher().get().getReader();
+    IndexReader reader = searcher.getReader();
     Collection<Token> tokens = queryConverter.convert("documemt");
     SpellingResult result = checker.getSuggestions(tokens, reader);
     assertTrue("result is null and it shouldn't be", result != null);
@@ -155,6 +160,9 @@
     entry = suggestions.entrySet().iterator().next();
     assertTrue(entry.getKey() + " is equal to " + "bug and it shouldn't be", entry.getKey().equals("bug") == false);
     assertTrue(entry.getValue() + " does not equal: " + SpellingResult.NO_FREQUENCY_INFO, entry.getValue() == SpellingResult.NO_FREQUENCY_INFO);
+    } finally {
+      holder.decref();
+    }
   }
 
   public void testExtendedResults() throws Exception {
@@ -172,9 +180,12 @@
     String dictName = checker.init(spellchecker, core.getResourceLoader());
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    checker.build(core);
+    RefCounted<SolrIndexSearcher> holder = core.getSearcher();
+    SolrIndexSearcher searcher = holder.get();
+    try {
+    checker.build(core, searcher);
 
-    IndexReader reader = core.getSearcher().get().getReader();
+    IndexReader reader = searcher.getReader();
     Collection<Token> tokens = queryConverter.convert("documemt");
     SpellingResult result = checker.getSuggestions(tokens, reader, 1, false, true);
     assertTrue("result is null and it shouldn't be", result != null);
@@ -198,6 +209,9 @@
     assertTrue("result is null and it shouldn't be", result != null);
     suggestions = result.get(tokens.iterator().next());
     assertTrue("suggestions is not null and it should be", suggestions == null);
+    } finally {
+      holder.decref();
+    }
   }
 
   private class TestSpellChecker extends IndexBasedSpellChecker{
@@ -222,12 +236,18 @@
     String dictName = checker.init(spellchecker, core.getResourceLoader());
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    checker.build(core);
+    RefCounted<SolrIndexSearcher> holder = core.getSearcher();
+    SolrIndexSearcher searcher = holder.get();
+    try {
+    checker.build(core, searcher);
     SpellChecker sc = checker.getSpellChecker();
     assertTrue("sc is null and it shouldn't be", sc != null);
     StringDistance sd = sc.getStringDistance();
     assertTrue("sd is null and it shouldn't be", sd != null);
     assertTrue("sd is not an instance of " + JaroWinklerDistance.class.getName(), sd instanceof JaroWinklerDistance);
+    } finally {
+      holder.decref();
+    }
   }
 
   public void testAlternateLocation() throws Exception {
@@ -266,9 +286,12 @@
     String dictName = checker.init(spellchecker, core.getResourceLoader());
     assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
             dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    checker.build(core);
+    RefCounted<SolrIndexSearcher> holder = core.getSearcher();
+    SolrIndexSearcher searcher = holder.get();
+    try {
+    checker.build(core, searcher);
 
-    IndexReader reader = core.getSearcher().get().getReader();
+    IndexReader reader = searcher.getReader();
     Collection<Token> tokens = queryConverter.convert("flesh");
     SpellingResult result = checker.getSuggestions(tokens, reader, 1, false, true);
     assertTrue("result is null and it shouldn't be", result != null);
@@ -292,7 +315,9 @@
     assertTrue("result is null and it shouldn't be", result != null);
     suggestions = result.get(tokens.iterator().next());
     assertTrue("suggestions is not null and it should be", suggestions == null);
-
+    } finally {
+      holder.decref();
+    }
   }
 }