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

Keith Wall commented on QPID-7196:
----------------------------------

I think we need to review all the places in the code where we call 
System#setProperty or System#setProperties.    On the Broker side we will 
probably want to ensure that we mutate all system properties early in the 
Broker life when it is still single threaded and then from that point forward 
treat System properties as read-only.   With the example above, we are mutating 
the environment every time we start a Derby VNN/VH.

On client is harder, as we can't predicate when in an application's life it 
will load the Qpid client library and know what the application's thread may be 
doing.  Perhaps all we can do it ensure that System properties are mutated from 
a single point and document what the user needs to do in order to know all 
initialisation is complete.


> [Java Broker] ConcurrentModificationException can occur on Broker startup 
> when virtual host is activated
> --------------------------------------------------------------------------------------------------------
>
>                 Key: QPID-7196
>                 URL: https://issues.apache.org/jira/browse/QPID-7196
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Broker
>    Affects Versions: qpid-java-6.0.1, qpid-java-6.1
>            Reporter: Alex Rudyy
>             Fix For: qpid-java-6.1
>
>
> ConcurrentModificationException is observed on broker start-up having 2 
> virtual hosts with hundreds of queues. One host was DERBY VH and the other 
> was BDB VH. 
> {noformat}
> 2016-04-12 15:25:40,391 ERROR [VirtualHostNode-test-Config] 
> (o.a.q.s.m.AbstractConfiguredObject) - Failed to open object with name 
> 'test'.  Object will be put into ERROR state.
> java.util.ConcurrentModificationException: null
>         at java.util.Hashtable$Enumerator.next(Hashtable.java:1367) 
> ~[na:1.8.0_66]
>         at java.util.HashMap.putMapEntries(HashMap.java:511) ~[na:1.8.0_66]
>         at java.util.HashMap.putAll(HashMap.java:784) ~[na:1.8.0_66]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject.getContextKeys(AbstractConfiguredObject.java:2758)
>  [classes/:na]
>         at 
> org.apache.qpid.server.store.berkeleydb.BDBUtils.getCacheMode(BDBUtils.java:161)
>  ~[classes/:na]
>         at 
> org.apache.qpid.server.store.berkeleydb.StandardEnvironmentFacadeFactory$1.getCacheMode(StandardEnvironmentFacadeFactory.java:66)
>  ~[classes/:na]
>         at 
> org.apache.qpid.server.store.berkeleydb.StandardEnvironmentFacade.<init>(StandardEnvironmentFacade.java:110)
>  ~[classes/:na]
>         at 
> org.apache.qpid.server.store.berkeleydb.StandardEnvironmentFacadeFactory.createEnvironmentFacade(StandardEnvironmentFacadeFactory.java:82)
>  ~[classes/:na]
>         at 
> org.apache.qpid.server.store.berkeleydb.BDBMessageStore.openMessageStore(BDBMessageStore.java:80)
>  ~[classes/:na]
>         at 
> org.apache.qpid.server.virtualhost.AbstractVirtualHost.onActivate(AbstractVirtualHost.java:1871)
>  ~[classes/:na]
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
> ~[na:1.8.0_66]
>         at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
> ~[na:1.8.0_66]
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>  ~[na:1.8.0_66]
>         at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject.attainState(AbstractConfiguredObject.java:1308)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject.attainState(AbstractConfiguredObject.java:1287)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject$8.onSuccess(AbstractConfiguredObject.java:908)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject$8.onSuccess(AbstractConfiguredObject.java:902)
>  [classes/:na]
>         at com.google.common.util.concurrent.Futures$6.run(Futures.java:1319) 
> [guava-18.0.jar:na]
>         at 
> com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)
>  [guava-18.0.jar:na]
>         at 
> com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156)
>  [guava-18.0.jar:na]
>         at 
> com.google.common.util.concurrent.ExecutionList.add(ExecutionList.java:101) 
> [guava-18.0.jar:na]
>         at 
> com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:170)
>  [guava-18.0.jar:na]
>         at 
> com.google.common.util.concurrent.Futures.addCallback(Futures.java:1322) 
> [guava-18.0.jar:na]
>         at 
> com.google.common.util.concurrent.Futures.addCallback(Futures.java:1258) 
> [guava-18.0.jar:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject.doAttainState(AbstractConfiguredObject.java:901)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject.access$300(AbstractConfiguredObject.java:80)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject$1.execute(AbstractConfiguredObject.java:513)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject$1.execute(AbstractConfiguredObject.java:500)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:561)
>  [classes/:na]
>         at 
> org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:554)
>  [classes/:na]
>         at 
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl$TaskLoggingWrapper.execute(TaskExecutorImpl.java:270)
>  [classes/:na]
>         at 
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper$1.run(TaskExecutorImpl.java:342)
>  [classes/:na]
>         at java.security.AccessController.doPrivileged(Native Method) 
> [na:1.8.0_66]
>         at javax.security.auth.Subject.doAs(Subject.java:360) [na:1.8.0_66]
>         at 
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper.call(TaskExecutorImpl.java:335)
>  [classes/:na]
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
> [na:1.8.0_66]
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>  [na:1.8.0_66]
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>  [na:1.8.0_66]
>         at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66]
> {noformat}



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to