Skip to content

don't hold lock on EntityManagementSupport for longer than needed#306

Merged
asfgit merged 1 commit intoapache:masterfrom
ahgittin:management-synchronization
Aug 25, 2016
Merged

don't hold lock on EntityManagementSupport for longer than needed#306
asfgit merged 1 commit intoapache:masterfrom
ahgittin:management-synchronization

Conversation

@ahgittin
Copy link
Copy Markdown
Contributor

@ahgittin ahgittin commented Aug 25, 2016

fixes a deadlock observed with a screwy blueprints, when:

"item added" callback: locking EntityManagementSupport to get subscription context, while updating members

        at org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport.getSubscriptionContext(EntityManagementSupport.java:362)
        - waiting to lock <0x0000000088908188> (a org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSubscriptionSupport.getSubscriptionContext(AbstractEntity.java:1519)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.emitInternal(AbstractEntity.java:1191)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.emit(AbstractEntity.java:1184)
        at org.apache.brooklyn.core.entity.EntityDynamicType.addSensorIfAbsent(EntityDynamicType.java:204)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.set(AbstractEntity.java:1093)
        at org.apache.brooklyn.entity.group.AbstractGroupImpl.addMember(AbstractGroupImpl.java:134)
        - locked <0x0000000085f0fa30> (a java.util.LinkedHashSet)
        at org.apache.brooklyn.entity.group.DynamicGroupImpl.onEntityAdded(DynamicGroupImpl.java:126)
        - locked <0x0000000085f0fb28> (a java.lang.Object)
        at org.apache.brooklyn.entity.group.DynamicGroupImpl$MyEntitySetChangeListener.onItemAdded(DynamicGroupImpl.java:154)

publishing on management started, locking members in order to deliver, while handling onManagementStarted

        at org.apache.brooklyn.entity.group.AbstractGroupImpl.getMembers(AbstractGroupImpl.java:269)
        - waiting to lock <0x0000000085f0fa30> (a java.util.LinkedHashSet)
        at sun.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
        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:188)
        at com.sun.proxy.$Proxy181.getMembers(Unknown Source)
        at org.apache.brooklyn.core.mgmt.internal.AbstractSubscriptionManager$2.apply(AbstractSubscriptionManager.java:130)
        at org.apache.brooklyn.core.mgmt.internal.AbstractSubscriptionManager$2.apply(AbstractSubscriptionManager.java:128)
        at org.apache.brooklyn.core.mgmt.internal.LocalSubscriptionManager.publish(LocalSubscriptionManager.java:221)
        at org.apache.brooklyn.core.mgmt.internal.QueueingSubscriptionManager.startDelegatingForPublishing(QueueingSubscriptionManager.java:91)
        - locked <0x00000000889016a8> (a org.apache.brooklyn.core.mgmt.internal.QueueingSubscriptionManager)
        at org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport.onManagementStarted(EntityManagementSupport.java:247)
        - locked <0x0000000088908188> (a org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.manageRecursive(LocalEntityManager.java:392)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.manage(LocalEntityManager.java:278)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.createEntity(LocalEntityManager.java:152)
        at org.apache.brooklyn.core.mgmt.EntityManagementUtils.createUnstarted(EntityManagementUtils.java:83)

my blueprint had a static sensor waiting on an attribute from another static sensor, which is possibly why...

fixes a deadlock observed with a screwy blueprints, when:

"item added" callback:  locking EntityManagementSupport to get subscription context, while updating members
        at org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport.getSubscriptionContext(EntityManagementSupport.java:362)
        - waiting to lock <0x0000000088908188> (a org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSubscriptionSupport.getSubscriptionContext(AbstractEntity.java:1519)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.emitInternal(AbstractEntity.java:1191)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.emit(AbstractEntity.java:1184)
        at org.apache.brooklyn.core.entity.EntityDynamicType.addSensorIfAbsent(EntityDynamicType.java:204)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.set(AbstractEntity.java:1093)
        at org.apache.brooklyn.entity.group.AbstractGroupImpl.addMember(AbstractGroupImpl.java:134)
        - locked <0x0000000085f0fa30> (a java.util.LinkedHashSet)
        at org.apache.brooklyn.entity.group.DynamicGroupImpl.onEntityAdded(DynamicGroupImpl.java:126)
        - locked <0x0000000085f0fb28> (a java.lang.Object)
        at org.apache.brooklyn.entity.group.DynamicGroupImpl$MyEntitySetChangeListener.onItemAdded(DynamicGroupImpl.java:154)

publishing on management started, locking members in order to deliver, while handling onManagementStarted
        at org.apache.brooklyn.entity.group.AbstractGroupImpl.getMembers(AbstractGroupImpl.java:269)
        - waiting to lock <0x0000000085f0fa30> (a java.util.LinkedHashSet)
        at sun.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
        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:188)
        at com.sun.proxy.$Proxy181.getMembers(Unknown Source)
        at org.apache.brooklyn.core.mgmt.internal.AbstractSubscriptionManager$2.apply(AbstractSubscriptionManager.java:130)
        at org.apache.brooklyn.core.mgmt.internal.AbstractSubscriptionManager$2.apply(AbstractSubscriptionManager.java:128)
        at org.apache.brooklyn.core.mgmt.internal.LocalSubscriptionManager.publish(LocalSubscriptionManager.java:221)
        at org.apache.brooklyn.core.mgmt.internal.QueueingSubscriptionManager.startDelegatingForPublishing(QueueingSubscriptionManager.java:91)
        - locked <0x00000000889016a8> (a org.apache.brooklyn.core.mgmt.internal.QueueingSubscriptionManager)
        at org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport.onManagementStarted(EntityManagementSupport.java:247)
        - locked <0x0000000088908188> (a org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.manageRecursive(LocalEntityManager.java:392)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.manage(LocalEntityManager.java:278)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.createEntity(LocalEntityManager.java:152)
        at org.apache.brooklyn.core.mgmt.EntityManagementUtils.createUnstarted(EntityManagementUtils.java:83)

my blueprint had a static sensor waiting on an attribute from another static sensor, which is possibly why...
@ahgittin
Copy link
Copy Markdown
Contributor Author

@neykov does this look alright to you? would like to land this week if poss... /cc @aledsage

@neykov
Copy link
Copy Markdown
Member

neykov commented Aug 25, 2016

LGTM, merging.

@asfgit asfgit merged commit f069025 into apache:master Aug 25, 2016
asfgit pushed a commit that referenced this pull request Aug 25, 2016
don't hold lock on EntityManagementSupport for longer than needed

fixes a deadlock observed with a screwy blueprints, when:

"item added" callback:  locking EntityManagementSupport to get subscription context, while updating members
```
        at org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport.getSubscriptionContext(EntityManagementSupport.java:362)
        - waiting to lock <0x0000000088908188> (a org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSubscriptionSupport.getSubscriptionContext(AbstractEntity.java:1519)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.emitInternal(AbstractEntity.java:1191)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.emit(AbstractEntity.java:1184)
        at org.apache.brooklyn.core.entity.EntityDynamicType.addSensorIfAbsent(EntityDynamicType.java:204)
        at org.apache.brooklyn.core.entity.AbstractEntity$BasicSensorSupport.set(AbstractEntity.java:1093)
        at org.apache.brooklyn.entity.group.AbstractGroupImpl.addMember(AbstractGroupImpl.java:134)
        - locked <0x0000000085f0fa30> (a java.util.LinkedHashSet)
        at org.apache.brooklyn.entity.group.DynamicGroupImpl.onEntityAdded(DynamicGroupImpl.java:126)
        - locked <0x0000000085f0fb28> (a java.lang.Object)
        at org.apache.brooklyn.entity.group.DynamicGroupImpl$MyEntitySetChangeListener.onItemAdded(DynamicGroupImpl.java:154)
```

publishing on management started, locking members in order to deliver, while handling onManagementStarted
```
        at org.apache.brooklyn.entity.group.AbstractGroupImpl.getMembers(AbstractGroupImpl.java:269)
        - waiting to lock <0x0000000085f0fa30> (a java.util.LinkedHashSet)
        at sun.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
        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:188)
        at com.sun.proxy.$Proxy181.getMembers(Unknown Source)
        at org.apache.brooklyn.core.mgmt.internal.AbstractSubscriptionManager$2.apply(AbstractSubscriptionManager.java:130)
        at org.apache.brooklyn.core.mgmt.internal.AbstractSubscriptionManager$2.apply(AbstractSubscriptionManager.java:128)
        at org.apache.brooklyn.core.mgmt.internal.LocalSubscriptionManager.publish(LocalSubscriptionManager.java:221)
        at org.apache.brooklyn.core.mgmt.internal.QueueingSubscriptionManager.startDelegatingForPublishing(QueueingSubscriptionManager.java:91)
        - locked <0x00000000889016a8> (a org.apache.brooklyn.core.mgmt.internal.QueueingSubscriptionManager)
        at org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport.onManagementStarted(EntityManagementSupport.java:247)
        - locked <0x0000000088908188> (a org.apache.brooklyn.core.mgmt.internal.EntityManagementSupport)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.manageRecursive(LocalEntityManager.java:392)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.manage(LocalEntityManager.java:278)
        at org.apache.brooklyn.core.mgmt.internal.LocalEntityManager.createEntity(LocalEntityManager.java:152)
        at org.apache.brooklyn.core.mgmt.EntityManagementUtils.createUnstarted(EntityManagementUtils.java:83)
```

my blueprint had a static sensor waiting on an attribute from another static sensor, which is possibly why...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants