Index: src/java/org/apache/lucene/index/IndexWriter.java =================================================================== --- src/java/org/apache/lucene/index/IndexWriter.java (revision 791560) +++ src/java/org/apache/lucene/index/IndexWriter.java (working copy) @@ -462,16 +462,26 @@ Iterator iter = readerMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry ent = (Map.Entry) iter.next(); - ((SegmentReader) ent.getValue()).hasChanges = false; + SRMapValue mv = (SRMapValue)ent.getValue(); + synchronized (mv) { + if (mv.reader != null) { + mv.reader.hasChanges = false; + } + } } } else { final int numSegments = infos.size(); for(int i=0;i 0) Index: src/test/org/apache/lucene/index/Test1726.java =================================================================== --- src/test/org/apache/lucene/index/Test1726.java (revision 0) +++ src/test/org/apache/lucene/index/Test1726.java (revision 0) @@ -0,0 +1,93 @@ +package org.apache.lucene.index; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.apache.lucene.analysis.WhitespaceAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.TestIndexWriterReader.HeavyAtomicInt; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.MockRAMDirectory; +import org.apache.lucene.util.LuceneTestCase; + +public class Test1726 extends LuceneTestCase { + Random random = new Random(); + HeavyAtomicInt seq = new HeavyAtomicInt(1); + List readerList = new ArrayList(); + + public void testIndexing() throws Exception { + Directory mainDir = new MockRAMDirectory(); + IndexWriter writer = new IndexWriter(mainDir, new WhitespaceAnalyzer(), + IndexWriter.MaxFieldLength.LIMITED); + writer.setMergeFactor(2); + writer.setMaxBufferedDocs(10); + RunThread[] indexThreads = new RunThread[4]; + for (int x=0; x < indexThreads.length; x++) { + indexThreads[x] = new RunThread(writer); + indexThreads[x].start(); + } + long startTime = System.currentTimeMillis(); + long duration = 5*60*1000; + while (true) { + boolean b= (System.currentTimeMillis() - startTime) > duration; + Thread.sleep(100); + if (b) break; + } + int delCount = 0; + int addCount = 0; + for (int x=0; x < indexThreads.length; x++) { + indexThreads[x].run = false; + assertTrue(indexThreads[x].ex == null); + addCount += indexThreads[x].addCount; + delCount += indexThreads[x].delCount; + } + for (int x=0; x < indexThreads.length; x++) { + indexThreads[x].join(); + } + System.out.println("addCount:"+addCount); + System.out.println("delCount:"+delCount); + writer.close(); + mainDir.close(); + } + + public class RunThread extends Thread { + IndexWriter writer; + boolean run = true; + Throwable ex; + int delCount = 0; + int addCount = 0; + + public RunThread(IndexWriter writer) { + this.writer = writer; + } + + public void run() { + try { + while (run) { + int n = random.nextInt(2); + if (n == 0) { + int i = seq.addAndGet(1); + Document doc = TestIndexWriterReader.createDocument(i, "index1", 5); + writer.addDocument(doc); + addCount++; + } else if (n == 1) { + // we may or may not delete, however we're + // opening a new reader and closing it rapidly + IndexReader reader = writer.getReader(); + int id = random.nextInt(seq.intValue()); + Term term = new Term("id", Integer.toString(id)); + int count = TestIndexWriterReader.count(term, reader); + writer.deleteDocuments(term); + reader.close(); + delCount += count; + } + } + } catch (Throwable ex) { + ex.printStackTrace(System.out); + this.ex = ex; + run = false; + } + } + } +} Index: src/test/org/apache/lucene/index/TestIndexWriterReader.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexWriterReader.java (revision 791560) +++ src/test/org/apache/lucene/index/TestIndexWriterReader.java (working copy) @@ -42,7 +42,7 @@ public class TestIndexWriterReader extends LuceneTestCase { static PrintStream infoStream; - private static class HeavyAtomicInt { + public static class HeavyAtomicInt { private int value; public HeavyAtomicInt(int start) { value = start;