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

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

It appears to me that:

* client - system properties at class load time 
(ClientProperties#ensureIsLoaded) as AMQConnection, AMQDestination, or 
AMQConnectionFactory are classload loaded.  I think this is already as early in 
the lifecycle as the client library can organise for itself.
* broker - the Main path loads system properties whilst the Broker is still 
single threaded, so this should be safe.  The Derby implementation appears to 
be the only exception: it sets a system property on the fly as the VHN or VH is 
activated.

The Derby implementation should change so that the system property is set as 
early as possible and set exactly - ideally as soon as the first Derby specific 
class is loaded.



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