diff --git a/common-build.xml b/common-build.xml
index 37c0e25d881..c83fb728011 100644
--- a/common-build.xml
+++ b/common-build.xml
@@ -42,7 +42,7 @@
-
+
diff --git a/src/java/org/apache/lucene/index/IndexWriter.java b/src/java/org/apache/lucene/index/IndexWriter.java
index b081f023522..d8e1a35bbfe 100644
--- a/src/java/org/apache/lucene/index/IndexWriter.java
+++ b/src/java/org/apache/lucene/index/IndexWriter.java
@@ -4905,7 +4905,7 @@ public class IndexWriter {
}
for(int i=0;i 0);
assertTrue(this.seeksCounter <= numHits + 1);
}
diff --git a/src/test/org/apache/lucene/index/TestNRTReaderWithThreads.java b/src/test/org/apache/lucene/index/TestNRTReaderWithThreads.java
new file mode 100644
index 00000000000..2aff4ce9112
--- /dev/null
+++ b/src/test/org/apache/lucene/index/TestNRTReaderWithThreads.java
@@ -0,0 +1,111 @@
+package org.apache.lucene.index;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+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 TestNRTReaderWithThreads extends LuceneTestCase {
+ Random random = new Random();
+ HeavyAtomicInt seq = new HeavyAtomicInt(1);
+
+ public void testIndexing() throws Exception {
+ Directory mainDir = new MockRAMDirectory();
+ IndexWriter writer = new IndexWriter(mainDir, new WhitespaceAnalyzer(),
+ IndexWriter.MaxFieldLength.LIMITED);
+ writer.setUseCompoundFile(false);
+ IndexReader reader = writer.getReader(); // start pooling readers
+ reader.close();
+ writer.setMergeFactor(2);
+ writer.setMaxBufferedDocs(10);
+ RunThread[] indexThreads = new RunThread[4];
+ for (int x=0; x < indexThreads.length; x++) {
+ indexThreads[x] = new RunThread(x % 2, writer);
+ indexThreads[x].setName("Thread " + x);
+ indexThreads[x].start();
+ }
+ long startTime = System.currentTimeMillis();
+ long duration = 5*1000;
+ while ((System.currentTimeMillis() - startTime) < duration) {
+ Thread.sleep(100);
+ }
+ 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;
+ int type;
+
+ public RunThread(int type, IndexWriter writer) {
+ this.type = type;
+ this.writer = writer;
+ }
+
+ public void run() {
+ try {
+ while (run) {
+ //int n = random.nextInt(2);
+ if (type == 0) {
+ int i = seq.addAndGet(1);
+ Document doc = TestIndexWriterReader.createDocument(i, "index1", 10);
+ writer.addDocument(doc);
+ addCount++;
+ } else if (type == 1) {
+ // we may or may not delete because the term may not exist,
+ // however we're opening and closing the reader 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;
+ }
+ }
+ }
+}