[ https://issues.apache.org/jira/browse/BROOKLYN-570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16299784#comment-16299784 ]
ASF GitHub Bot commented on BROOKLYN-570: ----------------------------------------- Github user tbouron commented on a diff in the pull request: https://github.com/apache/brooklyn-server/pull/917#discussion_r158235800 --- 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 -- @aledsage Is it the right place to synchronize as this method is `deprecated`? It looks like the answer is yes but just wanted to check. Do you think the `@Deprecated` annotation can be removed? Or at least the `FIXME` comment? > 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)