mirror of https://github.com/apache/lucene.git
don't close segment private doc producers during merge
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1143855 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3d5532d75b
commit
3ad65686e5
|
@ -574,37 +574,37 @@ final class SegmentMerger {
|
|||
final List<Bits> perDocBits = new ArrayList<Bits>();
|
||||
final List<Integer> perDocBitsStarts = new ArrayList<Integer>();
|
||||
int docBase = 0;
|
||||
try {
|
||||
for(IndexReader r : readers) {
|
||||
final int maxDoc = r.maxDoc();
|
||||
final PerDocValues producer = r.perDocValues();
|
||||
if (producer != null) {
|
||||
perDocSlices.add(new ReaderUtil.Slice(docBase, maxDoc, perDocProducers.size()));
|
||||
perDocProducers.add(producer);
|
||||
perDocBits.add(r.getLiveDocs());
|
||||
perDocBitsStarts.add(docBase);
|
||||
}
|
||||
docBase += maxDoc;
|
||||
for (IndexReader r : readers) {
|
||||
final int maxDoc = r.maxDoc();
|
||||
final PerDocValues producer = r.perDocValues();
|
||||
if (producer != null) {
|
||||
perDocSlices.add(new ReaderUtil.Slice(docBase, maxDoc, perDocProducers
|
||||
.size()));
|
||||
perDocProducers.add(producer);
|
||||
perDocBits.add(r.getLiveDocs());
|
||||
perDocBitsStarts.add(docBase);
|
||||
}
|
||||
perDocBitsStarts.add(docBase);
|
||||
if (!perDocSlices.isEmpty()) {
|
||||
mergeState.multiLiveDocs = new MultiBits(perDocBits, perDocBitsStarts, true);
|
||||
final PerDocConsumer docsConsumer = codec
|
||||
.docsConsumer(new PerDocWriteState(segmentWriteState));
|
||||
boolean success = false;
|
||||
try {
|
||||
final MultiPerDocValues multiPerDocValues = new MultiPerDocValues(perDocProducers
|
||||
.toArray(PerDocValues.EMPTY_ARRAY), perDocSlices
|
||||
.toArray(ReaderUtil.Slice.EMPTY_ARRAY));
|
||||
docsConsumer.merge(mergeState, multiPerDocValues);
|
||||
success = true;
|
||||
} finally {
|
||||
IOUtils.closeSafely(!success, docsConsumer);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
IOUtils.closeSafely(false, perDocProducers);
|
||||
docBase += maxDoc;
|
||||
}
|
||||
perDocBitsStarts.add(docBase);
|
||||
if (!perDocSlices.isEmpty()) {
|
||||
mergeState.multiLiveDocs = new MultiBits(perDocBits, perDocBitsStarts,
|
||||
true);
|
||||
final PerDocConsumer docsConsumer = codec
|
||||
.docsConsumer(new PerDocWriteState(segmentWriteState));
|
||||
boolean success = false;
|
||||
try {
|
||||
final MultiPerDocValues multiPerDocValues = new MultiPerDocValues(
|
||||
perDocProducers.toArray(PerDocValues.EMPTY_ARRAY),
|
||||
perDocSlices.toArray(ReaderUtil.Slice.EMPTY_ARRAY));
|
||||
docsConsumer.merge(mergeState, multiPerDocValues);
|
||||
success = true;
|
||||
} finally {
|
||||
IOUtils.closeSafely(!success, docsConsumer);
|
||||
}
|
||||
}
|
||||
/* don't close the perDocProducers here since they are private segment producers
|
||||
* and will be closed once the SegmentReader goes out of scope */
|
||||
}
|
||||
|
||||
private MergeState mergeState;
|
||||
|
|
Loading…
Reference in New Issue