This is an automated email from the ASF dual-hosted git repository.
vpyatkov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new d79db15731 IGNITE-23787 Implicit get for embedded mode starts RW
transaction (#4796)
d79db15731 is described below
commit d79db157319b3c47609d50fecb8c75042b70d3bc
Author: Vladislav Pyatkov <[email protected]>
AuthorDate: Sat Nov 30 01:13:17 2024 +0300
IGNITE-23787 Implicit get for embedded mode starts RW transaction (#4796)
---
.../internal/table/ItReadOnlyTransactionTest.java | 44 +++++++++++++++++++---
.../distributed/storage/InternalTableImpl.java | 2 +-
2 files changed, 40 insertions(+), 6 deletions(-)
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItReadOnlyTransactionTest.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItReadOnlyTransactionTest.java
index 3f31028a53..65d625e559 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItReadOnlyTransactionTest.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/table/ItReadOnlyTransactionTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.table;
import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
import static org.apache.ignite.internal.TestWrappers.unwrapTableViewInternal;
import static
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_STORAGE_PROFILE;
+import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
import static
org.apache.ignite.internal.testframework.IgniteTestUtils.bypassingThreadAssertions;
import static
org.apache.ignite.internal.testframework.IgniteTestUtils.bypassingThreadAssertionsAsync;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -31,6 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
@@ -39,13 +41,14 @@ import
org.apache.ignite.internal.ClusterPerClassIntegrationTest;
import org.apache.ignite.internal.app.IgniteImpl;
import org.apache.ignite.internal.hlc.HybridClock;
import org.apache.ignite.internal.hlc.HybridTimestamp;
-import org.apache.ignite.internal.lang.IgniteStringFormatter;
import org.apache.ignite.internal.schema.BinaryRow;
import org.apache.ignite.internal.schema.SchemaDescriptor;
import org.apache.ignite.internal.schema.row.Row;
import org.apache.ignite.internal.schema.row.RowAssembler;
import org.apache.ignite.internal.testframework.IgniteTestUtils;
+import org.apache.ignite.internal.tx.impl.TxManagerImpl;
import org.apache.ignite.network.ClusterNode;
+import org.apache.ignite.table.Tuple;
import org.apache.ignite.tx.Transaction;
import org.jetbrains.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
@@ -66,9 +69,9 @@ public class ItReadOnlyTransactionTest extends
ClusterPerClassIntegrationTest {
@BeforeEach
public void beforeEach() {
- sql(IgniteStringFormatter.format("CREATE ZONE IF NOT EXISTS {} WITH
REPLICAS={}, PARTITIONS={}, STORAGE_PROFILES='{}';",
+ sql(format("CREATE ZONE IF NOT EXISTS {} WITH REPLICAS={},
PARTITIONS={}, STORAGE_PROFILES='{}';",
ZONE_NAME, initialNodes(), 10, DEFAULT_STORAGE_PROFILE));
- sql(IgniteStringFormatter.format("CREATE TABLE {}(id INT PRIMARY KEY,
val VARCHAR) ZONE {}",
+ sql(format("CREATE TABLE {}(id INT PRIMARY KEY, val VARCHAR) ZONE {}",
TABLE_NAME, ZONE_NAME));
Ignite ignite = CLUSTER.aliveNode();
@@ -86,9 +89,40 @@ public class ItReadOnlyTransactionTest extends
ClusterPerClassIntegrationTest {
@AfterEach
public void afterEach() {
- sql(IgniteStringFormatter.format("DROP TABLE {}", TABLE_NAME));
+ sql(format("DROP TABLE {}", TABLE_NAME));
- sql(IgniteStringFormatter.format("DROP ZONE {}", ZONE_NAME));
+ sql(format("DROP ZONE {}", ZONE_NAME));
+ }
+
+ @Test
+ public void testImplicit() {
+ for (int i = 0; i < initialNodes(); i++) {
+ Ignite ignite = CLUSTER.node(i);
+
+ TxManagerImpl txManager = (TxManagerImpl)
unwrapIgniteImpl(ignite).txManager();
+
+ int txRwStatesBefore = txManager.states().size();
+
+ int txFinishedBefore = txManager.finished();
+
+ ignite.tables().table(TABLE_NAME).keyValueView().get(null,
Tuple.create().set("id", 12));
+ ignite.tables().table(TABLE_NAME).keyValueView().getAll(null,
Set.of(Tuple.create().set("id", 12)));
+
+ int txRwStatesAfter = txManager.states().size();
+
+ int txFinishedAfter = txManager.finished();
+
+ // Some transactions that were detected early might be cleaned up.
So we cannot check the strict equals here,
+ // but we check that the new transaction does not appear.
+ assertFalse(txRwStatesAfter > txRwStatesBefore, "RW transaction
was stated unexpectedly.");
+
+ assertEquals(2, txFinishedAfter - txFinishedBefore, format(
+ "Unexpected finished transaction quantity [i={},
beforeOp={}, afterOp={}]",
+ i,
+ txFinishedBefore,
+ txFinishedAfter
+ ));
+ }
}
@Test
diff --git
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
index 6452594758..62ffe1b5c7 100644
---
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
+++
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
@@ -505,7 +505,7 @@ public class InternalTableImpl implements InternalTable {
}
private InternalTransaction startImplicitRoTxIfNeeded(@Nullable
InternalTransaction tx) {
- return tx == null ? txManager.begin(observableTimestampTracker, true,
false) : tx;
+ return tx == null ? txManager.begin(observableTimestampTracker, true,
true) : tx;
}
/**