[
https://issues.apache.org/jira/browse/LUCENE-4544?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13610570#comment-13610570
]
Commit Tag Bot commented on LUCENE-4544:
----------------------------------------
[branch_4x commit] Michael McCandless
http://svn.apache.org/viewvc?view=revision&revision=1408092
LUCENE-4544: fix off-by-one in max number of CMS merge threads
> possible bug in ConcurrentMergeScheduler.merge(IndexWriter)
> ------------------------------------------------------------
>
> Key: LUCENE-4544
> URL: https://issues.apache.org/jira/browse/LUCENE-4544
> Project: Lucene - Core
> Issue Type: Bug
> Components: core/other
> Affects Versions: 5.0
> Reporter: Radim Kolar
> Assignee: Michael McCandless
> Fix For: 4.1, 5.0
>
> Attachments: LUCENE-4544.patch, LUCENE-4544.patch
>
>
> from dev list:
> ¨i suspect that this code is broken. Lines 331 - 343 in
> org.apache.lucene.index.ConcurrentMergeScheduler.merge(IndexWriter)
> mergeThreadCount() are currently active merges, they can be at most
> maxThreadCount, maxMergeCount is number of queued merges defaulted with
> maxThreadCount+2 and it can never be lower then maxThreadCount, which means
> that condition in while can never become true.
> synchronized(this) {
> long startStallTime = 0;
> while (mergeThreadCount() >= 1+maxMergeCount) {
> startStallTime = System.currentTimeMillis();
> if (verbose()) {
> message(" too many merges; stalling...");
> }
> try {
> wait();
> } catch (InterruptedException ie) {
> throw new ThreadInterruptedException(ie);
> }
> }
> While confusing, I think the code is actually nearly correct... but I
> would love to find some simplifications of CMS's logic (it's really
> hairy).
> It turns out mergeThreadCount() is allowed to go higher than
> maxThreadCount; when this happens, Lucene pauses
> mergeThreadCount()-maxThreadCount of those merge threads, and resumes
> them once threads finish (see updateMergeThreads). Ie, CMS will
> accept up to maxMergeCount merges (and launch threads for them), but
> will only allow maxThreadCount of those threads to be running at once.
> So what that while loop is doing is preventing more than
> maxMergeCount+1 threads from starting, and then pausing the incoming
> thread to slow down the rate of segment creation (since merging cannot
> keep up).
> But ... I think the 1+ is wrong ... it seems like it should just be
> mergeThreadCount() >= maxMergeCount().
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]