[ 
https://issues.apache.org/jira/browse/CASSANDRA-12198?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15376837#comment-15376837
 ] 

Joshua McKenzie commented on CASSANDRA-12198:
---------------------------------------------

Updated branch to synchronize on a discrete Object rather than the cdcState 
enum. Apparently synchronizing on an enum in java means synchronization on the 
underlying Singleton object for the value which is clearly not what we want 
here.

> Deadlock in CDC during segment flush
> ------------------------------------
>
>                 Key: CASSANDRA-12198
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-12198
>             Project: Cassandra
>          Issue Type: Bug
>            Reporter: Joshua McKenzie
>            Assignee: Joshua McKenzie
>            Priority: Blocker
>             Fix For: 3.8
>
>
> 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.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to