Index: lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java =================================================================== --- lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java (revision 1463662) +++ lucene/core/src/test/org/apache/lucene/index/TestDirectoryReaderReopen.java (working copy) @@ -594,4 +594,28 @@ r.close(); dir.close(); } + + public void testOpenIfChangedNRTToCommit() throws Exception { + Directory dir = newDirectory(); + + // Can't use RIW because it randomly commits: + IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()))); + Document doc = new Document(); + doc.add(newStringField("field", "value", Field.Store.NO)); + w.addDocument(doc); + w.commit(); + List commits = DirectoryReader.listCommits(dir); + assertEquals(1, commits.size()); + w.addDocument(doc); + DirectoryReader r = DirectoryReader.open(w, true); + + assertEquals(2, r.numDocs()); + IndexReader r2 = DirectoryReader.openIfChanged(r, commits.get(0)); + assertNotNull(r2); + r.close(); + assertEquals(1, r2.numDocs()); + w.close(); + r2.close(); + dir.close(); + } } Index: lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java =================================================================== --- lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java (revision 1463662) +++ lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java (working copy) @@ -260,7 +260,7 @@ private DirectoryReader doOpenFromWriter(IndexCommit commit) throws IOException { if (commit != null) { - throw new IllegalArgumentException("a reader obtained from IndexWriter.getReader() cannot currently accept a commit"); + return doOpenFromCommit(commit); } if (writer.nrtIsCurrent(segmentInfos)) { @@ -293,6 +293,10 @@ } } + return doOpenFromCommit(commit); + } + + private DirectoryReader doOpenFromCommit(IndexCommit commit) throws IOException { return (DirectoryReader) new SegmentInfos.FindSegmentsFile(directory) { @Override protected Object doBody(String segmentFileName) throws IOException {