Denis Chudov created IGNITE-14425:
-------------------------------------
Summary: Hang transactions in FINISH [COMMIT] phase when
сommunication spi is blocked
Key: IGNITE-14425
URL: https://issues.apache.org/jira/browse/IGNITE-14425
Project: Ignite
Issue Type: Bug
Reporter: Denis Chudov
Assignee: Denis Chudov
scenario:
>From a client for two concurrent transactions on a single key.
At the same time, the GridNearTxFinishRequest message is blocked from the
client, a partial network failure is emulated, as a result, one of the
transactions is not completed even if the node is no longer working
Reproducer:
(insert this test into *TxRollbackOnTimeoutTest*)
{code:java}
/**
*
*/
@Test
public void testRollbackOnNearNodeLeft() throws Exception {
Ignite client = startClient();
Integer pk = primaryKey(grid(0).cache(CACHE_NAME));
CountDownLatch locked = new CountDownLatch(1);
CountDownLatch blocked = new CountDownLatch(1);
IgniteInternalFuture<Void> fut = runAsync(new Callable<Void>() {
@Override public Void call() throws Exception {
try (Transaction tx0 = client.transactions().txStart()) {
client.cache(CACHE_NAME).put(pk, 0);
locked.countDown();
U.awaitQuiet(blocked);
tx0.commit();
}
catch (Exception e) {
// Ignored.
}
return null;
}
});
IgniteInternalFuture fut2 = runAsync(new Runnable() {
@Override public void run() {
try (Transaction tx1 =
client.transactions().txStart(PESSIMISTIC, REPEATABLE_READ, 1000, 0)) {
U.awaitQuiet(locked);
TestRecordingCommunicationSpi.spi(client).blockMessages(new
IgniteBiPredicate<ClusterNode, Message>() {
@Override public boolean apply(ClusterNode clusterNode,
Message msg) {
return msg instanceof GridNearTxFinishRequest;
}
});
TestRecordingCommunicationSpi.spi(grid(0)).blockMessages(new
IgniteBiPredicate<ClusterNode, Message>() {
@Override public boolean apply(ClusterNode clusterNode,
Message msg) {
return msg instanceof GridNearLockResponse;
}
});
client.cache(CACHE_NAME).put(pk, 1);
fail();
}
catch (Exception e) {
assertTrue(X.hasCause(e,
TransactionTimeoutException.class));
}
}
});
TestRecordingCommunicationSpi.spi(client).waitForBlocked();
TestRecordingCommunicationSpi.spi(grid(0)).waitForBlocked();
fut2.get();
client.close();
TestRecordingCommunicationSpi.spi(grid(0)).stopBlock();
blocked.countDown();
fut.get();
assertTrue(grid(0).context().cache().context().tm().activeTransactions().isEmpty());
}
{code}
As the result, transaction hangs on server node in MARKED_ROLLBACK state
forever.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)