[
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)