Paul Clare created VYSPER-326:
---------------------------------
Summary: Synchronizing on the BoshSessionContext for both inbound
and outbound processing can lead to deadlock.
Key: VYSPER-326
URL: https://issues.apache.org/jira/browse/VYSPER-326
Project: VYSPER
Issue Type: Bug
Affects Versions: 0.7, 0.8
Reporter: Paul Clare
This has taken some time to understand and is difficult to reproduce, the best
scenerio would be with multiplexed sessions.
Given the two call stacks below let's asuume that we have
[email protected]/foo (qtp124427164-18)
[email protected]/bar (qtp124427164-16)
For [email protected]/foo the inbound bosh request aquires a lock to her
BoshSession (0x000000070840e538)
And at the same time [email protected]/bar inbound request aquires a lock to her
BoshSession (0x000000070853ecd8)
In order for both threads to release the locks on their respective sessions
they will need to complete a call to LocalDeliveryUtils.relayToResourceDirectly
which according to spec will the handlers will attempt to deliver to ALL
resources.
This is where the deadlock occurs.
[email protected]/foo needs to aquire the lock to [email protected]/bar session
(currently held by qtp124427164-16) to complete relayToAllResources.
[email protected]/bar needs to get a lock to [email protected]/foo session
(currently held by qtp124427164-18) to complete relayToAllResources.
In both cases the held lock is in BoshHandler.process
synchronized (session) {
... ...
processSession(session, br);
And in both cases the waiting lock is the lock on the
BoshBackedSessionContext.write
public synchronized void write(Stanza stanza) {
write0(boshHandler.wrapStanza(stanza));
}
Currently I am use a different monitor for the outbound write to try and offset
the lock contention with the inbound processing.
public void write(Stanza stanza) {
synchronized(writeLock) {
write0(boshHandler.wrapStanza(stanza));
}
}
So inbound processing will lock on the Session and outbound writes will block
on the writeLock internal to the session.
I Would appreciate any thoughts on this.
"qtp124427164-18 - /bosh/":
at
org.apache.vysper.xmpp.extension.xep0124.BoshBackedSessionContext.write(BoshBackedSessionContext.java:196)
- waiting to lock <0x000000070853ecd8> (a
org.apache.vysper.xmpp.extension.xep0124.BoshBackedSessionContext)
at
org.apache.vysper.xmpp.delivery.LocalDeliveryUtils.relayToResourceDirectly(LocalDeliveryUtils.java:47)
at
org.apache.vysper.xmpp.modules.roster.handler.RosterIQHandler.pushRosterItemToInterestedResources(RosterIQHandler.java:281)
at
org.apache.vysper.xmpp.modules.roster.handler.RosterIQHandler.handleSet(RosterIQHandler.java:220)
at
org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler.executeIQLogic(DefaultIQHandler.java:73)
at
org.apache.vysper.xmpp.modules.core.base.handler.IQHandler.executeCore(IQHandler.java:117)
at
org.apache.vysper.xmpp.modules.core.base.handler.XMPPCoreStanzaHandler.execute(XMPPCoreStanzaHandler.java:113)
at
org.apache.vysper.xmpp.protocol.worker.AbstractStateAwareProtocolWorker.executeHandler(AbstractStateAwareProtocolWorker.java:73)
at
org.apache.vysper.xmpp.protocol.worker.AbstractStateAwareProtocolWorker.processStanza(AbstractStateAwareProtocolWorker.java:48)
at
org.apache.vysper.xmpp.protocol.ProtocolWorker.processStanza(ProtocolWorker.java:191)
at
org.apache.vysper.xmpp.extension.xep0124.BoshHandler.processStanza(BoshHandler.java:236)
at
org.apache.vysper.xmpp.extension.xep0124.BoshHandler.processSession(BoshHandler.java:183)
at
org.apache.vysper.xmpp.extension.xep0124.BoshHandler.process(BoshHandler.java:147)
- locked <0x000000070840e538> (a
org.apache.vysper.xmpp.extension.xep0124.BoshBackedSessionContext)
at
org.apache.vysper.xmpp.extension.xep0124.BoshSaxContentHandler.emitStanza(BoshSaxContentHandler.java:90)
"qtp124427164-16 - /bosh/":
at
org.apache.vysper.xmpp.extension.xep0124.BoshBackedSessionContext.write(BoshBackedSessionContext.java:196)
- waiting to lock <0x000000070840e538> (a
org.apache.vysper.xmpp.extension.xep0124.BoshBackedSessionContext)
at
org.apache.vysper.xmpp.delivery.LocalDeliveryUtils.relayToResourceDirectly(LocalDeliveryUtils.java:47)
at
org.apache.vysper.xmpp.modules.core.im.handler.PresenceSubscriptionHandler.handleOutboundSubscriptionRequest(PresenceSubscriptionHandler.java:550)
at
org.apache.vysper.xmpp.modules.core.im.handler.PresenceSubscriptionHandler.executeCorePresence(PresenceSubscriptionHandler.java:106)
at
org.apache.vysper.xmpp.modules.core.im.handler.PresenceHandler.executeCore(PresenceHandler.java:66)
at
org.apache.vysper.xmpp.modules.core.base.handler.XMPPCoreStanzaHandler.execute(XMPPCoreStanzaHandler.java:113)
at
org.apache.vysper.xmpp.protocol.worker.AbstractStateAwareProtocolWorker.executeHandler(AbstractStateAwareProtocolWorker.java:73)
at
org.apache.vysper.xmpp.protocol.worker.AbstractStateAwareProtocolWorker.processStanza(AbstractStateAwareProtocolWorker.java:48)
at
org.apache.vysper.xmpp.protocol.ProtocolWorker.processStanza(ProtocolWorker.java:191)
at
org.apache.vysper.xmpp.extension.xep0124.BoshHandler.processStanza(BoshHandler.java:236)
at
org.apache.vysper.xmpp.extension.xep0124.BoshHandler.processSession(BoshHandler.java:183)
at
org.apache.vysper.xmpp.extension.xep0124.BoshBackedSessionContext.insertRequest(BoshBackedSessionContext.java:669)
at
org.apache.vysper.xmpp.extension.xep0124.BoshHandler.process(BoshHandler.java:138)
- locked <0x000000070853ecd8> (a
org.apache.vysper.xmpp.extension.xep0124.BoshBackedSessionContext)
at
org.apache.vysper.xmpp.extension.xep0124.BoshSaxContentHandler.emitStanza(BoshSaxContentHandler.java:90)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira