You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by mi...@apache.org on 2008/10/31 17:09:13 UTC
svn commit: r709456 - in /lucene/java/trunk/src:
java/org/apache/lucene/index/DirectoryIndexReader.java
test/org/apache/lucene/index/TestIndexReader.java
Author: mikemccand
Date: Fri Oct 31 09:09:12 2008
New Revision: 709456
URL: http://svn.apache.org/viewvc?rev=709456&view=rev
Log:
LUCENE-1430: don't throw false AlreadyClosedException when IndexReader.open hits IOException on first try opening index
Modified:
lucene/java/trunk/src/java/org/apache/lucene/index/DirectoryIndexReader.java
lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java
Modified: lucene/java/trunk/src/java/org/apache/lucene/index/DirectoryIndexReader.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/DirectoryIndexReader.java?rev=709456&r1=709455&r2=709456&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/DirectoryIndexReader.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/DirectoryIndexReader.java Fri Oct 31 09:09:12 2008
@@ -96,26 +96,46 @@
DirectoryIndexReader reader;
if (infos.size() == 1) { // index is optimized
- reader = SegmentReader.get(readOnly, infos, infos.info(0), closeDirectory);
+ reader = SegmentReader.get(readOnly, infos, infos.info(0), false);
} else if (readOnly) {
- reader = new ReadOnlyMultiSegmentReader(directory, infos, closeDirectory);
+ reader = new ReadOnlyMultiSegmentReader(directory, infos, false);
} else {
- reader = new MultiSegmentReader(directory, infos, closeDirectory, false);
+ reader = new MultiSegmentReader(directory, infos, false, false);
}
reader.setDeletionPolicy(deletionPolicy);
+ reader.closeDirectory = closeDirectory;
return reader;
}
};
- if (commit == null)
- return (DirectoryIndexReader) finder.run();
- else {
- if (directory != commit.getDirectory())
- throw new IOException("the specified commit does not match the specified Directory");
- // This can & will directly throw IOException if the
- // specified commit point has been deleted:
- return (DirectoryIndexReader) finder.doBody(commit.getSegmentsFileName());
+ DirectoryIndexReader reader = null;
+ try {
+ if (commit == null)
+ reader = (DirectoryIndexReader) finder.run();
+ else {
+ if (directory != commit.getDirectory())
+ throw new IOException("the specified commit does not match the specified Directory");
+ // This can & will directly throw IOException if the
+ // specified commit point has been deleted:
+ reader = (DirectoryIndexReader) finder.doBody(commit.getSegmentsFileName());
+ }
+ } finally {
+ // We passed false above for closeDirectory so that
+ // the directory would not be closed before we were
+ // done retrying, so at this point if we truly failed
+ // to open a reader, which means an exception is being
+ // thrown, then close the directory now:
+ if (reader == null && closeDirectory) {
+ try {
+ directory.close();
+ } catch (IOException ioe) {
+ // suppress, so we keep throwing original failure
+ // from opening the reader
+ }
+ }
}
+
+ return reader;
}
public final synchronized IndexReader reopen() throws CorruptIndexException, IOException {
Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java?rev=709456&r1=709455&r2=709456&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReader.java Fri Oct 31 09:09:12 2008
@@ -1386,4 +1386,44 @@
r3.close();
}
+
+ public void testFalseDirectoryAlreadyClosed() throws Throwable {
+
+ String tempDir = System.getProperty("java.io.tmpdir");
+ if (tempDir == null)
+ throw new RuntimeException("java.io.tmpdir undefined");
+ File indexDir = new File(tempDir, "lucenetestdiralreadyclosed");
+
+ try {
+ FSDirectory dir = FSDirectory.getDirectory(indexDir);
+ IndexWriter w = new IndexWriter(indexDir, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED);
+ w.setUseCompoundFile(false);
+ Document doc = new Document();
+ w.addDocument(doc);
+ w.close();
+ assertTrue(new File(indexDir, "_0.fnm").delete());
+
+ IndexReader r = null;
+ try {
+ r = IndexReader.open(indexDir);
+ fail("did not hit expected exception");
+ } catch (AlreadyClosedException ace) {
+ fail("should not have hit AlreadyClosedException");
+ } catch (FileNotFoundException ioe) {
+ // expected
+ }
+
+ // Make sure we really did close the dir inside IndexReader.open
+ dir.close();
+
+ try {
+ dir.fileExists("hi");
+ fail("did not hit expected exception");
+ } catch (AlreadyClosedException ace) {
+ // expected
+ }
+ } finally {
+ _TestUtil.rmDir(indexDir);
+ }
+ }
}