LUCENE-1196: don't throw EOF when seeking to the end of RAMFile when file is multiple of 1024 in length

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@632120 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael McCandless 2008-02-28 21:13:59 +00:00
parent d7d1d680f2
commit 8f9781bbdb
2 changed files with 26 additions and 5 deletions

View File

@ -62,7 +62,7 @@ class RAMInputStream extends IndexInput implements Cloneable {
public byte readByte() throws IOException {
if (bufferPosition >= bufferLength) {
currentBufferIndex++;
switchCurrentBuffer();
switchCurrentBuffer(true);
}
return currentBuffer[bufferPosition++];
}
@ -71,7 +71,7 @@ class RAMInputStream extends IndexInput implements Cloneable {
while (len > 0) {
if (bufferPosition >= bufferLength) {
currentBufferIndex++;
switchCurrentBuffer();
switchCurrentBuffer(true);
}
int remainInBuffer = bufferLength - bufferPosition;
@ -83,10 +83,16 @@ class RAMInputStream extends IndexInput implements Cloneable {
}
}
private final void switchCurrentBuffer() throws IOException {
private final void switchCurrentBuffer(boolean enforceEOF) throws IOException {
if (currentBufferIndex >= file.numBuffers()) {
// end of file reached, no more buffers left
throw new IOException("Read past EOF");
if (enforceEOF)
throw new IOException("Read past EOF");
else {
// Force EOF if a read takes place at this position
currentBufferIndex--;
bufferPosition = BUFFER_SIZE;
}
} else {
currentBuffer = (byte[]) file.getBuffer(currentBufferIndex);
bufferPosition = 0;
@ -103,7 +109,7 @@ class RAMInputStream extends IndexInput implements Cloneable {
public void seek(long pos) throws IOException {
if (currentBuffer==null || pos < bufferStart || pos >= bufferStart + BUFFER_SIZE) {
currentBufferIndex = (int) (pos / BUFFER_SIZE);
switchCurrentBuffer();
switchCurrentBuffer(false);
}
bufferPosition = (int) (pos % BUFFER_SIZE);
}

View File

@ -33,6 +33,8 @@ import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.English;
@ -214,6 +216,19 @@ public class TestRAMDirectory extends LuceneTestCase {
rmDir (indexDir);
}
}
// LUCENE-1196
public void testIllegalEOF() throws Exception {
RAMDirectory dir = new RAMDirectory();
IndexOutput o = dir.createOutput("out");
byte[] b = new byte[1024];
o.writeBytes(b, 0, 1024);
o.close();
IndexInput i = dir.openInput("out");
i.seek(1024);
i.close();
dir.close();
}
private void rmDir(File dir) {
File[] files = dir.listFiles();