Simon Willnauer created LUCENE-8754:
---------------------------------------

             Summary: SegmentInfo#toString can cause 
ConcurrentModificationException
                 Key: LUCENE-8754
                 URL: https://issues.apache.org/jira/browse/LUCENE-8754
             Project: Lucene - Core
          Issue Type: Improvement
            Reporter: Simon Willnauer


A recent change increased the likelihood for this issue to show up but it can 
already happen before since we are using the attributes map in the 
StoredFieldsFormat for quite some time. I found this issue due to a test 
failure on our CI:


{noformat}
13:11:56    [junit4] Suite: org.apache.lucene.index.TestIndexSorting
13:11:56    [junit4]   2> apr 05, 2019 8:11:53 AM 
com.carrotsearch.randomizedtesting.RandomizedRunner$QueueUncaughtExceptionsHandler
 uncaughtException
13:11:56    [junit4]   2> WARNING: Uncaught exception in thread: 
Thread[Thread-507,5,TGRP-TestIndexSorting]
13:11:56    [junit4]   2> java.util.ConcurrentModificationException
13:11:56    [junit4]   2>       at 
__randomizedtesting.SeedInfo.seed([7C25B308F180203B]:0)
13:11:56    [junit4]   2>       at 
java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
13:11:56    [junit4]   2>       at 
java.util.HashMap$EntryIterator.next(HashMap.java:1476)
13:11:56    [junit4]   2>       at 
java.util.HashMap$EntryIterator.next(HashMap.java:1474)
13:11:56    [junit4]   2>       at 
java.util.AbstractMap.toString(AbstractMap.java:554)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.SegmentInfo.toString(SegmentInfo.java:222)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.SegmentCommitInfo.toString(SegmentCommitInfo.java:345)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.SegmentCommitInfo.toString(SegmentCommitInfo.java:364)
13:11:56    [junit4]   2>       at java.lang.String.valueOf(String.java:2994)
13:11:56    [junit4]   2>       at 
java.lang.StringBuilder.append(StringBuilder.java:131)
13:11:56    [junit4]   2>       at 
java.util.AbstractMap.toString(AbstractMap.java:557)
13:11:56    [junit4]   2>       at 
java.util.Collections$UnmodifiableMap.toString(Collections.java:1493)
13:11:56    [junit4]   2>       at java.lang.String.valueOf(String.java:2994)
13:11:56    [junit4]   2>       at 
java.lang.StringBuilder.append(StringBuilder.java:131)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.TieredMergePolicy.findForcedMerges(TieredMergePolicy.java:628)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.IndexWriter.updatePendingMerges(IndexWriter.java:2181)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.IndexWriter.maybeMerge(IndexWriter.java:2154)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.IndexWriter.forceMerge(IndexWriter.java:1988)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.IndexWriter.forceMerge(IndexWriter.java:1939)
13:11:56    [junit4]   2>       at 
org.apache.lucene.index.TestIndexSorting$UpdateRunnable.run(TestIndexSorting.java:1851)
13:11:56    [junit4]   2>       at java.lang.Thread.run(Thread.java:748)
13:11:56    [junit4]   2> 
13:11:56    [junit4]   2> NOTE: reproduce with: ant test  
-Dtestcase=TestIndexSorting -Dtests.method=testConcurrentUpdates 
-Dtests.seed=7C25B308F180203B -Dtests.slow=true -Dtest
{noformat}

The issue is that we update the attributes map (also we similarly do the same 
for diagnostics but it's not necessarily causing the issue since the 
diagnostics map is never modified) during the merge process but access it in 
the merge policy when looking at running merges and there we call toString on 
SegmentCommitInfo which happens without any synchronization. This is 
technically unsafe publication but IW is a mess along those lines and real 
fixes would require significant changes.





--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

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

Reply via email to