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
}
}
}