You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2014/12/06 10:18:04 UTC
svn commit: r1643509 - in /lucene/dev/branches/branch_5x/lucene: ./
core/src/java/org/apache/lucene/index/ core/src/test/org/apache/lucene/index/
Author: mikemccand
Date: Sat Dec 6 09:18:03 2014
New Revision: 1643509
URL: http://svn.apache.org/r1643509
Log:
LUCENE-6094: allow IW.rollback to stop CMS's stalling too
Modified:
lucene/dev/branches/branch_5x/lucene/CHANGES.txt
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
Modified: lucene/dev/branches/branch_5x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/CHANGES.txt?rev=1643509&r1=1643508&r2=1643509&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/CHANGES.txt Sat Dec 6 09:18:03 2014
@@ -344,6 +344,9 @@ Bug Fixes
* LUCENE-5987: IndexWriter will now forcefully close itself on
aborting exception (an exception that would otherwise cause silent
data loss). (Robert Muir, Mike McCandless)
+
+* LUCENE-6094: Allow IW.rollback to stop ConcurrentMergeScheduler even
+ when it's stalling because there are too many merges. (Mike McCandless)
Documentation
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java?rev=1643509&r1=1643508&r2=1643509&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java Sat Dec 6 09:18:03 2014
@@ -300,8 +300,11 @@ public class ConcurrentMergeScheduler ex
protected synchronized int mergeThreadCount() {
int count = 0;
for (MergeThread mt : mergeThreads) {
- if (mt.isAlive() && mt.getCurrentMerge() != null) {
- count++;
+ if (mt.isAlive()) {
+ MergePolicy.OneMerge merge = mt.getCurrentMerge();
+ if (merge != null && merge.isAborted() == false) {
+ count++;
+ }
}
}
return count;
@@ -399,7 +402,8 @@ public class ConcurrentMergeScheduler ex
message(" too many merges; stalling...");
}
try {
- wait();
+ // Only wait 0.25 seconds, so if all merges are aborted (by IW.rollback) we notice:
+ wait(250);
} catch (InterruptedException ie) {
throw new ThreadInterruptedException(ie);
}
Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java?rev=1643509&r1=1643508&r2=1643509&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java Sat Dec 6 09:18:03 2014
@@ -209,8 +209,8 @@ public abstract class MergePolicy {
while (paused) {
try {
// In theory we could wait() indefinitely, but we
- // do 1000 msec, defensively
- wait(1000);
+ // do 250 msec, defensively
+ wait(250);
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
}
Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java?rev=1643509&r1=1643508&r2=1643509&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java Sat Dec 6 09:18:03 2014
@@ -482,4 +482,72 @@ public class TestConcurrentMergeSchedule
w.close();
dir.close();
}
+
+ // LUCENE-6094
+ public void testHangDuringRollback() throws Throwable {
+ Directory dir = newMockDirectory();
+ IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
+ iwc.setMaxBufferedDocs(2);
+ LogDocMergePolicy mp = new LogDocMergePolicy();
+ iwc.setMergePolicy(mp);
+ mp.setMergeFactor(2);
+ final CountDownLatch mergeStart = new CountDownLatch(1);
+ final CountDownLatch mergeFinish = new CountDownLatch(1);
+ ConcurrentMergeScheduler cms = new ConcurrentMergeScheduler() {
+ @Override
+ protected void doMerge(MergePolicy.OneMerge merge) throws IOException {
+ mergeStart.countDown();
+ try {
+ mergeFinish.await();
+ } catch (InterruptedException ie) {
+ throw new RuntimeException(ie);
+ }
+ super.doMerge(merge);
+ }
+ };
+ cms.setMaxMergesAndThreads(1, 1);
+ iwc.setMergeScheduler(cms);
+
+ final IndexWriter w = new IndexWriter(dir, iwc);
+
+ w.addDocument(new Document());
+ w.addDocument(new Document());
+ // flush
+
+ w.addDocument(new Document());
+ w.addDocument(new Document());
+ // flush + merge
+
+ // Wait for merge to kick off
+ mergeStart.await();
+
+ new Thread() {
+ @Override
+ public void run() {
+ try {
+ w.addDocument(new Document());
+ w.addDocument(new Document());
+ // flush
+
+ w.addDocument(new Document());
+ // W/o the fix for LUCENE-6094 we would hang forever here:
+ w.addDocument(new Document());
+ // flush + merge
+
+ // Now allow first merge to finish:
+ mergeFinish.countDown();
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }.start();
+
+ while (w.numDocs() != 8) {
+ Thread.sleep(10);
+ }
+
+ w.rollback();
+ dir.close();
+ }
}