[ 
https://issues.apache.org/jira/browse/HADOOP-11274?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14201737#comment-14201737
 ] 

Junping Du commented on HADOOP-11274:
-------------------------------------

Thanks for comments, [~vinodkv] and [~jingzhao]!
bq. The deadlock looks very hard to hit though, since the two configuration 
objects need to use each other for construction.
This is not hard to hit but something never should happen. From Java spec, only 
the thread that creates an object should have access to it while it is being 
constructed. No thread should use an object being constructed to create an 
object already constructed.

bq. Still, locking the entire object for updateResources is plain bad along 
with locking during read and write conf operations. We should NOT be making 
these changes without careful analysis and testing - this Configuration class 
is the center piece of ten's of projects.
Agree there is performance impact risk here. May be replace the object 
synchronization with read/write lock (and with different monitor object for 
different share resources) so that multiple reading thread won't block each 
other?

> ConcurrentModificationException in Configuration Copy Constructor
> -----------------------------------------------------------------
>
>                 Key: HADOOP-11274
>                 URL: https://issues.apache.org/jira/browse/HADOOP-11274
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: conf
>            Reporter: Junping Du
>            Assignee: Junping Du
>            Priority: Blocker
>             Fix For: 2.6.0
>
>         Attachments: HADOOP-11274-v2.patch, HADOOP-11274.003.patch, 
> HADOOP-11274.patch
>
>
> Exception as below happens in doing some configuration update in parallel:
> {noformat}
> java.util.ConcurrentModificationException
>       at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
>       at java.util.HashMap$EntryIterator.next(HashMap.java:962)
>       at java.util.HashMap$EntryIterator.next(HashMap.java:960)
>       at java.util.HashMap.putAllForCreate(HashMap.java:554)
>       at java.util.HashMap.<init>(HashMap.java:298)
>       at org.apache.hadoop.conf.Configuration.<init>(Configuration.java:703)
> {noformat}
> In a constructor of Configuration - public Configuration(Configuration 
> other), the copy of updatingResource data structure in copy constructor is 
> not synchronized properly. 
> Configuration.get() eventually calls loadProperty() where updatingResource 
> gets updated. So, whats happening here is one thread is trying to do copy of 
> Configuration as demonstrated in stack trace and other thread is doing 
> Configuration.get(key) and than ConcurrentModificationException occurs 
> because copying of updatingResource is not synchronized in constructor. 
> We should make the update to updatingResource get synchronized, and also fix 
> other tiny synchronized issues there.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to