Index: src/test/org/apache/lucene/index/TestIndexWriter.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriter.java (revision 885071) +++ src/test/org/apache/lucene/index/TestIndexWriter.java (working copy) @@ -4610,4 +4610,46 @@ _TestUtil.checkIndex(dir); dir.close(); } + + public void testNRTDiskUsageAfterOptimize() throws Exception { + Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); + + for(int i=0;i<4;i++) { + boolean doNRT = (i&1) != 0; + boolean doCFS = i < 2; + + MockRAMDirectory dir = new MockRAMDirectory(); + IndexWriter writer = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); + writer.setUseCompoundFile(doCFS); + writer.setMaxBufferedDocs(444); + Document doc = new Document(); + Field f = new Field("foo", "", Field.Store.YES, Field.Index.NOT_ANALYZED); + doc.add(f); + for(int j = 0; j < 10000; j++) { + f.setValue("bar " + j); + writer.addDocument(doc); + } + + writer.commit(); + + final long sz = dir.getRecomputedActualSizeInBytes(); + IndexReader r; + if (doNRT) { + r = writer.getReader(); + } else { + r = IndexReader.open(dir); + } + + writer.optimize(); + r.close(); + // should force files to be reclaimed: + writer.commit(); + + final long sz2 = dir.getRecomputedActualSizeInBytes(); + assertTrue("start size=" + (sz/1024./1024.) + "; end size=" + (sz2/1024./1024.) + " doNRT=" + doNRT + " doCFS=" + doCFS, sz2 <= sz); + + writer.close(); + dir.close(); + } + } }