[ https://issues.apache.org/jira/browse/IGNITE-17968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexander Lapin updated IGNITE-17968: ------------------------------------- Description: Following test will work {code:java} @Test public void testReadOnlyGetWriteIntentResolutionUpdate() { accounts.recordView().upsert(null, makeValue(1, 100.)); // Pending tx Transaction tx = igniteTransactions.begin(); accounts.recordView().upsert(tx, makeValue(1, 300.)); // Update Transaction readOnlyTx = igniteTransactions.readOnly().begin(); assertEquals(100., accounts.recordView().get(readOnlyTx, makeKey(1)).doubleValue("balance")); }{code} And following won't {code:java} @Test public void testReadOnlyGetWriteIntentResolutionRemoveTmp() { accounts.recordView().upsert(null, makeValue(1, 100.)); // Pending tx Transaction tx = igniteTransactions.begin(); accounts.recordView().delete(tx, makeKey(1)); // Remove. Transaction readOnlyTx = igniteTransactions.readOnly().begin(); assertEquals(100., accounts.recordView().get(readOnlyTx, makeKey(1)).doubleValue("balance")); } {code} Internally mvDataStorage.scan(readTimestamp) in PartitionReplicaListener#processReadOnlyMultiEntryAction will skip such pending removed entries. Please pay attention that writeIntetns that contain data (update pending modification instead of remove one) works propertly. See ItTxDistributedTestSingleNode#testReadOnlyGetWriteIntentResolutionUpdate and ItTxDistributedTestSingleNode#testReadOnlyPendingWriteIntentSkippedTmp for more details. *Reproducers:* ItTxDistributedTestSingleNode#testReadOnlyGetWriteIntentResolutionRemoveTmp ItTxDistributedTestSingleNode#testReadOnlyPendingWriteIntentSkippedCombinedTmp was: Following test will work {code:java} @Test public void testReadOnlyPendingWriteIntentSkipped() { accounts.recordView().upsert(null, makeValue(1, 100.)); accounts.recordView().upsert(null, makeValue(2, 200.)); // Pending tx Transaction tx = igniteTransactions.begin(); // accounts.recordView().delete(tx, makeKey(1)); accounts.recordView().upsert(tx, makeValue(2, 300.)); Transaction readOnlyTx = igniteTransactions.readOnly().begin(); Collection<Tuple> retrievedKeys = accounts.recordView().getAll(readOnlyTx, List.of(makeKey(1), makeKey(2))); validateBalance(retrievedKeys, 100., 200.); } {code} And following won't @Test public void testReadOnlyPendingWriteIntentSkipped() \{ accounts.recordView().upsert(null, makeValue(1, 100.)); accounts.recordView().upsert(null, makeValue(2, 200.)); // Pending tx Transaction tx = igniteTransactions.begin(); accounts.recordView().delete(tx, makeKey(1)); accounts.recordView().upsert(tx, makeValue(2, 300.)); Transaction readOnlyTx = igniteTransactions.readOnly().begin(); Collection<Tuple> retrievedKeys = accounts.recordView().getAll(readOnlyTx, List.of(makeKey(1), makeKey(2))); validateBalance(retrievedKeys, 100., 200.); } Internally mvDataStorage.scan(readTimestamp) in PartitionReplicaListener#processReadOnlyMultiEntryAction will skip such pending removed entries. It also worth to mention that writeIntetns that contain data (update pending modification instead of remove one) works propertly. See ItTxDistributedTestSingleNode#testReadOnlyGetWriteIntentResolutionUpdate and ItTxDistributedTestSingleNode#testReadOnlyPendingWriteIntentSkippedTmp for more details. *Reproducers:* ItTxDistributedTestSingleNode#testReadOnlyGetWriteIntentResolutionRemoveTmp ItTxDistributedTestSingleNode#testReadOnlyPendingWriteIntentSkippedCombinedTmp > Seems that mvDataStorage.scan doesn't return pending removed value as > writeIntent > --------------------------------------------------------------------------------- > > Key: IGNITE-17968 > URL: https://issues.apache.org/jira/browse/IGNITE-17968 > Project: Ignite > Issue Type: Bug > Reporter: Alexander Lapin > Priority: Major > Labels: transaction3_ro > > Following test will work > {code:java} > @Test > public void testReadOnlyGetWriteIntentResolutionUpdate() { > accounts.recordView().upsert(null, makeValue(1, 100.)); > // Pending tx > Transaction tx = igniteTransactions.begin(); > accounts.recordView().upsert(tx, makeValue(1, 300.)); > // Update > Transaction readOnlyTx = igniteTransactions.readOnly().begin(); > assertEquals(100., accounts.recordView().get(readOnlyTx, > makeKey(1)).doubleValue("balance")); > }{code} > And following won't > {code:java} > @Test > public void testReadOnlyGetWriteIntentResolutionRemoveTmp() { > accounts.recordView().upsert(null, makeValue(1, 100.)); > // Pending tx > Transaction tx = igniteTransactions.begin(); > accounts.recordView().delete(tx, makeKey(1)); > // Remove. > Transaction readOnlyTx = igniteTransactions.readOnly().begin(); > assertEquals(100., accounts.recordView().get(readOnlyTx, > makeKey(1)).doubleValue("balance")); > } {code} > Internally mvDataStorage.scan(readTimestamp) in > PartitionReplicaListener#processReadOnlyMultiEntryAction will skip such > pending removed entries. > Please pay attention that writeIntetns that contain data (update pending > modification instead of remove one) works propertly. See > ItTxDistributedTestSingleNode#testReadOnlyGetWriteIntentResolutionUpdate and > ItTxDistributedTestSingleNode#testReadOnlyPendingWriteIntentSkippedTmp for > more details. > *Reproducers:* > ItTxDistributedTestSingleNode#testReadOnlyGetWriteIntentResolutionRemoveTmp > ItTxDistributedTestSingleNode#testReadOnlyPendingWriteIntentSkippedCombinedTmp -- This message was sent by Atlassian Jira (v8.20.10#820010)