Fixing issue in the cached index input class where the seek method would throw an IOException when seeking beyond the end of the file. The behavior that Lucene allows is to allow the seek be throw an EOFException during the first read.
Project: http://git-wip-us.apache.org/repos/asf/incubator-blur/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-blur/commit/c2110866 Tree: http://git-wip-us.apache.org/repos/asf/incubator-blur/tree/c2110866 Diff: http://git-wip-us.apache.org/repos/asf/incubator-blur/diff/c2110866 Branch: refs/heads/apache-blur-0.2 Commit: c21108663a6e67ebd01d315d8715d910694f1c72 Parents: cc9c6d3 Author: Aaron McCurry <[email protected]> Authored: Mon Feb 3 14:41:15 2014 -0500 Committer: Aaron McCurry <[email protected]> Committed: Mon Feb 3 14:41:15 2014 -0500 ---------------------------------------------------------------------- .../blur/store/blockcache_v2/CacheIndexInput.java | 11 ++++++++++- .../org/apache/blur/store/BaseDirectoryTestSuite.java | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/c2110866/blur-store/src/main/java/org/apache/blur/store/blockcache_v2/CacheIndexInput.java ---------------------------------------------------------------------- diff --git a/blur-store/src/main/java/org/apache/blur/store/blockcache_v2/CacheIndexInput.java b/blur-store/src/main/java/org/apache/blur/store/blockcache_v2/CacheIndexInput.java index 35a03e6..3fdb5b3 100644 --- a/blur-store/src/main/java/org/apache/blur/store/blockcache_v2/CacheIndexInput.java +++ b/blur-store/src/main/java/org/apache/blur/store/blockcache_v2/CacheIndexInput.java @@ -17,6 +17,7 @@ */ package org.apache.blur.store.blockcache_v2; +import java.io.EOFException; import java.io.IOException; import org.apache.blur.store.buffer.BufferStore; @@ -224,11 +225,18 @@ public class CacheIndexInput extends IndexInput { return _position; } + private void checkEOF() throws EOFException { + if (_position >= _fileLength) { + throw new EOFException("read past EOF: " + this.toString()); + } + } + @Override public void seek(long pos) throws IOException { ensureOpen(); if (pos >= _fileLength) { - throw new IOException("Can not seek past end of file [" + pos + "] filelength [" + _fileLength + "]"); + _position = pos; + return; } if (_position == pos) { // Seeking to same position @@ -287,6 +295,7 @@ public class CacheIndexInput extends IndexInput { } private void tryToFill() throws IOException { + checkEOF(); if (!isCacheValueValid() || remaining() == 0) { releaseCache(); fill(); http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/c2110866/blur-store/src/test/java/org/apache/blur/store/BaseDirectoryTestSuite.java ---------------------------------------------------------------------- diff --git a/blur-store/src/test/java/org/apache/blur/store/BaseDirectoryTestSuite.java b/blur-store/src/test/java/org/apache/blur/store/BaseDirectoryTestSuite.java index 03a0358..0f37aab 100644 --- a/blur-store/src/test/java/org/apache/blur/store/BaseDirectoryTestSuite.java +++ b/blur-store/src/test/java/org/apache/blur/store/BaseDirectoryTestSuite.java @@ -28,6 +28,7 @@ import java.util.HashSet; import java.util.Random; import java.util.Set; +import org.apache.blur.index.IndexDeletionPolicyReader; import org.apache.blur.lucene.LuceneVersionConstant; import org.apache.blur.store.blockcache.LastModified; import org.apache.blur.store.buffer.BufferStore; @@ -38,6 +39,7 @@ import org.apache.lucene.document.IntField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.KeepOnlyLastCommitDeletionPolicy; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.TopDocs; @@ -185,6 +187,9 @@ public abstract class BaseDirectoryTestSuite { public void testCreateIndex() throws IOException { long s = System.nanoTime(); IndexWriterConfig conf = new IndexWriterConfig(LuceneVersionConstant.LUCENE_VERSION, new KeywordAnalyzer()); + IndexDeletionPolicyReader indexDeletionPolicy = new IndexDeletionPolicyReader( + new KeepOnlyLastCommitDeletionPolicy()); + conf.setIndexDeletionPolicy(indexDeletionPolicy); FSDirectory control = FSDirectory.open(fileControl); Directory dir = getControlDir(control, directory); // The serial merge scheduler can be useful for debugging. @@ -192,16 +197,23 @@ public abstract class BaseDirectoryTestSuite { IndexWriter writer = new IndexWriter(dir, conf); int numDocs = 10000; DirectoryReader reader = null; + long gen = 0; for (int i = 0; i < 100; i++) { if (reader == null) { reader = DirectoryReader.open(writer, true); + gen = reader.getIndexCommit().getGeneration(); + indexDeletionPolicy.register(gen); } else { DirectoryReader old = reader; reader = DirectoryReader.openIfChanged(old, writer, true); if (reader == null) { reader = old; } else { + long newGen = reader.getIndexCommit().getGeneration(); + indexDeletionPolicy.register(newGen); + indexDeletionPolicy.unregister(gen); old.close(); + gen = newGen; } } assertEquals(i * numDocs, reader.numDocs());
