Index: src/test/org/apache/lucene/index/TestIndexReader.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexReader.java (revision 684015) +++ src/test/org/apache/lucene/index/TestIndexReader.java (working copy) @@ -1329,4 +1329,61 @@ r2.close(); d.close(); } + + public void testReadOnly() throws Throwable { + RAMDirectory d = new MockRAMDirectory(); + IndexWriter writer = new IndexWriter(d, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); + addDocumentWithFields(writer); + writer.commit(); + addDocumentWithFields(writer); + writer.close(); + + IndexReader r = IndexReader.open(d, true); + try { + r.deleteDocument(0); + fail(); + } catch (UnsupportedOperationException uoe) { + // expected + } + + writer = new IndexWriter(d, new StandardAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED); + addDocumentWithFields(writer); + writer.close(); + + // Make sure reopen is still readonly: + IndexReader r2 = r.reopen(); + r.close(); + + assertFalse(r == r2); + + try { + r2.deleteDocument(0); + fail(); + } catch (UnsupportedOperationException uoe) { + // expected + } + + writer = new IndexWriter(d, new StandardAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED); + writer.optimize(); + writer.close(); + + // Make sure reopen to a single segment is still readonly: + IndexReader r3 = r2.reopen(); + r2.close(); + + assertFalse(r == r2); + + try { + r3.deleteDocument(0); + fail(); + } catch (UnsupportedOperationException uoe) { + // expected + } + + // Make sure write lock isn't held + writer = new IndexWriter(d, new StandardAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED); + writer.close(); + + r3.close(); + } } Index: src/java/org/apache/lucene/index/DirectoryIndexReader.java =================================================================== --- src/java/org/apache/lucene/index/DirectoryIndexReader.java (revision 684015) +++ src/java/org/apache/lucene/index/DirectoryIndexReader.java (working copy) @@ -50,14 +50,17 @@ private boolean rollbackHasChanges; private SegmentInfos rollbackSegmentInfos; + protected boolean readOnly; + - void init(Directory directory, SegmentInfos segmentInfos, boolean closeDirectory) + void init(Directory directory, SegmentInfos segmentInfos, boolean closeDirectory, boolean readOnly) throws IOException { this.directory = directory; this.segmentInfos = segmentInfos; this.closeDirectory = closeDirectory; + this.readOnly = readOnly; - if (segmentInfos != null) { + if (!readOnly && segmentInfos != null) { // We assume that this segments_N was previously // properly sync'd: for(int i=0;i= 0; i--) { try { - readers[i] = SegmentReader.get(sis.info(i)); + readers[i] = SegmentReader.get(readOnly, sis.info(i)); } catch (IOException e) { // Close all readers we had opened: for(i++;i