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/04/13 11:21:15 UTC

svn commit: r1586943 - /lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java

Author: mikemccand
Date: Sun Apr 13 09:21:14 2014
New Revision: 1586943

URL: http://svn.apache.org/r1586943
Log:
don't processEvents during rollback; prevent possible deadlock during IW.rollback

Modified:
    lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java

Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1586943&r1=1586942&r2=1586943&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java Sun Apr 13 09:21:14 2014
@@ -933,9 +933,9 @@ public class IndexWriter implements Clos
           rollbackInternal();
         } else {
           closeInternal(waitForMerges, true);
+          assert assertEventQueueAfterClose();
         }
       }
-      assert assertEventQueueAfterClose();
     }
   }
 
@@ -2113,7 +2113,6 @@ public class IndexWriter implements Clos
       mergeScheduler.close();
 
       bufferedUpdatesStream.clear();
-      processEvents(false, true);
       docWriter.close(); // mark it as closed first to prevent subsequent indexing actions/flushes 
       docWriter.abort(this); // don't sync on IW here
       synchronized(this) {
@@ -2137,7 +2136,6 @@ public class IndexWriter implements Clos
         if (infoStream.isEnabled("IW") ) {
           infoStream.message("IW", "rollback: infos=" + segString(segmentInfos));
         }
-        
 
         assert testPoint("rollback before checkpoint");
 
@@ -2148,7 +2146,6 @@ public class IndexWriter implements Clos
 
         lastCommitChangeCount = changeCount;
         
-        processEvents(false, true);
         deleter.refresh();
         deleter.close();
 
@@ -2162,6 +2159,12 @@ public class IndexWriter implements Clos
     } catch (OutOfMemoryError oom) {
       handleOOM(oom, "rollbackInternal");
     } finally {
+      if (!success) {
+        // Must not hold IW's lock while closing
+        // mergePolicy/Scheduler: this can lead to deadlock,
+        // e.g. TestIW.testThreadInterruptDeadlock
+        IOUtils.closeWhileHandlingException(mergePolicy, mergeScheduler);
+      }
       synchronized(this) {
         if (!success) {
           // we tried to be nice about it: do the minimum
@@ -2175,7 +2178,7 @@ public class IndexWriter implements Clos
           }
           
           // close all the closeables we can (but important is readerPool and writeLock to prevent leaks)
-          IOUtils.closeWhileHandlingException(mergePolicy, mergeScheduler, readerPool, deleter, writeLock);
+          IOUtils.closeWhileHandlingException(readerPool, deleter, writeLock);
           writeLock = null;
         }
         closed = true;