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:44:52 UTC

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

Repository: lucene-solr
Updated Branches:
  refs/heads/master 400449f2c -> 4fba55c86


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/4fba55c8
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4fba55c8
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4fba55c8

Branch: refs/heads/master
Commit: 4fba55c864298848a07c2971738947473484006e
Parents: 400449f
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:43:24 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/4fba55c8/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index b141e45..4d902fe 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -173,6 +173,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
@@ -200,7 +203,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/4fba55c8/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/4fba55c8/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);
+  }
 }