[ 
https://issues.apache.org/jira/browse/DERBY-4080?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mike Matrigali updated DERBY-4080:
----------------------------------

    Affects Version/s: 10.11.0.0

ran script against trunk and it gets lock timeout at end.
                
> Deadlock between locks and latches in BTreeController.compareRowsForInsert()
> ----------------------------------------------------------------------------
>
>                 Key: DERBY-4080
>                 URL: https://issues.apache.org/jira/browse/DERBY-4080
>             Project: Derby
>          Issue Type: Bug
>          Components: Store
>    Affects Versions: 10.4.2.0, 10.11.0.0
>            Reporter: Knut Anders Hatlen
>              Labels: derby_triage10_5_2, derby_triage10_9
>         Attachments: repro.sql
>
>
> It looks like BTreeController.compareRowsForInsert(), which is used to check 
> for duplicates in a unique nullable index, can run into a deadlock which 
> involves both locks and latches.
> Here's what I think can happen:
> comparePreviousRecord() (or compareNextRecord()) holds a latch on the index 
> page where a new row is about to be inserted, and needs to check if there's a 
> duplicate on one of the adjacent rows. Because the row is near a page 
> boundary, this check moves to another index page, while still holding the 
> latch on the original index page. Then compareRowsForInsert() is called, 
> which tries to get an update lock on the existing row. If it has to wait for 
> the update lock, the latch on the current page is released, but the latch on 
> the original index page is kept. This means that the transaction is holding a 
> latch while it is waiting for a lock, which means that it is blocking all 
> access to that page until it has been granted the lock. If some other 
> transaction that is holding a conflicting lock on the row later needs to 
> latch the index page, those two transactions run into a deadlock and the one 
> that's waiting for the lock will eventually time out (but it will not be 
> reported as a deadlock).
> If compareRowsForInsert() releases all latches when it needs to wait for a 
> lock, the deadlock is prevented, and both of the transactions may be able to 
> complete without timing out.

--
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

Reply via email to