Hi,

you broke build in 4.x: There is still a reference to finishMerges().

Uwe

-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: u...@thetaphi.de


> -----Original Message-----
> From: rjer...@apache.org [mailto:rjer...@apache.org]
> Sent: Monday, August 18, 2014 7:20 PM
> To: comm...@lucene.apache.org
> Subject: svn commit: r1618668 - in /lucene/dev/branches/branch_4x: ./
> lucene/ lucene/core/
> lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
> lucene/core/src/test/org/apache/lucene/index/TestIndexWriterMergePolic
> y.java
> 
> Author: rjernst
> Date: Mon Aug 18 17:20:27 2014
> New Revision: 1618668
> 
> URL: http://svn.apache.org/r1618668
> Log:
> Backport fix in waitForMerges to allow merge scheduler to run one last time
> 
> Modified:
>     lucene/dev/branches/branch_4x/   (props changed)
>     lucene/dev/branches/branch_4x/lucene/   (props changed)
>     lucene/dev/branches/branch_4x/lucene/core/   (props changed)
> 
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/i
> ndex/IndexWriter.java
> 
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/i
> ndex/TestIndexWriterMergePolicy.java
> 
> Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/i
> ndex/IndexWriter.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/cor
> e/src/java/org/apache/lucene/index/IndexWriter.java?rev=1618668&r1=161
> 8667&r2=1618668&view=diff
> ==========================================================
> ====================
> ---
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/i
> ndex/IndexWriter.java (original)
> +++
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene
> +++ /index/IndexWriter.java Mon Aug 18 17:20:27 2014
> @@ -907,7 +907,11 @@ public class IndexWriter implements Clos
>            infoStream.message("IW", "now flush at close");
>          }
>          flush(true, true);
> -        finishMerges(waitForMerges);
> +        if (waitForMerges) {
> +          waitForMerges();
> +        } else {
> +          abortMerges();
> +        }
>          commitInternal(config.getMergePolicy());
>          rollbackInternal(); // ie close, since we just committed
>          success = true;
> @@ -2145,7 +2149,7 @@ public class IndexWriter implements Clos
> 
>      try {
>        synchronized(this) {
> -        finishMerges(false);
> +        abortMerges();
>          stopMerges = true;
>        }
> 
> @@ -2282,7 +2286,7 @@ public class IndexWriter implements Clos
>          synchronized (this) {
>            try {
>              // Abort any running merges
> -            finishMerges(false);
> +            abortMerges();
>              // Remove all segments
>              segmentInfos.clear();
>              // Ask deleter to locate unreferenced files & remove them:
> @@ -2316,56 +2320,48 @@ public class IndexWriter implements Clos
>      }
>    }
> 
> -  private synchronized void finishMerges(boolean waitForMerges) {
> -    if (!waitForMerges) {
> +  /** Aborts running merges.  Be careful when using this
> +   *  method: when you abort a long-running merge, you lose
> +   *  a lot of work that must later be redone. */  public synchronized
> + void abortMerges() {
> +    stopMerges = true;
> 
> -      stopMerges = true;
> -
> -      // Abort all pending & running merges:
> -      for (final MergePolicy.OneMerge merge : pendingMerges) {
> -        if (infoStream.isEnabled("IW")) {
> -          infoStream.message("IW", "now abort pending merge " +
> segString(merge.segments));
> -        }
> -        merge.abort();
> -        mergeFinish(merge);
> +    // Abort all pending & running merges:
> +    for (final MergePolicy.OneMerge merge : pendingMerges) {
> +      if (infoStream.isEnabled("IW")) {
> +        infoStream.message("IW", "now abort pending merge " +
> + segString(merge.segments));
>        }
> -      pendingMerges.clear();
> +      merge.abort();
> +      mergeFinish(merge);
> +    }
> +    pendingMerges.clear();
> 
> -      for (final MergePolicy.OneMerge merge : runningMerges) {
> -        if (infoStream.isEnabled("IW")) {
> -          infoStream.message("IW", "now abort running merge " +
> segString(merge.segments));
> -        }
> -        merge.abort();
> +    for (final MergePolicy.OneMerge merge : runningMerges) {
> +      if (infoStream.isEnabled("IW")) {
> +        infoStream.message("IW", "now abort running merge " +
> + segString(merge.segments));
>        }
> +      merge.abort();
> +    }
> 
> -      // These merges periodically check whether they have
> -      // been aborted, and stop if so.  We wait here to make
> -      // sure they all stop.  It should not take very long
> -      // because the merge threads periodically check if
> -      // they are aborted.
> -      while(runningMerges.size() > 0) {
> -        if (infoStream.isEnabled("IW")) {
> -          infoStream.message("IW", "now wait for " + runningMerges.size() + "
> running merge/s to abort");
> -        }
> -        doWait();
> +    // These merges periodically check whether they have
> +    // been aborted, and stop if so.  We wait here to make
> +    // sure they all stop.  It should not take very long
> +    // because the merge threads periodically check if
> +    // they are aborted.
> +    while(runningMerges.size() > 0) {
> +      if (infoStream.isEnabled("IW")) {
> +        infoStream.message("IW", "now wait for " + runningMerges.size()
> + + " running merge/s to abort");
>        }
> +      doWait();
> +    }
> 
> -      stopMerges = false;
> -      notifyAll();
> -
> -      assert 0 == mergingSegments.size();
> +    stopMerges = false;
> +    notifyAll();
> 
> -      if (infoStream.isEnabled("IW")) {
> -        infoStream.message("IW", "all running merges have aborted");
> -      }
> +    assert 0 == mergingSegments.size();
> 
> -    } else {
> -      // waitForMerges() will ensure any running addIndexes finishes.
> -      // It's fine if a new one attempts to start because from our
> -      // caller above the call will see that we are in the
> -      // process of closing, and will throw an
> -      // AlreadyClosedException.
> -      waitForMerges();
> +    if (infoStream.isEnabled("IW")) {
> +      infoStream.message("IW", "all running merges have aborted");
>      }
>    }
> 
> @@ -2375,20 +2371,30 @@ public class IndexWriter implements Clos
>     * <p>It is guaranteed that any merges started prior to calling this method
>     *    will have completed once this method completes.</p>
>     */
> -  public synchronized void waitForMerges() {
> -    ensureOpen(false);
> -    if (infoStream.isEnabled("IW")) {
> -      infoStream.message("IW", "waitForMerges");
> -    }
> -    while(pendingMerges.size() > 0 || runningMerges.size() > 0) {
> -      doWait();
> -    }
> +  public void waitForMerges() throws IOException {
> 
> -    // sanity check
> -    assert 0 == mergingSegments.size();
> +    // Give merge scheduler last chance to run, in case
> +    // any pending merges are waiting. We can't hold IW's lock
> +    // when going into merge because it can lead to deadlock.
> +    mergeScheduler.merge(this, MergeTrigger.CLOSING, false);
> 
> -    if (infoStream.isEnabled("IW")) {
> -      infoStream.message("IW", "waitForMerges done");
> +    synchronized (this) {
> +      ensureOpen(false);
> +      if (infoStream.isEnabled("IW")) {
> +        infoStream.message("IW", "waitForMerges");
> +      }
> +
> +
> +      while (pendingMerges.size() > 0 || runningMerges.size() > 0) {
> +        doWait();
> +      }
> +
> +      // sanity check
> +      assert 0 == mergingSegments.size();
> +
> +      if (infoStream.isEnabled("IW")) {
> +        infoStream.message("IW", "waitForMerges done");
> +      }
>      }
>    }
> 
> @@ -4049,7 +4055,7 @@ public class IndexWriter implements Clos
>     *  the synchronized lock on IndexWriter instance. */
>    final synchronized void mergeFinish(MergePolicy.OneMerge merge) {
> 
> -    // forceMerge, addIndexes or finishMerges may be waiting
> +    // forceMerge, addIndexes or waitForMerges may be waiting
>      // on merges to finish.
>      notifyAll();
> 
> 
> Modified:
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/i
> ndex/TestIndexWriterMergePolicy.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/cor
> e/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java?rev=
> 1618668&r1=1618667&r2=1618668&view=diff
> ==========================================================
> ====================
> ---
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/i
> ndex/TestIndexWriterMergePolicy.java (original)
> +++
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene
> +++ /index/TestIndexWriterMergePolicy.java Mon Aug 18 17:20:27 2014
> @@ -233,7 +233,7 @@ public class TestIndexWriterMergePolicy
>      writer.addDocument(doc);
>    }
> 
> -  private void checkInvariants(IndexWriter writer) {
> +  private void checkInvariants(IndexWriter writer) throws IOException {
>      writer.waitForMerges();
>      int maxBufferedDocs = writer.getConfig().getMaxBufferedDocs();
>      int mergeFactor = ((LogMergePolicy)
> writer.getConfig().getMergePolicy()).getMergeFactor();



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to