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 2014/08/22 00:24:13 UTC

svn commit: r1619610 - /lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java

Author: mikemccand
Date: Thu Aug 21 22:24:13 2014
New Revision: 1619610

URL: http://svn.apache.org/r1619610
Log:
close DV producers on exception

Modified:
    lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java

Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java?rev=1619610&r1=1619609&r2=1619610&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/SegmentDocValuesProducer.java Thu Aug 21 22:24:13 2014
@@ -48,58 +48,74 @@ class SegmentDocValuesProducer extends D
   final List<Long> dvGens = new ArrayList<>();
   
   SegmentDocValuesProducer(SegmentCommitInfo si, Directory dir, FieldInfos fieldInfos, SegmentDocValues segDocValues, DocValuesFormat dvFormat, int termIndexDivisor) throws IOException {
-    Version ver = si.info.getVersion();
-    if (ver != null && ver.onOrAfter(Version.LUCENE_4_9_0)) {
-      DocValuesProducer baseProducer = null;
-      for (FieldInfo fi : fieldInfos) {
-        if (!fi.hasDocValues()) continue;
-        long docValuesGen = fi.getDocValuesGen();
-        if (docValuesGen == -1) {
-          if (baseProducer == null) {
-            // the base producer gets all the fields, so the Codec can validate properly
-            baseProducer = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, fieldInfos, termIndexDivisor);
+    boolean success = false;
+    try {
+      Version ver = si.info.getVersion();
+      if (ver != null && ver.onOrAfter(Version.LUCENE_4_9_0)) {
+        DocValuesProducer baseProducer = null;
+        for (FieldInfo fi : fieldInfos) {
+          if (!fi.hasDocValues()) {
+            continue;
+          }
+          long docValuesGen = fi.getDocValuesGen();
+          if (docValuesGen == -1) {
+            if (baseProducer == null) {
+              // the base producer gets all the fields, so the Codec can validate properly
+              baseProducer = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, fieldInfos, termIndexDivisor);
+              dvGens.add(docValuesGen);
+              dvProducers.add(baseProducer);
+            }
+            dvProducersByField.put(fi.name, baseProducer);
+          } else {
+            assert !dvGens.contains(docValuesGen);
+            final DocValuesProducer dvp = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, new FieldInfos(new FieldInfo[] { fi }), termIndexDivisor);
             dvGens.add(docValuesGen);
-            dvProducers.add(baseProducer);
+            dvProducers.add(dvp);
+            dvProducersByField.put(fi.name, dvp);
           }
-          dvProducersByField.put(fi.name, baseProducer);
-        } else {
-          assert !dvGens.contains(docValuesGen);
-          final DocValuesProducer dvp = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, new FieldInfos(new FieldInfo[] { fi }), termIndexDivisor);
-          dvGens.add(docValuesGen);
-          dvProducers.add(dvp);
-          dvProducersByField.put(fi.name, dvp);
         }
-      }
-    } else {
-      // For pre-4.9 indexes, especially with doc-values updates, multiple
-      // FieldInfos could belong to the same dvGen. Therefore need to make sure
-      // we initialize each DocValuesProducer once per gen.
-      Map<Long,List<FieldInfo>> genInfos = new HashMap<>();
-      for (FieldInfo fi : fieldInfos) {
-        if (!fi.hasDocValues()) continue;
-        List<FieldInfo> genFieldInfos = genInfos.get(fi.getDocValuesGen());
-        if (genFieldInfos == null) {
-          genFieldInfos = new ArrayList<>();
-          genInfos.put(fi.getDocValuesGen(), genFieldInfos);
+      } else {
+        // For pre-4.9 indexes, especially with doc-values updates, multiple
+        // FieldInfos could belong to the same dvGen. Therefore need to make sure
+        // we initialize each DocValuesProducer once per gen.
+        Map<Long,List<FieldInfo>> genInfos = new HashMap<>();
+        for (FieldInfo fi : fieldInfos) {
+          if (!fi.hasDocValues()) {
+            continue;
+          }
+          List<FieldInfo> genFieldInfos = genInfos.get(fi.getDocValuesGen());
+          if (genFieldInfos == null) {
+            genFieldInfos = new ArrayList<>();
+            genInfos.put(fi.getDocValuesGen(), genFieldInfos);
+          }
+          genFieldInfos.add(fi);
         }
-        genFieldInfos.add(fi);
-      }
       
-      for (Map.Entry<Long,List<FieldInfo>> e : genInfos.entrySet()) {
-        long docValuesGen = e.getKey();
-        List<FieldInfo> infos = e.getValue();
-        final DocValuesProducer dvp;
-        if (docValuesGen == -1) {
-          // we need to send all FieldInfos to gen=-1, but later we need to
-          // record the DVP only for the "true" gen=-1 fields (not updated)
-          dvp = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, fieldInfos, termIndexDivisor);
-        } else {
-          dvp = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, new FieldInfos(infos.toArray(new FieldInfo[infos.size()])), termIndexDivisor);
+        for (Map.Entry<Long,List<FieldInfo>> e : genInfos.entrySet()) {
+          long docValuesGen = e.getKey();
+          List<FieldInfo> infos = e.getValue();
+          final DocValuesProducer dvp;
+          if (docValuesGen == -1) {
+            // we need to send all FieldInfos to gen=-1, but later we need to
+            // record the DVP only for the "true" gen=-1 fields (not updated)
+            dvp = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, fieldInfos, termIndexDivisor);
+          } else {
+            dvp = segDocValues.getDocValuesProducer(docValuesGen, si, IOContext.READ, dir, dvFormat, new FieldInfos(infos.toArray(new FieldInfo[infos.size()])), termIndexDivisor);
+          }
+          dvGens.add(docValuesGen);
+          dvProducers.add(dvp);
+          for (FieldInfo fi : infos) {
+            dvProducersByField.put(fi.name, dvp);
+          }
         }
-        dvGens.add(docValuesGen);
-        dvProducers.add(dvp);
-        for (FieldInfo fi : infos) {
-          dvProducersByField.put(fi.name, dvp);
+      }
+      success = true;
+    } finally {
+      if (success == false) {
+        try {
+          segDocValues.decRef(dvGens);
+        } catch (Throwable t) {
+          // Ignore so we keep throwing first exception
         }
       }
     }