[ https://issues.apache.org/jira/browse/IGNITE-14425?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Denis Chudov updated IGNITE-14425: ---------------------------------- Reviewer: Vyacheslav Koptilin (was: Slava Koptilin) > 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 > Priority: Major > Time Spent: 10m > Remaining Estimate: 0h > > 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)