Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
c++ broker on linux.
Description
Rarely happens, but I was lucky enough to catch this on the debugger.
Broker locks due to lock inversion. Here's the flow:
thread 1 (broker):
1) gets bind request for the management topic exchange
2) binds to the management topic exchange [takes topic->lock]
3) attempts to call management agent allocId() [takes mgmt agent->userLock]
At the same time:
thread 4 (mgmt agent periodic timer)
1) periodic processing [takes mgmt agent->userLock]
2) call topicexchange::route() [takes topic->lock]
thread one holds the topic->lock, tries to take mgmt agent->userLock
thread four holds mgmt agent->userLock, tries to take topic->lock
deadlock.