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

ASF GitHub Bot commented on BROOKLYN-570:
-----------------------------------------

Github user aledsage commented on a diff in the pull request:

    https://github.com/apache/brooklyn-server/pull/917#discussion_r158293220
  
    --- Diff: 
core/src/main/java/org/apache/brooklyn/core/entity/AbstractEntity.java ---
    @@ -749,13 +756,15 @@ public Application getApplication() {
         // FIXME Can this really be deleted? Overridden by 
AbstractApplication; needs careful review
         /** @deprecated since 0.4.0 should not be needed / leaked outwith 
brooklyn internals / mgmt support? */
         @Deprecated
    -    protected synchronized void setApplication(Application app) {
    -        if (application != null) {
    -            if (application.getId() != app.getId()) {
    -                throw new IllegalStateException("Cannot change application 
of entity (attempted for "+this+" from "+getApplication()+" to "+app);
    +    protected void setApplication(Application app) {
    +        synchronized (appMutex) {
    --- End diff --
    
    We don't ever want an entity-author to call `setApplication`, so I think 
I'm ok leaving it deprecated. Not sure what we should do long term to hide this 
away somewhere in framework code so that users don't accidentally call it or 
get confused by it.
    
    The use of `FIXME` is too strong; I'll change it to a `TODO` - it's low 
priority as it does work, it's just ugly.
    
    ---
    For where to put the synchronized, I think it needs to be here.


> Brooklyn hangs with custom java entity synchronizing on self
> ------------------------------------------------------------
>
>                 Key: BROOKLYN-570
>                 URL: https://issues.apache.org/jira/browse/BROOKLYN-570
>             Project: Brooklyn
>          Issue Type: Bug
>            Reporter: Aled Sage
>
> If you have a custom Java entity your start method calls a {{synchronized}} 
> method (synchronizing on {{this}}), in which it tries to resolve DSL then it 
> can hang.
> See snippets from {{jstack}} below:
> {noformat}
> "brooklyn-execmanager-sUNO5Yoi-102918" #220491 daemon prio=5 os_prio=31 
> tid=0x00007faf342f7800 nid=0x2967b waiting for monitor entry 
> [0x000070000ef04000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
>         at 
> org.apache.brooklyn.core.entity.AbstractEntity.setApplication(AbstractEntity.java:753)
>         - waiting to lock <0x0000000797da2ad8> (a com.acme.MyEntityImpl)
>         at 
> org.apache.brooklyn.core.entity.AbstractEntity.getApplication(AbstractEntity.java:744)
>         at 
> org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent$EntityInScopeFinder.callImpl(DslComponent.java:257)
>         at 
> org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent$EntityInScopeFinder.call(DslComponent.java:225)
>         at 
> org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent$EntityInScopeFinder.call(DslComponent.java:192)
>         at 
> org.apache.brooklyn.util.core.task.DynamicSequentialTask$DstJob.call(DynamicSequentialTask.java:364)
>         at 
> org.apache.brooklyn.util.core.task.BasicExecutionManager$SubmissionCallable.call(BasicExecutionManager.java:565)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> "brooklyn-execmanager-sUNO5Yoi-102898" #220470 daemon prio=5 os_prio=31 
> tid=0x00007faf390a8800 nid=0x23477 waiting on condition [0x00007000040ff000]
>    java.lang.Thread.State: WAITING (parking)
>         at sun.misc.Unsafe.park(Native Method)
>         - parking to wait for  <0x00000007984a3ff0> (a 
> java.util.concurrent.FutureTask)
>         at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>         at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:429)
>         at java.util.concurrent.FutureTask.get(FutureTask.java:191)
>         at 
> com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:63)
>         at 
> org.apache.brooklyn.util.core.task.BasicTask.get(BasicTask.java:384)
>         at org.apache.brooklyn.util.time.Durations.get(Durations.java:43)
>         at org.apache.brooklyn.util.time.Durations.get(Durations.java:68)
>         at 
> org.apache.brooklyn.util.core.task.ValueResolver.getMaybeInternal(ValueResolver.java:499)
>         at 
> org.apache.brooklyn.util.core.task.ValueResolver.getMaybe(ValueResolver.java:324)
>         at 
> org.apache.brooklyn.util.core.task.ValueResolver.get(ValueResolver.java:317)
>         at 
> org.apache.brooklyn.util.core.task.Tasks.resolveValue(Tasks.java:159)
>         at 
> org.apache.brooklyn.core.config.BasicConfigKey.resolveValue(BasicConfigKey.java:447)
>         at 
> org.apache.brooklyn.core.config.BasicConfigKey.extractValue(BasicConfigKey.java:432)
>         at 
> org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl.resolveRawValueFromContainerIgnoringDeprecatedNames(AbstractConfigMapImpl.java:352)
>         at 
> org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl.resolveRawValueFromContainer(AbstractConfigMapImpl.java:324)
>         at 
> org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl$3.apply(AbstractConfigMapImpl.java:433)
>         at 
> org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl$3.apply(AbstractConfigMapImpl.java:429)
>         at 
> org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl.getConfigImpl(AbstractConfigMapImpl.java:446)
>         at 
> org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl.getConfig(AbstractConfigMapImpl.java:113)
>         at 
> org.apache.brooklyn.core.objs.AbstractConfigurationSupportInternal.get(AbstractConfigurationSupportInternal.java:161)
>         at io.com.acme.MyEntityImpl.getTarget(MyEntityImpl.java:106)
>         at com.acme.MyEntityImpl.setupSubscriptions(MyEntityImpl.java:77)
>         - locked <0x0000000797da2ad8> (a com.acme.MyEntityImpl)
>         at com.acme.MyEntityImpl.doStart(MyEntityImpl.java:66)
>         at com.acme.AbstractMyEntityImpl.start(AbstractMyEntityImpl.java:63)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:498)
>         at 
> org.apache.brooklyn.util.javalang.Reflections.invokeMethodFromArgs(Reflections.java:984)
>         at 
> org.apache.brooklyn.util.javalang.Reflections.invokeMethodFromArgs(Reflections.java:871)
>         at 
> org.apache.brooklyn.util.javalang.Reflections.invokeMethodFromArgs(Reflections.java:857)
>         at 
> org.apache.brooklyn.util.javalang.Reflections.invokeMethodFromArgs(Reflections.java:852)
>         at 
> org.apache.brooklyn.core.mgmt.internal.AbstractManagementContext.invokeEffectorMethodLocal(AbstractManagementContext.java:327)
>         at 
> org.apache.brooklyn.core.mgmt.internal.AbstractManagementContext.invokeEffectorMethodSync(AbstractManagementContext.java:366)
>         at 
> org.apache.brooklyn.core.mgmt.internal.EffectorUtils.invokeMethodEffector(EffectorUtils.java:274)
>         at 
> org.apache.brooklyn.core.effector.MethodEffector.call(MethodEffector.java:153)
>         at 
> org.apache.brooklyn.core.entity.trait.Startable$StartEffectorBody.call(Startable.java:56)
>         at 
> org.apache.brooklyn.core.entity.trait.Startable$StartEffectorBody.call(Startable.java:50)
>         at 
> org.apache.brooklyn.core.effector.EffectorTasks$EffectorBodyTaskFactory$1.call(EffectorTasks.java:82)
>         at 
> org.apache.brooklyn.util.core.task.DynamicSequentialTask$DstJob.call(DynamicSequentialTask.java:364)
>         at 
> org.apache.brooklyn.util.core.task.BasicExecutionManager$SubmissionCallable.call(BasicExecutionManager.java:565)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>         at java.lang.Thread.run(Thread.java:748)
> "qtp507126053-220337" #220337 prio=5 os_prio=31 tid=0x00007faf306da800 
> nid=0xbde3 waiting for monitor entry [0x000070000cc9d000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
>         at 
> org.apache.brooklyn.core.entity.AbstractEntity.setApplication(AbstractEntity.java:753)
>         - waiting to lock <0x0000000797da2ad8> (a com.acme.MyEntityImpl)
>         at 
> org.apache.brooklyn.core.entity.AbstractEntity.getApplication(AbstractEntity.java:744)
>         at 
> org.apache.brooklyn.core.entity.AbstractEntity.getApplicationId(AbstractEntity.java:763)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:498)
>         at 
> org.apache.brooklyn.core.objs.proxy.EntityProxyImpl.invoke(EntityProxyImpl.java:189)
>         at com.sun.proxy.$Proxy246.getApplicationId(Unknown Source)
>         at 
> org.apache.brooklyn.rest.resources.ApplicationResource.fromEntity(ApplicationResource.java:147)
>         at 
> org.apache.brooklyn.rest.resources.ApplicationResource.fromEntity(ApplicationResource.java:124)
>         at 
> org.apache.brooklyn.rest.resources.ApplicationResource.fetch(ApplicationResource.java:188)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to