diff --git a/lucene/contrib/misc/src/java/org/apache/lucene/store/DirectIOLinuxDirectory.java b/lucene/contrib/misc/src/java/org/apache/lucene/store/DirectIOLinuxDirectory.java index 7fc04564d83..bdd1f5d116a 100644 --- a/lucene/contrib/misc/src/java/org/apache/lucene/store/DirectIOLinuxDirectory.java +++ b/lucene/contrib/misc/src/java/org/apache/lucene/store/DirectIOLinuxDirectory.java @@ -245,6 +245,7 @@ public class DirectIOLinuxDirectory extends FSDirectory { public DirectIOLinuxIndexInput(File path, int bufferSize) throws IOException { // TODO make use of IOContext + super("DirectIOLinuxIndexInput(path=\"" + path.getPath() + "\")"); FileDescriptor fd = NativePosixUtil.open_direct(path.toString(), true); fis = new FileInputStream(fd); channel = fis.getChannel(); @@ -259,6 +260,7 @@ public class DirectIOLinuxDirectory extends FSDirectory { // for clone public DirectIOLinuxIndexInput(DirectIOLinuxIndexInput other) throws IOException { + super(other.toString()); this.fis = null; channel = other.channel; this.bufferSize = other.bufferSize; @@ -308,7 +310,7 @@ public class DirectIOLinuxDirectory extends FSDirectory { try { return channel.size(); } catch (IOException ioe) { - throw new RuntimeException(ioe); + throw new RuntimeException("IOException during length(): " + this, ioe); } } @@ -331,9 +333,14 @@ public class DirectIOLinuxDirectory extends FSDirectory { bufferPos = 0; assert (filePos & ALIGN_NOT_MASK) == filePos : "filePos=" + filePos + " anded=" + (filePos & ALIGN_NOT_MASK); //System.out.println("X refill filePos=" + filePos); - int n = channel.read(buffer, filePos); + int n; + try { + n = channel.read(buffer, filePos); + } catch (IOException ioe) { + throw new IOException(ioe.getMessage() + ": " + this, ioe); + } if (n < 0) { - throw new IOException("eof"); + throw new IOException("eof: " + this); } buffer.rewind(); } @@ -365,7 +372,7 @@ public class DirectIOLinuxDirectory extends FSDirectory { try { return new DirectIOLinuxIndexInput(this); } catch (IOException ioe) { - throw new RuntimeException(ioe); + throw new RuntimeException("IOException during clone: " + this, ioe); } } } diff --git a/lucene/contrib/misc/src/java/org/apache/lucene/store/WindowsDirectory.java b/lucene/contrib/misc/src/java/org/apache/lucene/store/WindowsDirectory.java index 29d8998cfc8..151c8bfe066 100644 --- a/lucene/contrib/misc/src/java/org/apache/lucene/store/WindowsDirectory.java +++ b/lucene/contrib/misc/src/java/org/apache/lucene/store/WindowsDirectory.java @@ -19,6 +19,7 @@ package org.apache.lucene.store; import java.io.File; import java.io.IOException; +import java.io.EOFException; import org.apache.lucene.store.Directory; // javadoc import org.apache.lucene.store.NativeFSLockFactory; // javadoc @@ -80,7 +81,7 @@ public class WindowsDirectory extends FSDirectory { boolean isOpen; public WindowsIndexInput(File file, int bufferSize) throws IOException { - super(bufferSize); + super("WindowsIndexInput(path=\"" + file.getPath() + "\")", bufferSize); fd = WindowsDirectory.open(file.getPath()); length = WindowsDirectory.length(fd); isOpen = true; @@ -88,8 +89,16 @@ public class WindowsDirectory extends FSDirectory { @Override protected void readInternal(byte[] b, int offset, int length) throws IOException { - if (WindowsDirectory.read(fd, b, offset, length, getFilePointer()) != length) - throw new IOException("Read past EOF"); + int bytesRead; + try { + bytesRead = WindowsDirectory.read(fd, b, offset, length, getFilePointer()); + } catch (IOException ioe) { + throw new IOException(ioe.getMessage() + ": " + this, ioe); + } + + if (bytesRead != length) { + throw new EOFException("Read past EOF: " + this); + } } @Override diff --git a/lucene/src/java/org/apache/lucene/index/FieldInfos.java b/lucene/src/java/org/apache/lucene/index/FieldInfos.java index 306230e9778..365291ace07 100644 --- a/lucene/src/java/org/apache/lucene/index/FieldInfos.java +++ b/lucene/src/java/org/apache/lucene/index/FieldInfos.java @@ -650,10 +650,10 @@ public final class FieldInfos implements Iterable { format = input.readVInt(); if (format > FORMAT_MINIMUM) { - throw new IndexFormatTooOldException(fileName, format, FORMAT_MINIMUM, FORMAT_CURRENT); + throw new IndexFormatTooOldException(input, format, FORMAT_MINIMUM, FORMAT_CURRENT); } if (format < FORMAT_CURRENT) { - throw new IndexFormatTooNewException(fileName, format, FORMAT_MINIMUM, FORMAT_CURRENT); + throw new IndexFormatTooNewException(input, format, FORMAT_MINIMUM, FORMAT_CURRENT); } final int size = input.readVInt(); //read in the size @@ -675,7 +675,7 @@ public final class FieldInfos implements Iterable { if (format <= FORMAT_OMIT_POSITIONS) { indexOptions = IndexOptions.DOCS_AND_FREQS; } else { - throw new CorruptIndexException("Corrupt fieldinfos, OMIT_POSITIONS set but format=" + format); + throw new CorruptIndexException("Corrupt fieldinfos, OMIT_POSITIONS set but format=" + format + " (resource: " + input + ")"); } } else { indexOptions = IndexOptions.DOCS_AND_FREQS_AND_POSITIONS; @@ -745,7 +745,7 @@ public final class FieldInfos implements Iterable { } if (input.getFilePointer() != input.length()) { - throw new CorruptIndexException("did not read all bytes from file \"" + fileName + "\": read " + input.getFilePointer() + " vs size " + input.length()); + throw new CorruptIndexException("did not read all bytes from file \"" + fileName + "\": read " + input.getFilePointer() + " vs size " + input.length() + " (resource: " + input + ")"); } } diff --git a/lucene/src/java/org/apache/lucene/index/IndexFormatTooNewException.java b/lucene/src/java/org/apache/lucene/index/IndexFormatTooNewException.java index 7448d88f758..f5a7149d990 100644 --- a/lucene/src/java/org/apache/lucene/index/IndexFormatTooNewException.java +++ b/lucene/src/java/org/apache/lucene/index/IndexFormatTooNewException.java @@ -17,15 +17,24 @@ package org.apache.lucene.index; +import org.apache.lucene.store.DataInput; + /** * This exception is thrown when Lucene detects * an index that is newer than this Lucene version. */ public class IndexFormatTooNewException extends CorruptIndexException { - public IndexFormatTooNewException(String filename, int version, int minVersion, int maxVersion) { - super("Format version is not supported" + (filename!=null ? (" in file '" + filename + "'") : "") + - ": " + version + " (needs to be between " + minVersion + " and " + maxVersion + ")"); + /** @lucene.internal */ + public IndexFormatTooNewException(String resourceDesc, int version, int minVersion, int maxVersion) { + super("Format version is not supported (resource: " + resourceDesc + "): " + + version + " (needs to be between " + minVersion + " and " + maxVersion + ")"); + assert resourceDesc != null; + } + + /** @lucene.internal */ + public IndexFormatTooNewException(DataInput in, int version, int minVersion, int maxVersion) { + this(in.toString(), version, minVersion, maxVersion); } } diff --git a/lucene/src/java/org/apache/lucene/index/IndexFormatTooOldException.java b/lucene/src/java/org/apache/lucene/index/IndexFormatTooOldException.java index b8f9356cfd4..5c2920ea982 100644 --- a/lucene/src/java/org/apache/lucene/index/IndexFormatTooOldException.java +++ b/lucene/src/java/org/apache/lucene/index/IndexFormatTooOldException.java @@ -17,21 +17,36 @@ package org.apache.lucene.index; +import org.apache.lucene.store.DataInput; + /** * This exception is thrown when Lucene detects * an index that is too old for this Lucene version */ public class IndexFormatTooOldException extends CorruptIndexException { - public IndexFormatTooOldException(String filename, String version) { - super("Format version is not supported" + (filename!=null ? (" in file '" + filename + "'") : "") + - ": " + version + ". This version of Lucene only supports indexes created with release 3.0 and later."); - } - - public IndexFormatTooOldException(String filename, int version, int minVersion, int maxVersion) { - super("Format version is not supported" + (filename!=null ? (" in file '" + filename + "'") : "") + - ": " + version + " (needs to be between " + minVersion + " and " + maxVersion + - "). This version of Lucene only supports indexes created with release 3.0 and later."); + /** @lucene.internal */ + public IndexFormatTooOldException(String resourceDesc, String version) { + super("Format version is not supported (resource: " + resourceDesc + "): " + + version + ". This version of Lucene only supports indexes created with release 3.0 and later."); + assert resourceDesc != null; } + /** @lucene.internal */ + public IndexFormatTooOldException(DataInput in, String version) { + this(in.toString(), version); + } + + /** @lucene.internal */ + public IndexFormatTooOldException(String resourceDesc, int version, int minVersion, int maxVersion) { + super("Format version is not supported (resource: " + resourceDesc + "): " + + version + " (needs to be between " + minVersion + " and " + maxVersion + + "). This version of Lucene only supports indexes created with release 3.0 and later."); + assert resourceDesc != null; + } + + /** @lucene.internal */ + public IndexFormatTooOldException(DataInput in, int version, int minVersion, int maxVersion) { + this(in.toString(), version, minVersion, maxVersion); + } } diff --git a/lucene/src/java/org/apache/lucene/index/PrefixCodedTerms.java b/lucene/src/java/org/apache/lucene/index/PrefixCodedTerms.java index 3c7cd96e8ca..3b7e2095c2d 100644 --- a/lucene/src/java/org/apache/lucene/index/PrefixCodedTerms.java +++ b/lucene/src/java/org/apache/lucene/index/PrefixCodedTerms.java @@ -20,7 +20,6 @@ package org.apache.lucene.index; import java.io.IOException; import java.util.Iterator; -import org.apache.lucene.index.Term; import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.RAMFile; import org.apache.lucene.store.RAMInputStream; @@ -56,7 +55,7 @@ class PrefixCodedTerms implements Iterable { PrefixCodedTermsIterator() { try { - input = new RAMInputStream(buffer); + input = new RAMInputStream("PrefixCodedTermsIterator", buffer); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/lucene/src/java/org/apache/lucene/index/SegmentInfos.java b/lucene/src/java/org/apache/lucene/index/SegmentInfos.java index 1040674f9df..467106ac561 100644 --- a/lucene/src/java/org/apache/lucene/index/SegmentInfos.java +++ b/lucene/src/java/org/apache/lucene/index/SegmentInfos.java @@ -255,10 +255,10 @@ public final class SegmentInfos implements Cloneable, Iterable { // check that it is a format we can understand if (format > DefaultSegmentInfosWriter.FORMAT_MINIMUM) - throw new IndexFormatTooOldException(segmentFileName, format, + throw new IndexFormatTooOldException(input, format, DefaultSegmentInfosWriter.FORMAT_MINIMUM, DefaultSegmentInfosWriter.FORMAT_CURRENT); if (format < DefaultSegmentInfosWriter.FORMAT_CURRENT) - throw new IndexFormatTooNewException(segmentFileName, format, + throw new IndexFormatTooNewException(input, format, DefaultSegmentInfosWriter.FORMAT_MINIMUM, DefaultSegmentInfosWriter.FORMAT_CURRENT); if (format <= DefaultSegmentInfosWriter.FORMAT_4_0) { @@ -271,7 +271,7 @@ public final class SegmentInfos implements Cloneable, Iterable { final long checksumNow = input.getChecksum(); final long checksumThen = input.readLong(); if (checksumNow != checksumThen) - throw new CorruptIndexException("checksum mismatch in segments file"); + throw new CorruptIndexException("checksum mismatch in segments file (resource: " + input + ")"); success = true; } finally { @@ -634,8 +634,7 @@ public final class SegmentInfos implements Cloneable, Iterable { } } else { /* TODO: Investigate this! - throw new IndexFormatTooNewException("segments.gen version number invalid: " + version + - " (must be " + FORMAT_SEGMENTS_GEN_CURRENT + ")"); + throw new IndexFormatTooNewException(genInput, version, FORMAT_SEGMENTS_GEN_CURRENT, FORMAT_SEGMENTS_GEN_CURRENT); */ } } catch (IOException err2) { diff --git a/lucene/src/java/org/apache/lucene/index/TermVectorsReader.java b/lucene/src/java/org/apache/lucene/index/TermVectorsReader.java index 6bff56b005d..9be9071caf7 100644 --- a/lucene/src/java/org/apache/lucene/index/TermVectorsReader.java +++ b/lucene/src/java/org/apache/lucene/index/TermVectorsReader.java @@ -17,12 +17,9 @@ package org.apache.lucene.index; * limitations under the License. */ -import org.apache.lucene.index.MergePolicy.OneMerge; -import org.apache.lucene.store.BufferedIndexInput; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; import org.apache.lucene.store.IndexInput; -import org.apache.lucene.store.IOContext.Context; import org.apache.lucene.util.ArrayUtil; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.IOUtils; @@ -186,9 +183,9 @@ class TermVectorsReader implements Cloneable, Closeable { { int format = in.readInt(); if (format < FORMAT_MINIMUM) - throw new IndexFormatTooOldException(fn, format, FORMAT_MINIMUM, FORMAT_CURRENT); + throw new IndexFormatTooOldException(in, format, FORMAT_MINIMUM, FORMAT_CURRENT); if (format > FORMAT_CURRENT) - throw new IndexFormatTooNewException(fn, format, FORMAT_MINIMUM, FORMAT_CURRENT); + throw new IndexFormatTooNewException(in, format, FORMAT_MINIMUM, FORMAT_CURRENT); return format; } diff --git a/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsReader.java b/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsReader.java index eda8b0b0f4f..0aeee861621 100644 --- a/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsReader.java +++ b/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsReader.java @@ -88,9 +88,9 @@ public final class DefaultFieldsReader extends FieldsReader implements Cloneable try { int format = idxStream.readInt(); if (format < DefaultFieldsWriter.FORMAT_MINIMUM) - throw new IndexFormatTooOldException(indexStreamFN, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); + throw new IndexFormatTooOldException(idxStream, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); if (format > DefaultFieldsWriter.FORMAT_CURRENT) - throw new IndexFormatTooNewException(indexStreamFN, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); + throw new IndexFormatTooNewException(idxStream, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); } finally { idxStream.close(); } @@ -128,9 +128,9 @@ public final class DefaultFieldsReader extends FieldsReader implements Cloneable format = cloneableIndexStream.readInt(); if (format < DefaultFieldsWriter.FORMAT_MINIMUM) - throw new IndexFormatTooOldException(indexStreamFN, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); + throw new IndexFormatTooOldException(cloneableIndexStream, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); if (format > DefaultFieldsWriter.FORMAT_CURRENT) - throw new IndexFormatTooNewException(indexStreamFN, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); + throw new IndexFormatTooNewException(cloneableIndexStream, format, DefaultFieldsWriter.FORMAT_MINIMUM, DefaultFieldsWriter.FORMAT_CURRENT); fieldsStream = (IndexInput) cloneableFieldsStream.clone(); @@ -271,33 +271,4 @@ public final class DefaultFieldsReader extends FieldsReader implements Cloneable return fieldsStream; } - - /** - * Skip the field. We still have to read some of the information about the field, but can skip past the actual content. - * This will have the most payoff on large fields. - */ - private void skipField(int numeric) throws IOException { - final int numBytes; - switch(numeric) { - case 0: - numBytes = fieldsStream.readVInt(); - break; - case DefaultFieldsWriter.FIELD_IS_NUMERIC_INT: - case DefaultFieldsWriter.FIELD_IS_NUMERIC_FLOAT: - numBytes = 4; - break; - case DefaultFieldsWriter.FIELD_IS_NUMERIC_LONG: - case DefaultFieldsWriter.FIELD_IS_NUMERIC_DOUBLE: - numBytes = 8; - break; - default: - throw new FieldReaderException("Invalid numeric type: " + Integer.toHexString(numeric)); - } - - skipFieldBytes(numBytes); - } - - private void skipFieldBytes(int toRead) throws IOException { - fieldsStream.seek(fieldsStream.getFilePointer() + toRead); - } } diff --git a/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java b/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java index 6518f6251b8..d138127c0f3 100644 --- a/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java +++ b/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java @@ -64,7 +64,7 @@ public class DefaultSegmentInfosReader extends SegmentInfosReader { IndexFileNames.COMPOUND_FILE_STORE_EXTENSION), context, false); } } else if (si.getUseCompoundFile()) { - dir = new CompoundFileDirectory(dir,IndexFileNames.segmentFileName( + dir = new CompoundFileDirectory(dir, IndexFileNames.segmentFileName( si.name, "", IndexFileNames.COMPOUND_FILE_EXTENSION), context, false); } @@ -83,7 +83,7 @@ public class DefaultSegmentInfosReader extends SegmentInfosReader { // If it's a 3x index touched by 3.1+ code, then segments record their // version, whether they are 2.x ones or not. We detect that and throw // appropriate exception. - throw new IndexFormatTooOldException(si.name, si.getVersion()); + throw new IndexFormatTooOldException("segment " + si.name + " in resource " + input, si.getVersion()); } infos.add(si); } diff --git a/lucene/src/java/org/apache/lucene/index/codecs/MultiLevelSkipListReader.java b/lucene/src/java/org/apache/lucene/index/codecs/MultiLevelSkipListReader.java index bef7f11414a..65bce2bce9a 100644 --- a/lucene/src/java/org/apache/lucene/index/codecs/MultiLevelSkipListReader.java +++ b/lucene/src/java/org/apache/lucene/index/codecs/MultiLevelSkipListReader.java @@ -255,6 +255,7 @@ public abstract class MultiLevelSkipListReader { private int pos; SkipBuffer(IndexInput input, int length) throws IOException { + super("SkipBuffer on " + input); data = new byte[length]; pointer = input.getFilePointer(); input.readBytes(data, 0, length); diff --git a/lucene/src/java/org/apache/lucene/index/codecs/lucene3x/SegmentTermEnum.java b/lucene/src/java/org/apache/lucene/index/codecs/lucene3x/SegmentTermEnum.java index 1bb854f03e0..cac23c3d32c 100644 --- a/lucene/src/java/org/apache/lucene/index/codecs/lucene3x/SegmentTermEnum.java +++ b/lucene/src/java/org/apache/lucene/index/codecs/lucene3x/SegmentTermEnum.java @@ -85,9 +85,9 @@ public final class SegmentTermEnum implements Cloneable { // check that it is a format we can understand if (format > FORMAT_MINIMUM) - throw new IndexFormatTooOldException(null, format, FORMAT_MINIMUM, FORMAT_CURRENT); + throw new IndexFormatTooOldException(input, format, FORMAT_MINIMUM, FORMAT_CURRENT); if (format < FORMAT_CURRENT) - throw new IndexFormatTooNewException(null, format, FORMAT_MINIMUM, FORMAT_CURRENT); + throw new IndexFormatTooNewException(input, format, FORMAT_MINIMUM, FORMAT_CURRENT); size = input.readLong(); // read the size diff --git a/lucene/src/java/org/apache/lucene/index/codecs/lucene40/Lucene40PostingsWriter.java b/lucene/src/java/org/apache/lucene/index/codecs/lucene40/Lucene40PostingsWriter.java index ef93fc554f2..7a4df561321 100644 --- a/lucene/src/java/org/apache/lucene/index/codecs/lucene40/Lucene40PostingsWriter.java +++ b/lucene/src/java/org/apache/lucene/index/codecs/lucene40/Lucene40PostingsWriter.java @@ -163,7 +163,7 @@ public final class Lucene40PostingsWriter extends PostingsWriterBase { final int delta = docID - lastDocID; if (docID < 0 || (df > 0 && delta <= 0)) { - throw new CorruptIndexException("docs out of order (" + docID + " <= " + lastDocID + " )"); + throw new CorruptIndexException("docs out of order (" + docID + " <= " + lastDocID + " ) (freqOut: " + freqOut + ")"); } if ((++df % skipInterval) == 0) { diff --git a/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsWriter.java b/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsWriter.java index 7031e5c3f64..4ae97ed8310 100644 --- a/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsWriter.java +++ b/lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsWriter.java @@ -20,7 +20,6 @@ package org.apache.lucene.index.codecs.sep; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.DocsEnum; @@ -203,7 +202,7 @@ public final class SepPostingsWriter extends PostingsWriterBase { //System.out.println("SEPW: startDoc: write doc=" + docID + " delta=" + delta + " out.fp=" + docOut); if (docID < 0 || (df > 0 && delta <= 0)) { - throw new CorruptIndexException("docs out of order (" + docID + " <= " + lastDocID + " )"); + throw new CorruptIndexException("docs out of order (" + docID + " <= " + lastDocID + " ) (docOut: " + docOut + ")"); } if ((++df % skipInterval) == 0) { diff --git a/lucene/src/java/org/apache/lucene/store/BufferedIndexInput.java b/lucene/src/java/org/apache/lucene/store/BufferedIndexInput.java index 9d4e5a25a23..a5eb0515bb4 100644 --- a/lucene/src/java/org/apache/lucene/store/BufferedIndexInput.java +++ b/lucene/src/java/org/apache/lucene/store/BufferedIndexInput.java @@ -51,14 +51,17 @@ public abstract class BufferedIndexInput extends IndexInput { return buffer[bufferPosition++]; } - public BufferedIndexInput() {} - - public BufferedIndexInput(IOContext context) { - this(bufferSize(context)); + public BufferedIndexInput(String resourceDesc) { + this(resourceDesc, BUFFER_SIZE); + } + + public BufferedIndexInput(String resourceDesc, IOContext context) { + this(resourceDesc, bufferSize(context)); } /** Inits BufferedIndexInput with a specific bufferSize */ - public BufferedIndexInput(int bufferSize) { + public BufferedIndexInput(String resourceDesc, int bufferSize) { + super(resourceDesc); checkBufferSize(bufferSize); this.bufferSize = bufferSize; } diff --git a/lucene/src/java/org/apache/lucene/store/ChecksumIndexInput.java b/lucene/src/java/org/apache/lucene/store/ChecksumIndexInput.java index e868501f71c..e3ac0e42179 100644 --- a/lucene/src/java/org/apache/lucene/store/ChecksumIndexInput.java +++ b/lucene/src/java/org/apache/lucene/store/ChecksumIndexInput.java @@ -31,6 +31,7 @@ public class ChecksumIndexInput extends IndexInput { Checksum digest; public ChecksumIndexInput(IndexInput main) { + super("ChecksumIndexInput(" + main + ")"); this.main = main; digest = new CRC32(); } diff --git a/lucene/src/java/org/apache/lucene/store/CompoundFileDirectory.java b/lucene/src/java/org/apache/lucene/store/CompoundFileDirectory.java index cb00e4dbf07..b19dcbaa867 100644 --- a/lucene/src/java/org/apache/lucene/store/CompoundFileDirectory.java +++ b/lucene/src/java/org/apache/lucene/store/CompoundFileDirectory.java @@ -139,7 +139,7 @@ public final class CompoundFileDirectory extends Directory { if (firstInt < CompoundFileWriter.FORMAT_PRE_VERSION) { if (firstInt < CompoundFileWriter.FORMAT_CURRENT) { throw new CorruptIndexException("Incompatible format version: " - + firstInt + " expected " + CompoundFileWriter.FORMAT_CURRENT); + + firstInt + " expected " + CompoundFileWriter.FORMAT_CURRENT + " (resource: " + stream + ")"); } // It's a post-3.1 index, read the count. count = stream.readVInt(); @@ -155,7 +155,7 @@ public final class CompoundFileDirectory extends Directory { for (int i=0; i streamLength) { - throw new CorruptIndexException("Invalid CFS entry offset: " + offset); + throw new CorruptIndexException("Invalid CFS entry offset: " + offset + " (resource: " + stream + ")"); } String id = stream.readString(); @@ -218,7 +218,7 @@ public final class CompoundFileDirectory extends Directory { if (entry == null) { throw new IOException("No sub-file with id " + id + " found (fileName=" + name + " files: " + entries.keySet() + ")"); } - return handle.openSlice(entry.offset, entry.length); + return handle.openSlice(name, entry.offset, entry.length); } /** Returns an array of strings, one for each file in the directory. */ @@ -318,13 +318,13 @@ public final class CompoundFileDirectory extends Directory { } @Override - public IndexInput openSlice(long offset, long length) throws IOException { - return handle.openSlice(entry.offset + offset, length); + public IndexInput openSlice(String sliceDescription, long offset, long length) throws IOException { + return handle.openSlice(sliceDescription, entry.offset + offset, length); } @Override public IndexInput openFullSlice() throws IOException { - return openSlice(0, entry.length); + return openSlice("full-slice", 0, entry.length); } }; } diff --git a/lucene/src/java/org/apache/lucene/store/Directory.java b/lucene/src/java/org/apache/lucene/store/Directory.java index 339b161c937..82b2604f2a5 100644 --- a/lucene/src/java/org/apache/lucene/store/Directory.java +++ b/lucene/src/java/org/apache/lucene/store/Directory.java @@ -225,8 +225,8 @@ public abstract class Directory implements Closeable { return new IndexInputSlicer() { private final IndexInput base = Directory.this.openInput(name, context); @Override - public IndexInput openSlice(long offset, long length) { - return new SlicedIndexInput(base, offset, length); + public IndexInput openSlice(String sliceDescription, long offset, long length) { + return new SlicedIndexInput("SlicedIndexInput(" + sliceDescription + " in " + base + ")", base, offset, length); } @Override public void close() throws IOException { @@ -258,7 +258,7 @@ public abstract class Directory implements Closeable { /** * Returns an {@link IndexInput} slice starting at the given offset with the given length. */ - public abstract IndexInput openSlice(long offset, long length) throws IOException; + public abstract IndexInput openSlice(String sliceDescription, long offset, long length) throws IOException; /** * Returns an {@link IndexInput} slice starting at offset 0 with a @@ -275,12 +275,12 @@ public abstract class Directory implements Closeable { long fileOffset; long length; - SlicedIndexInput(final IndexInput base, final long fileOffset, final long length) { - this(base, fileOffset, length, BufferedIndexInput.BUFFER_SIZE); + SlicedIndexInput(final String sliceDescription, final IndexInput base, final long fileOffset, final long length) { + this(sliceDescription, base, fileOffset, length, BufferedIndexInput.BUFFER_SIZE); } - SlicedIndexInput(final IndexInput base, final long fileOffset, final long length, int readBufferSize) { - super(readBufferSize); + SlicedIndexInput(final String sliceDescription, final IndexInput base, final long fileOffset, final long length, int readBufferSize) { + super("SlicedIndexInput(" + sliceDescription + " in " + base + " slice=" + fileOffset + ":" + (fileOffset+length) + ")", readBufferSize); this.base = (IndexInput) base.clone(); this.fileOffset = fileOffset; this.length = length; diff --git a/lucene/src/java/org/apache/lucene/store/IndexInput.java b/lucene/src/java/org/apache/lucene/store/IndexInput.java index b2ef20c3179..973ee5ab243 100644 --- a/lucene/src/java/org/apache/lucene/store/IndexInput.java +++ b/lucene/src/java/org/apache/lucene/store/IndexInput.java @@ -26,6 +26,18 @@ import java.io.IOException; */ public abstract class IndexInput extends DataInput implements Cloneable,Closeable { + private final String resourceDescription; + + /** resourceDescription should be a non-null, opaque string + * describing this resource; it's returned from + * {@link #toString}. */ + protected IndexInput(String resourceDescription) { + if (resourceDescription == null) { + throw new IllegalArgumentException("resourceDescription must not be null"); + } + this.resourceDescription = resourceDescription; + } + /** Closes the stream to further operations. */ public abstract void close() throws IOException; @@ -66,5 +78,9 @@ public abstract class IndexInput extends DataInput implements Cloneable,Closeabl numBytes -= toCopy; } } - + + @Override + public String toString() { + return resourceDescription; + } } diff --git a/lucene/src/java/org/apache/lucene/store/MMapDirectory.java b/lucene/src/java/org/apache/lucene/store/MMapDirectory.java index a5f406b8910..e89e9f80ba4 100644 --- a/lucene/src/java/org/apache/lucene/store/MMapDirectory.java +++ b/lucene/src/java/org/apache/lucene/store/MMapDirectory.java @@ -213,7 +213,7 @@ public class MMapDirectory extends FSDirectory { File f = new File(getDirectory(), name); RandomAccessFile raf = new RandomAccessFile(f, "r"); try { - return new MMapIndexInput(raf, 0, raf.length(), chunkSizePower); + return new MMapIndexInput("MMapIndexInput(path=\"" + f + "\")", raf, 0, raf.length(), chunkSizePower); } finally { raf.close(); } @@ -221,7 +221,7 @@ public class MMapDirectory extends FSDirectory { public IndexInputSlicer createSlicer(final String name, final IOContext context) throws IOException { ensureOpen(); - File f = new File(getDirectory(), name); + final File f = new File(getDirectory(), name); final RandomAccessFile raf = new RandomAccessFile(f, "r"); return new IndexInputSlicer() { @Override @@ -230,13 +230,13 @@ public class MMapDirectory extends FSDirectory { } @Override - public IndexInput openSlice(long offset, long length) throws IOException { - return new MMapIndexInput(raf, offset, length, chunkSizePower); + public IndexInput openSlice(String sliceDescription, long offset, long length) throws IOException { + return new MMapIndexInput("MMapIndexInput(" + sliceDescription + " in path=\"" + f + "\" slice=" + offset + ":" + (offset+length) + ")", raf, offset, length, chunkSizePower); } @Override public IndexInput openFullSlice() throws IOException { - return openSlice(0, raf.length()); + return openSlice("full-slice", 0, raf.length()); } }; } @@ -256,8 +256,9 @@ public class MMapDirectory extends FSDirectory { private ByteBuffer curBuf; // redundant for speed: buffers[curBufIndex] private boolean isClone = false; - - MMapIndexInput(RandomAccessFile raf, long offset, long length, int chunkSizePower) throws IOException { + + MMapIndexInput(String resourceDescription, RandomAccessFile raf, long offset, long length, int chunkSizePower) throws IOException { + super(resourceDescription); this.length = length; this.chunkSizePower = chunkSizePower; this.chunkSize = 1L << chunkSizePower; @@ -296,8 +297,9 @@ public class MMapDirectory extends FSDirectory { } catch (BufferUnderflowException e) { do { curBufIndex++; - if (curBufIndex >= buffers.length) - throw new IOException("read past EOF"); + if (curBufIndex >= buffers.length) { + throw new IOException("read past EOF: " + this); + } curBuf = buffers[curBufIndex]; curBuf.position(0); } while (!curBuf.hasRemaining()); @@ -316,8 +318,9 @@ public class MMapDirectory extends FSDirectory { len -= curAvail; offset += curAvail; curBufIndex++; - if (curBufIndex >= buffers.length) - throw new IOException("read past EOF"); + if (curBufIndex >= buffers.length) { + throw new IOException("read past EOF: " + this); + } curBuf = buffers[curBufIndex]; curBuf.position(0); curAvail = curBuf.remaining(); @@ -369,13 +372,15 @@ public class MMapDirectory extends FSDirectory { this.curBufIndex = bi; this.curBuf = b; } catch (ArrayIndexOutOfBoundsException aioobe) { - if (pos < 0L) - throw new IllegalArgumentException("Seeking to negative position"); + if (pos < 0L) { + throw new IllegalArgumentException("Seeking to negative position: " + this); + } throw new IOException("seek past EOF"); } catch (IllegalArgumentException iae) { - if (pos < 0L) - throw new IllegalArgumentException("Seeking to negative position"); - throw new IOException("seek past EOF"); + if (pos < 0L) { + throw new IllegalArgumentException("Seeking to negative position: " + this); + } + throw new IOException("seek past EOF: " + this); } } @@ -386,8 +391,9 @@ public class MMapDirectory extends FSDirectory { @Override public Object clone() { - if (buffers == null) - throw new AlreadyClosedException("MMapIndexInput already closed"); + if (buffers == null) { + throw new AlreadyClosedException("MMapIndexInput already closed: " + this); + } final MMapIndexInput clone = (MMapIndexInput)super.clone(); clone.isClone = true; clone.buffers = new ByteBuffer[buffers.length]; @@ -399,7 +405,7 @@ public class MMapDirectory extends FSDirectory { try { clone.seek(getFilePointer()); } catch(IOException ioe) { - throw new RuntimeException("Should never happen", ioe); + throw new RuntimeException("Should never happen: " + this, ioe); } return clone; } diff --git a/lucene/src/java/org/apache/lucene/store/NIOFSDirectory.java b/lucene/src/java/org/apache/lucene/store/NIOFSDirectory.java index 42c18216309..0e8ffda36c4 100644 --- a/lucene/src/java/org/apache/lucene/store/NIOFSDirectory.java +++ b/lucene/src/java/org/apache/lucene/store/NIOFSDirectory.java @@ -83,8 +83,8 @@ public class NIOFSDirectory extends FSDirectory { public IndexInputSlicer createSlicer(final String name, final IOContext context) throws IOException { ensureOpen(); - final File file = new File(getDirectory(), name); - final Descriptor descriptor = new Descriptor(file, "r"); + final File path = new File(getDirectory(), name); + final Descriptor descriptor = new Descriptor(path, "r"); return new Directory.IndexInputSlicer() { @Override @@ -93,14 +93,14 @@ public class NIOFSDirectory extends FSDirectory { } @Override - public IndexInput openSlice(long offset, long length) throws IOException { - return new NIOFSIndexInput(descriptor, descriptor.getChannel(), offset, + public IndexInput openSlice(String sliceDescription, long offset, long length) throws IOException { + return new NIOFSIndexInput(sliceDescription, path, descriptor, descriptor.getChannel(), offset, length, BufferedIndexInput.bufferSize(context), getReadChunkSize()); } @Override public IndexInput openFullSlice() throws IOException { - return openSlice(0, descriptor.length); + return openSlice("full-slice", 0, descriptor.length); } }; } @@ -115,12 +115,12 @@ public class NIOFSDirectory extends FSDirectory { final FileChannel channel; public NIOFSIndexInput(File path, IOContext context, int chunkSize) throws IOException { - super(path, context, chunkSize); + super("NIOFSIndexInput(path=\"" + path + "\")", path, context, chunkSize); channel = file.getChannel(); } - public NIOFSIndexInput(Descriptor file, FileChannel fc, long off, long length, int bufferSize, int chunkSize) throws IOException { - super(file, off, length, bufferSize, chunkSize); + public NIOFSIndexInput(String sliceDescription, File path, Descriptor file, FileChannel fc, long off, long length, int bufferSize, int chunkSize) throws IOException { + super("NIOFSIndexInput(" + sliceDescription + " in path=\"" + path + "\" slice=" + off + ":" + (off+length) + ")", file, off, length, bufferSize, chunkSize); channel = fc; isClone = true; } @@ -181,7 +181,7 @@ public class NIOFSDirectory extends FSDirectory { long pos = getFilePointer() + off; if (pos + len > end) { - throw new IOException("read past EOF"); + throw new IOException("read past EOF: " + this); } try { @@ -209,6 +209,8 @@ public class NIOFSDirectory extends FSDirectory { + "with a value smaller than the current chunk size (" + chunkSize + ")"); outOfMemoryError.initCause(e); throw outOfMemoryError; + } catch (IOException ioe) { + throw new IOException(ioe.getMessage() + ": " + this, ioe); } } } diff --git a/lucene/src/java/org/apache/lucene/store/RAMDirectory.java b/lucene/src/java/org/apache/lucene/store/RAMDirectory.java index 0e0cc184a0c..81b815ea763 100644 --- a/lucene/src/java/org/apache/lucene/store/RAMDirectory.java +++ b/lucene/src/java/org/apache/lucene/store/RAMDirectory.java @@ -183,7 +183,7 @@ public class RAMDirectory extends Directory { if (file == null) { throw new FileNotFoundException(name); } - return new RAMInputStream(file); + return new RAMInputStream(name, file); } /** Closes the store to future operations, releasing associated memory. */ diff --git a/lucene/src/java/org/apache/lucene/store/RAMInputStream.java b/lucene/src/java/org/apache/lucene/store/RAMInputStream.java index 2edde9afaa0..d58ff725a90 100644 --- a/lucene/src/java/org/apache/lucene/store/RAMInputStream.java +++ b/lucene/src/java/org/apache/lucene/store/RAMInputStream.java @@ -18,6 +18,7 @@ package org.apache.lucene.store; */ import java.io.IOException; +import java.io.EOFException; /** A memory-resident {@link IndexInput} implementation. * @@ -35,11 +36,12 @@ public class RAMInputStream extends IndexInput implements Cloneable { private long bufferStart; private int bufferLength; - public RAMInputStream(RAMFile f) throws IOException { + public RAMInputStream(String name, RAMFile f) throws IOException { + super("RAMInputStream(name=" + name + ")"); file = f; length = file.length; if (length/BUFFER_SIZE >= Integer.MAX_VALUE) { - throw new IOException("Too large RAMFile! "+length); + throw new IOException("RAMInputStream too large length=" + length + ": " + name); } // make sure that we switch to the @@ -88,9 +90,9 @@ public class RAMInputStream extends IndexInput implements Cloneable { bufferStart = (long) BUFFER_SIZE * (long) currentBufferIndex; if (currentBufferIndex >= file.numBuffers()) { // end of file reached, no more buffers left - if (enforceEOF) - throw new IOException("Read past EOF"); - else { + if (enforceEOF) { + throw new EOFException("Read past EOF: " + this); + } else { // Force EOF if a read takes place at this position currentBufferIndex--; bufferPosition = BUFFER_SIZE; diff --git a/lucene/src/java/org/apache/lucene/store/SimpleFSDirectory.java b/lucene/src/java/org/apache/lucene/store/SimpleFSDirectory.java index ba7c220183b..fc307a5d19b 100644 --- a/lucene/src/java/org/apache/lucene/store/SimpleFSDirectory.java +++ b/lucene/src/java/org/apache/lucene/store/SimpleFSDirectory.java @@ -55,10 +55,9 @@ public class SimpleFSDirectory extends FSDirectory { @Override public IndexInput openInput(String name, IOContext context) throws IOException { ensureOpen(); - return new SimpleFSIndexInput(new File(directory, name), context, getReadChunkSize()); + final File path = new File(directory, name); + return new SimpleFSIndexInput("SimpleFSIndexInput(path=\"" + path.getPath() + "\")", path, context, getReadChunkSize()); } - - public IndexInputSlicer createSlicer(final String name, final IOContext context) throws IOException { @@ -73,19 +72,18 @@ public class SimpleFSDirectory extends FSDirectory { } @Override - public IndexInput openSlice(long offset, long length) throws IOException { - return new SimpleFSIndexInput(descriptor, offset, + public IndexInput openSlice(String sliceDescription, long offset, long length) throws IOException { + return new SimpleFSIndexInput("SimpleFSIndexInput(" + sliceDescription + " in path=\"" + file.getPath() + "\" slice=" + offset + ":" + (offset+length) + ")", descriptor, offset, length, BufferedIndexInput.bufferSize(context), getReadChunkSize()); } @Override public IndexInput openFullSlice() throws IOException { - return openSlice(0, descriptor.length); + return openSlice("full-slice", 0, descriptor.length); } }; } - protected static class SimpleFSIndexInput extends BufferedIndexInput { protected static class Descriptor extends RandomAccessFile { @@ -117,16 +115,16 @@ public class SimpleFSDirectory extends FSDirectory { protected final long off; protected final long end; - public SimpleFSIndexInput(File path, IOContext context, int chunkSize) throws IOException { - super(context); + public SimpleFSIndexInput(String resourceDesc, File path, IOContext context, int chunkSize) throws IOException { + super(resourceDesc, context); this.file = new Descriptor(path, "r"); this.chunkSize = chunkSize; this.off = 0L; this.end = file.length; } - public SimpleFSIndexInput(Descriptor file, long off, long length, int bufferSize, int chunkSize) throws IOException { - super(bufferSize); + public SimpleFSIndexInput(String resourceDesc, Descriptor file, long off, long length, int bufferSize, int chunkSize) throws IOException { + super(resourceDesc, bufferSize); this.file = file; this.chunkSize = chunkSize; this.off = off; @@ -147,7 +145,7 @@ public class SimpleFSDirectory extends FSDirectory { int total = 0; if (position + len > end) { - throw new IOException("read past EOF"); + throw new IOException("read past EOF: " + this); } try { @@ -172,6 +170,8 @@ public class SimpleFSDirectory extends FSDirectory { + "with a value smaller than the current chunk size (" + chunkSize + ")"); outOfMemoryError.initCause(e); throw outOfMemoryError; + } catch (IOException ioe) { + throw new IOException(ioe.getMessage() + ": " + this, ioe); } } } diff --git a/lucene/src/java/org/apache/lucene/util/CodecUtil.java b/lucene/src/java/org/apache/lucene/util/CodecUtil.java index f7b271160c6..2f2605de37d 100644 --- a/lucene/src/java/org/apache/lucene/util/CodecUtil.java +++ b/lucene/src/java/org/apache/lucene/util/CodecUtil.java @@ -18,13 +18,13 @@ package org.apache.lucene.util; */ -import org.apache.lucene.store.DataInput; -import org.apache.lucene.store.DataOutput; +import java.io.IOException; + import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexFormatTooNewException; import org.apache.lucene.index.IndexFormatTooOldException; - -import java.io.IOException; +import org.apache.lucene.store.DataInput; +import org.apache.lucene.store.DataOutput; /** * @lucene.experimental @@ -56,20 +56,20 @@ public final class CodecUtil { // Safety to guard against reading a bogus string: final int actualHeader = in.readInt(); if (actualHeader != CODEC_MAGIC) { - throw new CorruptIndexException("codec header mismatch: actual header=" + actualHeader + " vs expected header=" + CODEC_MAGIC); + throw new CorruptIndexException("codec header mismatch: actual header=" + actualHeader + " vs expected header=" + CODEC_MAGIC + " (resource: " + in + ")"); } final String actualCodec = in.readString(); if (!actualCodec.equals(codec)) { - throw new CorruptIndexException("codec mismatch: actual codec=" + actualCodec + " vs expected codec=" + codec); + throw new CorruptIndexException("codec mismatch: actual codec=" + actualCodec + " vs expected codec=" + codec + " (resource: " + in + ")"); } final int actualVersion = in.readInt(); if (actualVersion < minVersion) { - throw new IndexFormatTooOldException(null, actualVersion, minVersion, maxVersion); + throw new IndexFormatTooOldException(in, actualVersion, minVersion, maxVersion); } if (actualVersion > maxVersion) { - throw new IndexFormatTooNewException(null, actualVersion, minVersion, maxVersion); + throw new IndexFormatTooNewException(in, actualVersion, minVersion, maxVersion); } return actualVersion; diff --git a/lucene/src/test-framework/java/org/apache/lucene/index/MockIndexInput.java b/lucene/src/test-framework/java/org/apache/lucene/index/MockIndexInput.java index 1e2346cbdfd..f1006f6a8d0 100644 --- a/lucene/src/test-framework/java/org/apache/lucene/index/MockIndexInput.java +++ b/lucene/src/test-framework/java/org/apache/lucene/index/MockIndexInput.java @@ -25,6 +25,7 @@ public class MockIndexInput extends BufferedIndexInput { private long length; public MockIndexInput(byte[] bytes) { + super("MockIndexInput", BufferedIndexInput.BUFFER_SIZE); buffer = bytes; length = bytes.length; } diff --git a/lucene/src/test-framework/java/org/apache/lucene/store/MockDirectoryWrapper.java b/lucene/src/test-framework/java/org/apache/lucene/store/MockDirectoryWrapper.java index c4c00fa1c96..55b67249d67 100644 --- a/lucene/src/test-framework/java/org/apache/lucene/store/MockDirectoryWrapper.java +++ b/lucene/src/test-framework/java/org/apache/lucene/store/MockDirectoryWrapper.java @@ -673,9 +673,9 @@ public class MockDirectoryWrapper extends Directory { } @Override - public IndexInput openSlice(long offset, long length) throws IOException { + public IndexInput openSlice(String sliceDescription, long offset, long length) throws IOException { maybeYield(); - IndexInput ii = new MockIndexInputWrapper(MockDirectoryWrapper.this, name, delegateHandle.openSlice(offset, length)); + IndexInput ii = new MockIndexInputWrapper(MockDirectoryWrapper.this, name, delegateHandle.openSlice(sliceDescription, offset, length)); addFileHandle(ii, name, Handle.Input); return ii; } diff --git a/lucene/src/test-framework/java/org/apache/lucene/store/MockIndexInputWrapper.java b/lucene/src/test-framework/java/org/apache/lucene/store/MockIndexInputWrapper.java index 506a739f218..70bcdd4909c 100644 --- a/lucene/src/test-framework/java/org/apache/lucene/store/MockIndexInputWrapper.java +++ b/lucene/src/test-framework/java/org/apache/lucene/store/MockIndexInputWrapper.java @@ -34,6 +34,7 @@ public class MockIndexInputWrapper extends IndexInput { /** Construct an empty output buffer. */ public MockIndexInputWrapper(MockDirectoryWrapper dir, String name, IndexInput delegate) { + super("MockIndexInputWrapper(name=" + name + " delegate=" + delegate + ")"); this.name = name; this.dir = dir; this.delegate = delegate; diff --git a/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java b/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java index f2cde36cd14..202ba35a42e 100644 --- a/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java +++ b/lucene/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java @@ -122,7 +122,7 @@ public class TestBackwardsCompatibility extends LuceneTestCase { "31.optimized.nocfs", }; - /** This test checks that *only* IndexFormatTooOldExceptions are throws when you open and operate on too old indexes! */ + /** This test checks that *only* IndexFormatTooOldExceptions are thrown when you open and operate on too old indexes! */ public void testUnsupportedOldIndexes() throws Exception { for(int i=0;i