Aled Sage created BROOKLYN-260:
----------------------------------

             Summary: ConcurrentModificationException in BrooklynProperties 
during startup (Brooklyn failed to start)
                 Key: BROOKLYN-260
                 URL: https://issues.apache.org/jira/browse/BROOKLYN-260
             Project: Brooklyn
          Issue Type: Bug
    Affects Versions: 0.9.0
            Reporter: Aled Sage


Running {{brooklyn launch}}, it failed to start with the 
{{ConcurrentModificationException}} shown below. Trying a second time, it 
worked fine. I've only seen this error once.

{noformat}
2016-04-29 15:26:23,873 ERROR o.a.brooklyn.cli.AbstractMain [main]: Execution 
error: null
java.util.ConcurrentModificationException: null
        at 
java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:394) 
~[na:1.7.0_71]
        at java.util.LinkedHashMap$EntryIterator.next(LinkedHashMap.java:413) 
~[na:1.7.0_71]
        at java.util.LinkedHashMap$EntryIterator.next(LinkedHashMap.java:412) 
~[na:1.7.0_71]
        at 
org.apache.brooklyn.core.internal.BrooklynPropertiesImpl.submap(BrooklynPropertiesImpl.java:463)
 ~[org.apache.brooklyn-brooklyn-core-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.core.internal.BrooklynPropertiesImpl.submap(BrooklynPropertiesImpl.java:61)
 ~[org.apache.brooklyn-brooklyn-core-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.core.mgmt.internal.DeferredBrooklynProperties.submap(DeferredBrooklynProperties.java:193)
 ~[org.apache.brooklyn-brooklyn-core-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.core.mgmt.internal.DeferredBrooklynProperties.submap(DeferredBrooklynProperties.java:55)
 ~[org.apache.brooklyn-brooklyn-core-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.core.location.BasicLocationRegistry.updateDefinedLocations(BasicLocationRegistry.java:277)
 ~[org.apache.brooklyn-brooklyn-core-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.core.location.BasicLocationRegistry.<init>(BasicLocationRegistry.java:165)
 ~[org.apache.brooklyn-brooklyn-core-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.core.mgmt.internal.AbstractManagementContext.getLocationRegistry(AbstractManagementContext.java:381)
 ~[org.apache.brooklyn-brooklyn-core-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.launcher.common.BasicLauncher.addLocations(BasicLauncher.java:473)
 
~[org.apache.brooklyn-brooklyn-launcher-common-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at 
org.apache.brooklyn.launcher.common.BasicLauncher.start(BasicLauncher.java:427) 
~[org.apache.brooklyn-brooklyn-launcher-common-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at org.apache.brooklyn.cli.Main$LaunchCommand.call(Main.java:461) 
~[org.apache.brooklyn-brooklyn-cli-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at org.apache.brooklyn.cli.Main$LaunchCommand.call(Main.java:196) 
~[org.apache.brooklyn-brooklyn-cli-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at org.apache.brooklyn.cli.AbstractMain.execCli(AbstractMain.java:252) 
[org.apache.brooklyn-brooklyn-cli-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at org.apache.brooklyn.cli.AbstractMain.execCli(AbstractMain.java:244) 
[org.apache.brooklyn-brooklyn-cli-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
        at org.apache.brooklyn.cli.Main.main(Main.java:123) 
[org.apache.brooklyn-brooklyn-cli-0.10.0-SNAPSHOT.jar:0.10.0-SNAPSHOT]
{noformat}

This means something must have put/removed to the BrooklynProperties while the 
main thread is still starting. This is done, for example, by 
{{BrooklynCampPlatform.setConfigKeyAtManagmentContext()}}. It is also done in 
brooklyn-tosca. There are probably other places as well.

The javadoc of {{BrooklynPropertiesImpl}} says:

{noformat}
 * TODO methods in this class are not thread safe.
 * intention is that they are set during startup and not modified thereafter.
{noformat}

It seems to me the best thing is to make {{BrooklynPropertiesImpl}} thread 
safe. Also I'd prefer if the impl didn't just extend {{LinkedHashMap}}. That 
gives up a lot of control over how we implement it (e.g. makes it fiddly to 
make it thread-safe).




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

Reply via email to