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)