[ 
https://issues.apache.org/jira/browse/CONFIGURATION-570?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Oliver Heger resolved CONFIGURATION-570.
----------------------------------------
       Resolution: Fixed
    Fix Version/s: 2.0

Fixed in SVN in revision 1623863.

The {{getKeys()}} implementation in {{SystemConfiguration}} was changed to 
return a snapshot of the keys currently stored in the system properties. Thus 
{{ConcurrentModificationExceptions}} can no longer occur.

> 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
>             Fix For: 2.0
>
>
> 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.3.4#6332)

Reply via email to