Fix AddCallback deadlock under concurrent transactions - #121
Open
krauthaufen wants to merge 1 commit into
Open
Conversation
MultiCallbackObject.check blocked on the callback-table lock while holding the object's monitor, the reverse of setMultiCallback's order. Release now uses Monitor.TryEnter and retries on the next Mark/remove when contended.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #120.
MultiCallbackObject.checktook the callback-table lock while the object's own monitor was already held (Markruns under the transaction'sEnterWrite,removeunderlock x), whereassetMultiCallbacktakes the table lock first and then enters the object inSubscribe. With one thread transacting and another adding/disposing callbacks, the two orders deadlock.checknow usesMonitor.TryEnteron the table: if contended it skips the self-release and stays subscribed; the nextMark/removeretries. Worst case is one empty callback object per adaptive object lingering until the next transaction or subscription on it.Tests: regression test from the issue's repro (deadlocked the host before, ~1 s now), plus a deterministic test forcing the contended path and asserting the lingering object is reused correctly by a new subscription and released by the next marking. Full suite green.