From d653fbc449cb6c76618989094e8dd92b7783754b Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 3 Jul 2012 08:44:00 +0000 Subject: [PATCH] Merged revision(s) 1356608 from lucene/dev/branches/branch_4x: LUCENE-4183: Cleanup CFS reader exeption handling git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1356614 13f79535-47bb-0310-9956-ffa450edef68 --- .../lucene/store/CompoundFileDirectory.java | 53 ++++++++----------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/store/CompoundFileDirectory.java b/lucene/core/src/java/org/apache/lucene/store/CompoundFileDirectory.java index bc21cd2c0b6..81c3f31bb8d 100644 --- a/lucene/core/src/java/org/apache/lucene/store/CompoundFileDirectory.java +++ b/lucene/core/src/java/org/apache/lucene/store/CompoundFileDirectory.java @@ -122,50 +122,43 @@ public final class CompoundFileDirectory extends Directory { /** Helper method that reads CFS entries from an input stream */ private static final Map readEntries( IndexInputSlicer handle, Directory dir, String name) throws IOException { - final IndexInput stream = handle.openFullSlice(); - final Map mapping; - boolean success = false; + IOException priorE = null; + IndexInput stream = null, entriesStream = null; try { + stream = handle.openFullSlice(); final int firstInt = stream.readInt(); // NOTE: as long as we want to throw indexformattooold (vs corruptindexexception), we need // to read the magic ourselves. See SegmentInfos which also has this. if (firstInt == CodecUtil.CODEC_MAGIC) { CodecUtil.checkHeaderNoMagic(stream, CompoundFileWriter.DATA_CODEC, CompoundFileWriter.VERSION_START, CompoundFileWriter.VERSION_START); - IndexInput input = null; - try { - final String entriesFileName = IndexFileNames.segmentFileName( - IndexFileNames.stripExtension(name), "", - IndexFileNames.COMPOUND_FILE_ENTRIES_EXTENSION); - input = dir.openInput(entriesFileName, IOContext.READONCE); - CodecUtil.checkHeader(input, CompoundFileWriter.ENTRY_CODEC, CompoundFileWriter.VERSION_START, CompoundFileWriter.VERSION_START); - final int numEntries = input.readVInt(); - mapping = new HashMap( - numEntries); - for (int i = 0; i < numEntries; i++) { - final FileEntry fileEntry = new FileEntry(); - final String id = input.readString(); - assert !mapping.containsKey(id): "id=" + id + " was written multiple times in the CFS"; - mapping.put(id, fileEntry); - fileEntry.offset = input.readLong(); - fileEntry.length = input.readLong(); - } - success = true; - return mapping; - } finally { - IOUtils.close(input); + final String entriesFileName = IndexFileNames.segmentFileName( + IndexFileNames.stripExtension(name), "", + IndexFileNames.COMPOUND_FILE_ENTRIES_EXTENSION); + entriesStream = dir.openInput(entriesFileName, IOContext.READONCE); + CodecUtil.checkHeader(entriesStream, CompoundFileWriter.ENTRY_CODEC, CompoundFileWriter.VERSION_START, CompoundFileWriter.VERSION_START); + final int numEntries = entriesStream.readVInt(); + final Map mapping = new HashMap(numEntries); + for (int i = 0; i < numEntries; i++) { + final FileEntry fileEntry = new FileEntry(); + final String id = entriesStream.readString(); + assert !mapping.containsKey(id): "id=" + id + " was written multiple times in the CFS"; + mapping.put(id, fileEntry); + fileEntry.offset = entriesStream.readLong(); + fileEntry.length = entriesStream.readLong(); } + return mapping; } else { throw new IndexFormatTooOldException(stream, firstInt, CodecUtil.CODEC_MAGIC, CodecUtil.CODEC_MAGIC); } + } catch (IOException ioe) { + priorE = ioe; } finally { - if (success) { - IOUtils.close(stream); - } else { - IOUtils.closeWhileHandlingException(stream); - } + IOUtils.closeWhileHandlingException(priorE, stream, entriesStream); } + // this is needed until Java 7's real try-with-resources: + throw new AssertionError("impossible to get here"); } public Directory getDirectory() {