diff --git a/src/main/java/org/elasticsearch/index/fielddata/plain/ParentChildIndexFieldData.java b/src/main/java/org/elasticsearch/index/fielddata/plain/ParentChildIndexFieldData.java index f11686d347d4f..f046c80ccf948 100644 --- a/src/main/java/org/elasticsearch/index/fielddata/plain/ParentChildIndexFieldData.java +++ b/src/main/java/org/elasticsearch/index/fielddata/plain/ParentChildIndexFieldData.java @@ -101,54 +101,54 @@ public ParentChildAtomicFieldData loadDirect(AtomicReaderContext context) throws TermsEnum estimatedTermsEnum = estimator.beforeLoad(null); ObjectObjectOpenHashMap typeBuilders = ObjectObjectOpenHashMap.newInstance(); try { - DocsEnum docsEnum = null; - for (BytesRef term = estimatedTermsEnum.next(); term != null; term = estimatedTermsEnum.next()) { - // Usually this would be estimatedTermsEnum, but the - // abstract TermsEnum class does not support the .type() - // and .id() methods, so we skip using the wrapped - // TermsEnum and delegate directly to the - // ParentChildFilteredTermsEnum that was originally wrapped - String type = termsEnum.type(); - TypeBuilder typeBuilder = typeBuilders.get(type); - if (typeBuilder == null) { - typeBuilders.put(type, typeBuilder = new TypeBuilder(acceptableTransientOverheadRatio, reader)); - } + try { + DocsEnum docsEnum = null; + for (BytesRef term = estimatedTermsEnum.next(); term != null; term = estimatedTermsEnum.next()) { + // Usually this would be estimatedTermsEnum, but the + // abstract TermsEnum class does not support the .type() + // and .id() methods, so we skip using the wrapped + // TermsEnum and delegate directly to the + // ParentChildFilteredTermsEnum that was originally wrapped + String type = termsEnum.type(); + TypeBuilder typeBuilder = typeBuilders.get(type); + if (typeBuilder == null) { + typeBuilders.put(type, typeBuilder = new TypeBuilder(acceptableTransientOverheadRatio, reader)); + } - BytesRef id = termsEnum.id(); - final long termOrd = typeBuilder.builder.nextOrdinal(); - assert termOrd == typeBuilder.termOrdToBytesOffset.size(); - typeBuilder.termOrdToBytesOffset.add(typeBuilder.bytes.copyUsingLengthPrefix(id)); - docsEnum = estimatedTermsEnum.docs(null, docsEnum, DocsEnum.FLAG_NONE); - for (int docId = docsEnum.nextDoc(); docId != DocsEnum.NO_MORE_DOCS; docId = docsEnum.nextDoc()) { - typeBuilder.builder.addDoc(docId); + BytesRef id = termsEnum.id(); + final long termOrd = typeBuilder.builder.nextOrdinal(); + assert termOrd == typeBuilder.termOrdToBytesOffset.size(); + typeBuilder.termOrdToBytesOffset.add(typeBuilder.bytes.copyUsingLengthPrefix(id)); + docsEnum = estimatedTermsEnum.docs(null, docsEnum, DocsEnum.FLAG_NONE); + for (int docId = docsEnum.nextDoc(); docId != DocsEnum.NO_MORE_DOCS; docId = docsEnum.nextDoc()) { + typeBuilder.builder.addDoc(docId); + } } - } - ImmutableOpenMap.Builder typeToAtomicFieldData = ImmutableOpenMap.builder(typeBuilders.size()); - for (ObjectObjectCursor cursor : typeBuilders) { - final long sizePointer = cursor.value.bytes.getPointer(); - PagedBytes.Reader bytesReader = cursor.value.bytes.freeze(true); - final Ordinals ordinals = cursor.value.builder.build(fieldDataType.getSettings()); + ImmutableOpenMap.Builder typeToAtomicFieldData = ImmutableOpenMap.builder(typeBuilders.size()); + for (ObjectObjectCursor cursor : typeBuilders) { + final long sizePointer = cursor.value.bytes.getPointer(); + PagedBytes.Reader bytesReader = cursor.value.bytes.freeze(true); + final Ordinals ordinals = cursor.value.builder.build(fieldDataType.getSettings()); - typeToAtomicFieldData.put( - cursor.key, - new PagedBytesAtomicFieldData(bytesReader, sizePointer, cursor.value.termOrdToBytesOffset, ordinals) - ); + typeToAtomicFieldData.put( + cursor.key, + new PagedBytesAtomicFieldData(bytesReader, sizePointer, cursor.value.termOrdToBytesOffset, ordinals) + ); + } + data = new ParentChildAtomicFieldData(typeToAtomicFieldData.build()); + } finally { + for (ObjectObjectCursor cursor : typeBuilders) { + cursor.value.builder.close(); + } } - data = new ParentChildAtomicFieldData(typeToAtomicFieldData.build()); success = true; return data; } finally { - try { - for (ObjectObjectCursor cursor : typeBuilders) { - cursor.value.builder.close(); - } - } finally { - if (success) { - estimator.afterLoad(estimatedTermsEnum, data.getMemorySizeInBytes()); - } else { - estimator.afterLoad(estimatedTermsEnum, 0); - } + if (success) { + estimator.afterLoad(estimatedTermsEnum, data.getMemorySizeInBytes()); + } else { + estimator.afterLoad(estimatedTermsEnum, 0); } } }