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;
});
}
}