This is an automated email from the ASF dual-hosted git repository.

jooger 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 49bedd33429 IGNITE-27897 Fix flaky test 
SqlOutdatedPlanTest.planningIsRepeatedUsingTheSameTransaction (#7621)
49bedd33429 is described below

commit 49bedd33429d5480758fc2f00b9d727bcdf868b2
Author: Pavel Pereslegin <[email protected]>
AuthorDate: Thu Feb 19 15:01:36 2026 +0300

    IGNITE-27897 Fix flaky test 
SqlOutdatedPlanTest.planningIsRepeatedUsingTheSameTransaction (#7621)
---
 .../sql/engine/exec/SqlOutdatedPlanTest.java       | 45 ++++++++++------------
 1 file changed, 20 insertions(+), 25 deletions(-)

diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/SqlOutdatedPlanTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/SqlOutdatedPlanTest.java
index 844e45d5a1b..a4f18e5d128 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/SqlOutdatedPlanTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/SqlOutdatedPlanTest.java
@@ -27,11 +27,9 @@ import static org.hamcrest.Matchers.is;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.ignite.internal.catalog.CatalogCommand;
@@ -112,12 +110,12 @@ public class SqlOutdatedPlanTest extends 
BaseIgniteAbstractTest {
         TestNode gatewayNode = cluster.node(GATEWAY_NODE_NAME);
         PrepareServiceSpy prepareServiceSpy = new 
PrepareServiceSpy(gatewayNode);
 
-        CompletableFuture<Lock> lockFut1 = 
prepareServiceSpy.resetLockAndBlockNextCall();
+        CompletableFuture<Semaphore> semaphoreFut1 = 
prepareServiceSpy.resetAndBlockNextCall();
 
         CompletableFuture<AsyncSqlCursor<InternalSqlRow>> fut =
                 gatewayNode.executeQueryAsync(new SqlProperties(), txContext, 
"SELECT id FROM t1");
 
-        await(lockFut1);
+        await(semaphoreFut1);
         assertThat(prepareServiceSpy.callsCounter.get(), is(1));
         assertThat(txContext.startedTxCounter.get(), is(0));
 
@@ -125,8 +123,8 @@ public class SqlOutdatedPlanTest extends 
BaseIgniteAbstractTest {
         await(cluster.catalogManager().execute(
                 makeAddColumnCommand("VAL1")));
 
-        CompletableFuture<Lock> lockFut2 = 
prepareServiceSpy.resetLockAndBlockNextCall();
-        Lock lock2 = await(lockFut2);
+        CompletableFuture<Semaphore> semaphoreFut2 = 
prepareServiceSpy.resetAndBlockNextCall();
+        Semaphore semaphore2 = await(semaphoreFut2);
         assertThat(prepareServiceSpy.callsCounter.get(), is(2));
         assertThat(txContext.startedTxCounter.get(), is(1));
 
@@ -134,7 +132,7 @@ public class SqlOutdatedPlanTest extends 
BaseIgniteAbstractTest {
         await(cluster.catalogManager().execute(
                 makeAddColumnCommand("VAL2")));
 
-        lock2.unlock();
+        semaphore2.release();
 
         await(await(fut).closeAsync());
 
@@ -151,12 +149,12 @@ public class SqlOutdatedPlanTest extends 
BaseIgniteAbstractTest {
         TestNode gatewayNode = cluster.node(GATEWAY_NODE_NAME);
         PrepareServiceSpy prepareServiceSpy = new 
PrepareServiceSpy(gatewayNode);
 
-        CompletableFuture<Lock> lockFut = 
prepareServiceSpy.resetLockAndBlockNextCall();
+        CompletableFuture<Semaphore> semaphoreFut = 
prepareServiceSpy.resetAndBlockNextCall();
 
         CompletableFuture<AsyncSqlCursor<InternalSqlRow>> fut =
                 gatewayNode.executeQueryAsync(new SqlProperties(), txContext, 
"SELECT id FROM t1");
 
-        Lock lock = await(lockFut);
+        Semaphore semaphore = await(semaphoreFut);
         assertThat(prepareServiceSpy.callsCounter.get(), is(1));
         assertThat(txContext.startedTxCounter.get(), is(0));
 
@@ -167,7 +165,7 @@ public class SqlOutdatedPlanTest extends 
BaseIgniteAbstractTest {
         // And node disconnection.
         cluster.node(DATA_NODES.get(0)).disconnect();
 
-        lock.unlock();
+        semaphore.release();
 
         await(await(fut).closeAsync());
 
@@ -188,41 +186,38 @@ public class SqlOutdatedPlanTest extends 
BaseIgniteAbstractTest {
 
     private static class PrepareServiceSpy {
         private final AtomicInteger callsCounter = new AtomicInteger();
-        private final AtomicReference<ReentrantLock> prepareBlockHolder = new 
AtomicReference<>();
+        private final AtomicReference<Semaphore> prepareBlockHolder = new 
AtomicReference<>();
 
         PrepareServiceSpy(TestNode gatewayNode) {
             ((PrepareServiceWithPrepareCallback) gatewayNode.prepareService())
                     .setPrepareCallback(() -> {
                         callsCounter.incrementAndGet();
 
-                        Lock lock = prepareBlockHolder.get();
+                        Semaphore semaphore = prepareBlockHolder.get();
 
                         try {
-                            lock.tryLock(10, TimeUnit.SECONDS);
+                            semaphore.acquire();
                         } catch (InterruptedException e) {
                             throw new RuntimeException(e);
                         } finally {
-                            lock.unlock();
+                            semaphore.release();
                         }
                     });
         }
 
-        CompletableFuture<Lock> resetLockAndBlockNextCall() {
-            ReentrantLock nextLock = new ReentrantLock();
+        CompletableFuture<Semaphore> resetAndBlockNextCall() {
+            Semaphore nextSemaphore = new Semaphore(0);
 
-            //noinspection LockAcquiredButNotSafelyReleased
-            nextLock.lock();
+            Semaphore prevSemaphore = 
prepareBlockHolder.getAndSet(nextSemaphore);
 
-            ReentrantLock prevLock = prepareBlockHolder.getAndSet(nextLock);
-
-            if (prevLock != null) {
-                prevLock.unlock();
+            if (prevSemaphore != null) {
+                prevSemaphore.release();
             }
 
             return CompletableFuture.supplyAsync(() -> {
-                Awaitility.await().until(nextLock::getQueueLength, is(1));
+                Awaitility.await().until(nextSemaphore::hasQueuedThreads);
 
-                return nextLock;
+                return nextSemaphore;
             });
         }
     }

Reply via email to