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/08 10:34:02 UTC
svn commit: r1643769 - in /lucene/dev/branches/lucene_solr_4_10/lucene: ./
core/src/java/org/apache/lucene/index/ core/src/test/org/apache/lucene/index/
Author: mikemccand
Date: Mon Dec 8 09:34:01 2014
New Revision: 1643769
URL: http://svn.apache.org/r1643769
Log:
LUCENE-6094: allow IW.rollback to stop CMS's stalling too
Modified:
lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt
lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
Modified: lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt?rev=1643769&r1=1643768&r2=1643769&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt Mon Dec 8 09:34:01 2014
@@ -41,6 +41,9 @@ Bug fixes
* LUCENE-6055: PayloadAttribute.clone() now does a deep clone of the underlying
bytes. (Shai Erera)
+
+* 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/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java?rev=1643769&r1=1643768&r2=1643769&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java (original)
+++ lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java Mon Dec 8 09:34:01 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;
@@ -350,7 +353,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/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java?rev=1643769&r1=1643768&r2=1643769&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java (original)
+++ lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java Mon Dec 8 09:34:01 2014
@@ -204,8 +204,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/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java?rev=1643769&r1=1643768&r2=1643769&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java (original)
+++ lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java Mon Dec 8 09:34:01 2014
@@ -443,4 +443,72 @@ public class TestConcurrentMergeSchedule
w.close();
d.close();
}
+
+ // LUCENE-6094
+ public void testHangDuringRollback() throws Throwable {
+ Directory dir = newMockDirectory();
+ IndexWriterConfig iwc = new IndexWriterConfig(TEST_VERSION_CURRENT, 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();
+ }
}