Alan Conway created QPID-5139:
---------------------------------
Summary: HA transactions block a thread, can deadlock the broker.
Key: QPID-5139
URL: https://issues.apache.org/jira/browse/QPID-5139
Project: Qpid
Issue Type: Bug
Components: C++ Clustering
Affects Versions: 0.24
Reporter: Alan Conway
Assignee: Alan Conway
Priority: Critical
Fix For: 0.25
When the client sends a "prepare" command for a transaction, the thread
handling that command is blocked until all backups have responded with their
prepare status. This can easily deadlock the broker if there are more
concurrent transactions than worker threads.
To reproduce you need a way to delay completion of a transaction. The following
regression test illustrates, it will be added to TransactionTests in
ha_tests.py as part of the fix:
def test_tx_block_threads(self):
"""Verify that TXs blocked in commit don't block broker threads."""
cluster = HaCluster(self, 2, args=["--worker-threads=2"])
sessions = [cluster[0].connect().session(transactional=True) for i in
xrange(2)]
for s in sessions: s.sender("foo;{create:always}").send("foo")
self.assertEqual(2, len(cluster[1].agent().tx_queues()))
os.kill(cluster[1].pid, signal.SIGSTOP) # Freeze backup so tx can't
complete.
threads = [ Thread(target=s.commit) for s in sessions]
for t in threads: t.start()
cluster[0].ready(timeout=1) # Should not block
os.kill(cluster[1].pid, signal.SIGCONT) # Allow tx to complete.
for t in threads: t.join()
c.close()
--
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
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]