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

Vladislav Pyatkov updated IGNITE-28958:
---------------------------------------
    Description: 
h2.Motivation
Concurrent bulk operations executed in pessimistic transactions may acquire 
locks for the same set of entries in different orders. This can produce a 
cyclic lock dependency between transactions and eventually result in a 
deadlock, transaction timeout, or failure to finish the operation.
The problem can be reproduced with both SQL DML and KeyValue API operations:
# Concurrent UPDATE statements affecting the same rows through a WHERE 
condition.
# Concurrent IgniteCache.putAll calls whose input maps iterate over the same 
keys in opposite orders.
# Concurrent IgniteCache.getAll calls whose input sets iterate over the same 
keys in opposite orders. REPEATABLE_READ isolation is used so that getAll 
acquires transactional locks.

BulkOperationDeadlockIntegrationTest provides the reproducing scenarios:
- testUpdateWithWhereDoesNotDeadlock
- testPutAllWithOppositeKeyOrderDoesNotDeadlock
- testGetAllWithOppositeKeyOrderDoesNotDeadlock

h2.Definition of done
* concurrent UPDATE operations affecting the same rows do not deadlock;
* concurrent putAll operations with opposite input orders do not deadlock;
* concurrent getAll operations with opposite input orders do not deadlock;
* the corresponding ignored tests can be enabled and pass consistently.


  was:
h2.Motivation
Concurrent bulk operations executed in pessimistic transactions may acquire 
locks for the same set of entries in different orders. This can produce a 
cyclic lock dependency between transactions and eventually result in a 
deadlock, transaction timeout, or failure to finish the operation.
The problem can be reproduced with both SQL DML and KeyValue API operations:
# Concurrent UPDATE statements affecting the same rows through a WHERE 
condition.
# Concurrent IgniteCache.putAll calls whose input maps iterate over the same 
keys in opposite orders.
# Concurrent IgniteCache.getAll calls whose input sets iterate over the same 
keys in opposite orders. REPEATABLE_READ isolation is used so that getAll 
acquires transactional locks.

BulkOperationDeadlockIntegrationTest provides the reproducing scenarios:
- testUpdateWithWhereDoesNotDeadlock
- testPutAllWithOppositeKeyOrderDoesNotDeadlock
- testGetAllWithOppositeKeyOrderDoesNotDeadlock



> Prevent deadlocks in concurrent bulk operations with different key orders
> -------------------------------------------------------------------------
>
>                 Key: IGNITE-28958
>                 URL: https://issues.apache.org/jira/browse/IGNITE-28958
>             Project: Ignite
>          Issue Type: Bug
>          Components: cache
>            Reporter: Vladislav Pyatkov
>            Priority: Major
>              Labels: calcite, ignite-2, sql
>         Attachments: BulkOperationDeadlockIntegrationTest.java
>
>
> h2.Motivation
> Concurrent bulk operations executed in pessimistic transactions may acquire 
> locks for the same set of entries in different orders. This can produce a 
> cyclic lock dependency between transactions and eventually result in a 
> deadlock, transaction timeout, or failure to finish the operation.
> The problem can be reproduced with both SQL DML and KeyValue API operations:
> # Concurrent UPDATE statements affecting the same rows through a WHERE 
> condition.
> # Concurrent IgniteCache.putAll calls whose input maps iterate over the same 
> keys in opposite orders.
> # Concurrent IgniteCache.getAll calls whose input sets iterate over the same 
> keys in opposite orders. REPEATABLE_READ isolation is used so that getAll 
> acquires transactional locks.
> BulkOperationDeadlockIntegrationTest provides the reproducing scenarios:
> - testUpdateWithWhereDoesNotDeadlock
> - testPutAllWithOppositeKeyOrderDoesNotDeadlock
> - testGetAllWithOppositeKeyOrderDoesNotDeadlock
> h2.Definition of done
> * concurrent UPDATE operations affecting the same rows do not deadlock;
> * concurrent putAll operations with opposite input orders do not deadlock;
> * concurrent getAll operations with opposite input orders do not deadlock;
> * the corresponding ignored tests can be enabled and pass consistently.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to