Details
-
Bug
-
Status: Resolved
-
Urgent
-
Resolution: Fixed
-
None
-
Critical
Description
In the patch for CASSANDRA-8844, we added a synchronized(this) block inside CommitLogSegment.setCDCState. This introduces the possibility of deadlock in the following scenario:
- A CommitLogSegment.sync() call is made (synchronized method)
- A CommitLogSegment.allocate call from a cdc-enabled write is in flight and acquires a reference to the Group on appendOrder (the OpOrder in the Segment)
- CommmitLogSegment.sync hits waitForModifications which calls appendOrder.awaitNewBarrier
- The in-flight write, if changing the state of the segment from CDCState.PERMITTED to CDCState.CONTAINS, enters setCDCState and blocks on synchronized(this)
And neither of them ever come back. This came up while doing some further work on CASSANDRA-12148.