You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2018/04/28 13:42:46 UTC

lucene-solr:branch_7x: LUCENE-8244: Do not leak open file descriptors in SearcherTaxonomyManager's refresh on exception (Mike McCandless)

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7x f1f572012 -> 9f2eda7a1


LUCENE-8244: Do not leak open file descriptors in SearcherTaxonomyManager's refresh on exception (Mike McCandless)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9f2eda7a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9f2eda7a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9f2eda7a

Branch: refs/heads/branch_7x
Commit: 9f2eda7a1fc6d4cec70a8a76f3401a6bd53a48b1
Parents: f1f5720
Author: Mike McCandless <mi...@apache.org>
Authored: Sat Apr 28 09:42:30 2018 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Sat Apr 28 09:42:30 2018 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  5 +++-
 .../facet/taxonomy/SearcherTaxonomyManager.java | 12 ++++++++-
 .../taxonomy/TestSearcherTaxonomyManager.java   | 26 ++++++++++++++++++++
 3 files changed, 41 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9f2eda7a/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index eb42a1a..1df7796 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -80,6 +80,9 @@ Bug Fixes
   the directory has pending deletes files even if the directory is filtered or 
   a FileSwitchDirectory (Simon Willnauer, Robert Muir)
 
+* LUCENE-8244: Do not leak open file descriptors in SearcherTaxonomyManager's
+  refresh on exception (Mike McCandless)
+
 Other
 
 * LUCENE-8228: removed obsolete IndexDeletionPolicy clone() requirements from
@@ -107,7 +110,7 @@ Build
 Documentation
 
 * LUCENE-8238: Improve WordDelimiterFilter and WordDelimiterGraphFilter javadocs
-xo  (Mike Sokolov via Mike McCandless)
+  (Mike Sokolov via Mike McCandless)
 
 ======================= Lucene 7.3.0 =======================
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9f2eda7a/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java b/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java
index 0a81dfb..e618aa5 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/SearcherTaxonomyManager.java
@@ -134,7 +134,17 @@ public class SearcherTaxonomyManager extends ReferenceManager<SearcherTaxonomyMa
     if (newReader == null) {
       return null;
     } else {
-      DirectoryTaxonomyReader tr = TaxonomyReader.openIfChanged(ref.taxonomyReader);
+      DirectoryTaxonomyReader tr;
+      try {
+        tr = TaxonomyReader.openIfChanged(ref.taxonomyReader);
+      } catch (Throwable t1) {
+        try {
+          IOUtils.close(newReader);
+        } catch (Throwable t2) {
+          t2.addSuppressed(t2);
+        }
+        throw t1;
+      }
       if (tr == null) {
         ref.taxonomyReader.incRef();
         tr = ref.taxonomyReader;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9f2eda7a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestSearcherTaxonomyManager.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestSearcherTaxonomyManager.java b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestSearcherTaxonomyManager.java
index a1e0344..d9a3f8e 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestSearcherTaxonomyManager.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestSearcherTaxonomyManager.java
@@ -33,8 +33,10 @@ import org.apache.lucene.facet.FacetsCollector;
 import org.apache.lucene.facet.FacetsConfig;
 import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager.SearcherAndTaxonomy;
 import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter;
+import org.apache.lucene.index.IndexNotFoundException;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.SegmentInfos;
 import org.apache.lucene.index.TieredMergePolicy;
 import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.ReferenceManager;
@@ -321,4 +323,28 @@ public class TestSearcherTaxonomyManager extends FacetTestCase {
     IOUtils.close(mgr, tw, taxoDir, indexDir);
   }
 
+  public void testExceptionDuringRefresh() throws Exception {
+
+    Directory indexDir = newDirectory();
+    Directory taxoDir = newDirectory();
+
+    IndexWriter w = new IndexWriter(indexDir, newIndexWriterConfig(new MockAnalyzer(random())));
+    DirectoryTaxonomyWriter tw = new DirectoryTaxonomyWriter(taxoDir);
+    w.commit();
+    tw.commit();
+
+    SearcherTaxonomyManager mgr = new SearcherTaxonomyManager(indexDir, taxoDir, null);
+
+    tw.addCategory(new FacetLabel("a", "b"));
+    w.addDocument(new Document());
+
+    tw.commit();
+    w.commit();
+
+    // intentionally corrupt the taxo index:
+    SegmentInfos infos = SegmentInfos.readLatestCommit(taxoDir);
+    taxoDir.deleteFile(infos.getSegmentsFileName());
+    expectThrows(IndexNotFoundException.class, mgr::maybeRefreshBlocking);
+    IOUtils.close(w, tw, mgr, indexDir, taxoDir);
+  }
 }