commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Oliver Heger (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CONFIGURATION-570) Passing SystemConfiguration() into PropertiesConfiguration() can cause a ConcurrentModificationException
Date Tue, 11 Mar 2014 20:28:45 GMT

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

Oliver Heger commented on CONFIGURATION-570:
--------------------------------------------

Glad to hear this.

However, it occurred to me that we probably have to do something about this problem because
we might also be affected when constructing a combined configuration using {{DefaultConfigurationBuilder}}.
This class allows combining multiple configuration sources to a single combined configuration.
During this process, an iteration over the keys of the single sources is performed. So if
there are concurrent modifications on system properties, the mentioned exception can be thrown.

> Passing SystemConfiguration() into PropertiesConfiguration() can cause a ConcurrentModificationException
> --------------------------------------------------------------------------------------------------------
>
>                 Key: CONFIGURATION-570
>                 URL: https://issues.apache.org/jira/browse/CONFIGURATION-570
>             Project: Commons Configuration
>          Issue Type: Bug
>    Affects Versions: 1.6
>            Reporter: John Vines
>
> This was encountered in a release of Accumulo. I'm not sure if this is in the realm of
commons configuration, but I figured I should put in a ticket-
> A. just in case it is or
> B. So others can be aware of this issue
> We had a piece of code which interpolates java properties (SystemConfiguration) with
other variables. This code worked as follows
> {code}
>       PropertiesConfiguration pconf = new PropertiesConfiguration();
>       pconf.append(new SystemConfiguration());
>       pconf.addProperty("hack_default_value", this.defaultValue);
>       String v = pconf.getString("hack_default_value");
> {code}
> However, after we added a monitor thread which calls System.setProperty before this code
is hit, we would occasionally get a ConcurrentModificationException.
> I traced it down to pconf.append doing an iteration over the Configuration (AbstractConfiguration,
line 1233 in 1.6). The configuration being passed in, SystemConfiguration, is just a MapConfiguration
from the result of System.getProperties. This is an exact copy of the map the System maintains.
> There are two accessors to that map, setProperty and setProperties in System. Set property
basically just falls to Properties.setProperty, while setProperties will copy the existing
properties, add new ones, and then replace the object. We are using setProperty in our code.
> Properties.setProperty is a synchronized call, so we resolved it by replacing our code
with
> {code}
>       PropertiesConfiguration pconf = new PropertiesConfiguration();
>       Properties systemProperties = System.getProperties();
>       synchronized (systemProperties) {
>         pconf.append(new MapConfiguration(systemProperties));
>       }
>       pconf.addProperty("hack_default_value", this.defaultValue);
>       String v = pconf.getString("hack_default_value");
> {code}
> I'm not quite sure if/how it should be handled in commons configuration. I'm thinking
if it IS in the scope of this project, then SystemConfiguration should create a snapshot of
System.getProperties. Or a new Configuration/configuration flag should be added to create
a snapshot of it instead of the map directly.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Mime
View raw message