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

Kirill Tkalenko updated IGNITE-19169:
-------------------------------------
    Description: 
h2. *Update:*

For now, a possible deadlock fo *MvPartitionStorage#pollForVacuum* inside 
*MvPartitionStorage#runConsistently* is fine, because we need to maintain 
consistency when working with indexes.

It is enough for us to fix *StorageUpdateHandler#executeBatchGc* so that it 
runs outside the general *MvPartitionStorage#runConsistently* and each 
*StorageUpdateHandler#internalVacuum* is in its own 
*MvPartitionStorage#runConsistently*.

Deadlock detected while calling 
*org.apache.ignite.internal.storage.MvPartitionStorage#pollForVacuum*, 
reproducer:
{code:java}
@Test
public void testDeadLock() {
    RowId rowId2 = new RowId(PARTITION_ID);
    for (int i = 0; i < REPEATS; i++) {
        addWriteCommitted(ROW_ID, TABLE_ROW, clock.now());
        addWriteCommitted(rowId2, TABLE_ROW2, clock.now());
        addWriteCommitted(ROW_ID, TABLE_ROW, clock.now());
        addWriteCommitted(rowId2, TABLE_ROW2, clock.now());
        addWriteCommitted(ROW_ID, null, clock.now());
        addWriteCommitted(rowId2, null, clock.now());

        RunnableX remove2rowsAction = () -> {
            storage.runConsistently(() -> {
                storage.pollForVacuum(HybridTimestamp.MAX_VALUE);
                storage.pollForVacuum(HybridTimestamp.MAX_VALUE);
                return null;
            });
        };

        runRace(remove2rowsAction, remove2rowsAction);
        assertNull(storage.closestRowId(RowId.lowestRowId(PARTITION_ID)));
    }
}
{code}


  was:
Deadlock detected while calling 
*org.apache.ignite.internal.storage.MvPartitionStorage#pollForVacuum*, 
reproducer:
{code:java}
@Test
public void testDeadLock() {
    RowId rowId2 = new RowId(PARTITION_ID);
    for (int i = 0; i < REPEATS; i++) {
        addWriteCommitted(ROW_ID, TABLE_ROW, clock.now());
        addWriteCommitted(rowId2, TABLE_ROW2, clock.now());
        addWriteCommitted(ROW_ID, TABLE_ROW, clock.now());
        addWriteCommitted(rowId2, TABLE_ROW2, clock.now());
        addWriteCommitted(ROW_ID, null, clock.now());
        addWriteCommitted(rowId2, null, clock.now());

        RunnableX remove2rowsAction = () -> {
            storage.runConsistently(() -> {
                storage.pollForVacuum(HybridTimestamp.MAX_VALUE);
                storage.pollForVacuum(HybridTimestamp.MAX_VALUE);
                return null;
            });
        };

        runRace(remove2rowsAction, remove2rowsAction);
        assertNull(storage.closestRowId(RowId.lowestRowId(PARTITION_ID)));
    }
}
{code}



> Deadlock detected while calling MvPartitionStorage#pollForVacuum
> ----------------------------------------------------------------
>
>                 Key: IGNITE-19169
>                 URL: https://issues.apache.org/jira/browse/IGNITE-19169
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 3.0.0-beta2
>            Reporter: Kirill Tkalenko
>            Assignee: Kirill Tkalenko
>            Priority: Major
>              Labels: ignite-3
>             Fix For: 3.0.0-beta2
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> h2. *Update:*
> For now, a possible deadlock fo *MvPartitionStorage#pollForVacuum* inside 
> *MvPartitionStorage#runConsistently* is fine, because we need to maintain 
> consistency when working with indexes.
> It is enough for us to fix *StorageUpdateHandler#executeBatchGc* so that it 
> runs outside the general *MvPartitionStorage#runConsistently* and each 
> *StorageUpdateHandler#internalVacuum* is in its own 
> *MvPartitionStorage#runConsistently*.
> Deadlock detected while calling 
> *org.apache.ignite.internal.storage.MvPartitionStorage#pollForVacuum*, 
> reproducer:
> {code:java}
> @Test
> public void testDeadLock() {
>     RowId rowId2 = new RowId(PARTITION_ID);
>     for (int i = 0; i < REPEATS; i++) {
>         addWriteCommitted(ROW_ID, TABLE_ROW, clock.now());
>         addWriteCommitted(rowId2, TABLE_ROW2, clock.now());
>         addWriteCommitted(ROW_ID, TABLE_ROW, clock.now());
>         addWriteCommitted(rowId2, TABLE_ROW2, clock.now());
>         addWriteCommitted(ROW_ID, null, clock.now());
>         addWriteCommitted(rowId2, null, clock.now());
>         RunnableX remove2rowsAction = () -> {
>             storage.runConsistently(() -> {
>                 storage.pollForVacuum(HybridTimestamp.MAX_VALUE);
>                 storage.pollForVacuum(HybridTimestamp.MAX_VALUE);
>                 return null;
>             });
>         };
>         runRace(remove2rowsAction, remove2rowsAction);
>         assertNull(storage.closestRowId(RowId.lowestRowId(PARTITION_ID)));
>     }
> }
> {code}



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

Reply via email to