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;
     }
 
     /**

Reply via email to