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

rpuch 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 ee1d3405022 IGNITE-25219 Fix calls to FailureProcessor in unit tests 
(#5677)
ee1d3405022 is described below

commit ee1d3405022a22c5da765983a20e685bfeea2a16
Author: Roman Puchkovskiy <[email protected]>
AuthorDate: Wed Apr 23 16:58:49 2025 +0400

    IGNITE-25219 Fix calls to FailureProcessor in unit tests (#5677)
    
    Also, FailureManagerExtension is made compatible with LogInspector
---
 .../compaction/AbstractCatalogCompactionTest.java  | 14 +++++-
 .../CatalogCompactionRunnerSelfTest.java           |  2 +-
 .../ignite/internal/catalog/CatalogTestUtils.java  |  3 +-
 .../management/topology/LogicalTopologyImpl.java   |  6 ++-
 .../topology/LogicalTopologyImplTest.java          |  9 ++++
 .../failure/FailureManagerExtension.java           | 50 +++++++++++++--------
 .../failure/MuteFailureManagerLogging.java         |  4 +-
 .../distributionzones/DataNodesManagerTest.java    |  9 ++++
 .../failure/FailureProcessorLoggingTest.java       |  8 +++-
 .../internal/failure/FailureProcessorTest.java     |  4 ++
 .../internal/index/ChangeIndexStatusTask.java      | 51 +++++++++++++++++-----
 .../internal/index/ChangeIndexStatusTaskTest.java  |  4 ++
 .../server/BasicOperationsKeyValueStorageTest.java |  5 ++-
 .../placementdriver/LeaseNegotiationTest.java      |  3 ++
 .../raft/StateMachineFailureHandlerTest.java       |  5 +++
 .../replicator/PlacementDriverReplicaSideTest.java |  5 +++
 .../sql/engine/exec/ExecutionServiceImplTest.java  |  6 +++
 .../DdlCommandHandlerExceptionHandlingTest.java    | 12 ++++-
 18 files changed, 162 insertions(+), 38 deletions(-)

diff --git 
a/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/AbstractCatalogCompactionTest.java
 
b/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/AbstractCatalogCompactionTest.java
index e2ccd31380f..0133ffc39fc 100644
--- 
a/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/AbstractCatalogCompactionTest.java
+++ 
b/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/AbstractCatalogCompactionTest.java
@@ -24,6 +24,7 @@ import static 
org.apache.ignite.internal.util.IgniteUtils.startAsync;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.Mockito.spy;
 
+import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 import org.apache.ignite.internal.catalog.CatalogManagerImpl;
 import org.apache.ignite.internal.catalog.storage.UpdateLogImpl;
@@ -35,10 +36,13 @@ import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.hlc.HybridClockImpl;
 import org.apache.ignite.internal.hlc.TestClockService;
 import org.apache.ignite.internal.manager.ComponentContext;
+import org.apache.ignite.internal.manager.IgniteComponent;
 import 
org.apache.ignite.internal.metastorage.impl.StandaloneMetaStorageManager;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.ExecutorServiceExtension;
 import org.apache.ignite.internal.testframework.InjectExecutorService;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 
@@ -50,6 +54,8 @@ abstract class AbstractCatalogCompactionTest extends 
BaseIgniteAbstractTest {
 
     final HybridClock clock = new HybridClockImpl();
 
+    private StandaloneMetaStorageManager metastore;
+
     private ClockWaiter clockWaiter;
 
     ClockService clockService;
@@ -65,9 +71,15 @@ abstract class AbstractCatalogCompactionTest extends 
BaseIgniteAbstractTest {
         catalogManager = spy(createCatalogManager("test-node"));
     }
 
+    @AfterEach
+    void cleanup() {
+        List.of(catalogManager, clockWaiter, 
metastore).forEach(IgniteComponent::beforeNodeStop);
+        assertThat(IgniteUtils.stopAsync(new ComponentContext(), 
catalogManager, clockWaiter, metastore), willCompleteSuccessfully());
+    }
+
     /** Creates catalog manager. */
     private CatalogManagerImpl createCatalogManager(String nodeName) {
-        StandaloneMetaStorageManager metastore = 
StandaloneMetaStorageManager.create(nodeName);
+        metastore = StandaloneMetaStorageManager.create(nodeName);
         FailureProcessor failureProcessor = new NoOpFailureManager();
         CatalogManagerImpl manager = new CatalogManagerImpl(
                 new UpdateLogImpl(metastore, failureProcessor),
diff --git 
a/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunnerSelfTest.java
 
b/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunnerSelfTest.java
index 4bde7ce70d9..689700bd22a 100644
--- 
a/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunnerSelfTest.java
+++ 
b/modules/catalog-compaction/src/test/java/org/apache/ignite/internal/catalog/compaction/CatalogCompactionRunnerSelfTest.java
@@ -1225,7 +1225,7 @@ public class CatalogCompactionRunnerSelfTest extends 
AbstractCatalogCompactionTe
                 rebalanceMinimumRequiredTimeProvider
         );
 
-        await(runner.startAsync(mock(ComponentContext.class)));
+        await(runner.startAsync(new ComponentContext()));
 
         runner.updateCoordinator(coordinator);
 
diff --git 
a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
 
b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
index aed37043c50..92323878e9e 100644
--- 
a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
+++ 
b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
@@ -29,6 +29,7 @@ import static 
org.apache.ignite.internal.util.CompletableFutures.trueCompletedFu
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
 
 import java.util.List;
 import java.util.Set;
@@ -152,7 +153,7 @@ public class CatalogTestUtils {
     public static CatalogManager createTestCatalogManager(String nodeName, 
ClockWaiter clockWaiter, HybridClock clock) {
         StandaloneMetaStorageManager metastore = 
StandaloneMetaStorageManager.create(nodeName);
 
-        var failureProcessor = new NoOpFailureManager();
+        FailureProcessor failureProcessor = mock(FailureProcessor.class);
         return new CatalogManagerImpl(
                 new UpdateLogImpl(metastore, failureProcessor),
                 new TestClockService(clock, clockWaiter),
diff --git 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImpl.java
 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImpl.java
index 04d4afddfd6..855a695fb7b 100644
--- 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImpl.java
+++ 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImpl.java
@@ -22,6 +22,7 @@ import static java.util.Comparator.comparing;
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
+import static org.apache.ignite.internal.util.ExceptionUtils.hasCause;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,6 +40,7 @@ import 
org.apache.ignite.internal.cluster.management.topology.api.LogicalTopolog
 import 
org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologySnapshotSerializer;
 import org.apache.ignite.internal.failure.FailureContext;
 import org.apache.ignite.internal.failure.FailureProcessor;
+import org.apache.ignite.internal.lang.NodeStoppingException;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.versioned.VersionedSerialization;
@@ -229,7 +231,9 @@ public class LogicalTopologyImpl implements LogicalTopology 
{
     }
 
     private void notifyFailureHandlerAndRethrowIfError(Throwable e, String 
logMessage) {
-        failureProcessor.process(new FailureContext(e, logMessage));
+        if (!hasCause(e, NodeStoppingException.class)) {
+            failureProcessor.process(new FailureContext(e, logMessage));
+        }
 
         if (e instanceof Error) {
             throw (Error) e;
diff --git 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImplTest.java
 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImplTest.java
index 640041595a3..497c7268f4f 100644
--- 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImplTest.java
+++ 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/topology/LogicalTopologyImplTest.java
@@ -59,6 +59,8 @@ import org.apache.ignite.internal.manager.ComponentContext;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.apache.ignite.network.ClusterNode;
 import org.apache.ignite.network.NetworkAddress;
 import org.junit.jupiter.api.AfterEach;
@@ -73,6 +75,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 
 @ExtendWith(WorkDirectoryExtension.class)
 @ExtendWith(MockitoExtension.class)
+@ExtendWith(FailureManagerExtension.class)
 class LogicalTopologyImplTest extends BaseIgniteAbstractTest {
     private final ClusterStateStorage storage = 
spy(TestClusterStateStorage.initializedClusterStateStorage());
 
@@ -361,6 +364,7 @@ class LogicalTopologyImplTest extends 
BaseIgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void onAppearedListenersExceptionsDoNotBreakNotification() {
         LogicalTopologyEventListener secondListener = 
mock(LogicalTopologyEventListener.class);
 
@@ -375,6 +379,7 @@ class LogicalTopologyImplTest extends 
BaseIgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void onAppearedListenerErrorIsRethrown() {
         doThrow(new TestError()).when(listener).onNodeJoined(any(), any());
 
@@ -385,6 +390,7 @@ class LogicalTopologyImplTest extends 
BaseIgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void onDisappearedListenersExceptionsDoNotBreakNotification() {
         LogicalTopologyEventListener secondListener = 
mock(LogicalTopologyEventListener.class);
 
@@ -402,6 +408,7 @@ class LogicalTopologyImplTest extends 
BaseIgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void onDisappearedListenerErrorIsRethrown() {
         doThrow(new TestError()).when(listener).onNodeLeft(any(), any());
 
@@ -413,6 +420,7 @@ class LogicalTopologyImplTest extends 
BaseIgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void onTopologyLeapListenersExceptionsDoNotBreakNotification() {
         LogicalTopologyEventListener secondListener = 
mock(LogicalTopologyEventListener.class);
 
@@ -427,6 +435,7 @@ class LogicalTopologyImplTest extends 
BaseIgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void onTopologyLeapListenerErrorIsRethrown() {
         doThrow(new TestError()).when(listener).onTopologyLeap(any());
 
diff --git 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/FailureManagerExtension.java
 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/FailureManagerExtension.java
index 894d8024fc2..1aff7c66904 100644
--- 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/FailureManagerExtension.java
+++ 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/FailureManagerExtension.java
@@ -22,8 +22,9 @@ import static 
org.junit.jupiter.api.extension.ExtensionContext.Namespace;
 import org.apache.ignite.internal.testframework.log4j2.Log4jUtils;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.logging.log4j.core.Logger;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
@@ -58,46 +59,61 @@ public class FailureManagerExtension implements
         }
 
         if (annotated) {
-            rememberOldLevelAndMuteLogger(context);
+            muteLoggerAndMemorizeMute(context);
         }
     }
 
-    private static void rememberOldLevelAndMuteLogger(ExtensionContext 
context) {
+    private static void muteLoggerAndMemorizeMute(ExtensionContext context) {
         Log4jUtils.waitTillConfigured();
 
-        Logger logger = failureManagerLogger();
+        muteLogger();
 
-        context.getStore(NAMESPACE).put(context.getUniqueId(), 
logger.getLevel());
+        context.getStore(NAMESPACE).put(context.getUniqueId(), Boolean.TRUE);
+    }
+
+    private static void muteLogger() {
+        LoggerContext rootLoggerContext = getRootLoggerContext();
+
+        // We add a non-additive logger to make sure that logging 
configuration inherited from root logger is not used here.
+        LoggerConfig loggerConfig = new 
LoggerConfig(FAILURE_MANAGER_CLASS_NAME, Level.INFO, false);
+        
rootLoggerContext.getConfiguration().addLogger(FAILURE_MANAGER_CLASS_NAME, 
loggerConfig);
 
-        Configurator.setLevel(logger, Level.OFF);
+        rootLoggerContext.updateLoggers();
     }
 
-    private static Logger failureManagerLogger() {
-        return LogManager.getLogger(FAILURE_MANAGER_CLASS_NAME);
+    private static LoggerContext getRootLoggerContext() {
+        Logger rootLogger = (Logger) LogManager.getRootLogger();
+        return rootLogger.getContext();
     }
 
     @Override
     public void afterAll(ExtensionContext context) {
-        restoreOldLevelIfSaved(context);
+        unmuteIfMuted(context);
     }
 
-    private static void restoreOldLevelIfSaved(ExtensionContext context) {
-        Level oldLevel = 
context.getStore(NAMESPACE).remove(context.getUniqueId(), Level.class);
-        if (oldLevel != null) {
-            Logger logger = failureManagerLogger();
-            Configurator.setLevel(logger, oldLevel);
+    private static void unmuteIfMuted(ExtensionContext context) {
+        Boolean wasMutedMarker = 
context.getStore(NAMESPACE).remove(context.getUniqueId(), Boolean.class);
+
+        if (wasMutedMarker != null && wasMutedMarker) {
+            unmute();
         }
     }
 
+    private static void unmute() {
+        LoggerContext rootLoggerContext = getRootLoggerContext();
+        
rootLoggerContext.getConfiguration().removeLogger(FAILURE_MANAGER_CLASS_NAME);
+        rootLoggerContext.updateLoggers();
+    }
+
     @Override
     public void beforeEach(ExtensionContext context) {
         if 
(context.getRequiredTestMethod().isAnnotationPresent(MuteFailureManagerLogging.class))
 {
-            rememberOldLevelAndMuteLogger(context);
+            muteLoggerAndMemorizeMute(context);
         }
     }
 
     @Override
     public void afterEach(ExtensionContext context) {
-        restoreOldLevelIfSaved(context);
+        unmuteIfMuted(context);
     }
 }
diff --git 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/MuteFailureManagerLogging.java
 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/MuteFailureManagerLogging.java
index 82471030def..d817486b31d 100644
--- 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/MuteFailureManagerLogging.java
+++ 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/failure/MuteFailureManagerLogging.java
@@ -22,10 +22,12 @@ import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import org.apache.ignite.internal.testframework.log4j2.LogInspector;
 
 /**
  * Marks a test class or method for FailureManager logging mute. That is, 
FailureManager will not write anything to logs
- * if the annotation is present.
+ * and stdout if the annotation is present. Appenders added by more specific 
configuration (like those of {@link LogInspector})
+ * are not affected.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE, ElementType.METHOD})
diff --git 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DataNodesManagerTest.java
 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DataNodesManagerTest.java
index eeb8634c551..64224e4ed30 100644
--- 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DataNodesManagerTest.java
+++ 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DataNodesManagerTest.java
@@ -61,6 +61,7 @@ import org.apache.ignite.internal.hlc.HybridClockImpl;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.hlc.TestClockService;
 import org.apache.ignite.internal.manager.ComponentContext;
+import org.apache.ignite.internal.manager.IgniteComponent;
 import org.apache.ignite.internal.metastorage.Entry;
 import org.apache.ignite.internal.metastorage.MetaStorageManager;
 import 
org.apache.ignite.internal.metastorage.impl.StandaloneMetaStorageManager;
@@ -70,7 +71,9 @@ import 
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStora
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.jetbrains.annotations.Nullable;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -158,6 +161,12 @@ public class DataNodesManagerTest extends 
BaseIgniteAbstractTest {
         dataNodesManager.onZoneCreate(0, clock.now(), currentTopology);
     }
 
+    @AfterEach
+    void cleanup() {
+        List.of(catalogManager, 
metaStorageManager).forEach(IgniteComponent::beforeNodeStop);
+        assertThat(IgniteUtils.stopAsync(new ComponentContext(), 
catalogManager, metaStorageManager), willCompleteSuccessfully());
+    }
+
     private void createZone(String name, ConsistencyMode consistencyMode) {
         DistributionZonesTestUtil.createZone(catalogManager, name, 
consistencyMode);
 
diff --git 
a/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorLoggingTest.java
 
b/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorLoggingTest.java
index d25de19ef2a..4762399c605 100644
--- 
a/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorLoggingTest.java
+++ 
b/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorLoggingTest.java
@@ -29,6 +29,8 @@ import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExten
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import 
org.apache.ignite.internal.failure.configuration.FailureProcessorConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.apache.ignite.internal.testframework.log4j2.LogInspector;
 import org.apache.logging.log4j.Level;
 import org.junit.jupiter.api.Test;
@@ -38,6 +40,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
  * Tests for {@link FailureProcessor} logging.
  */
 @ExtendWith(ConfigurationExtension.class)
+@ExtendWith(FailureManagerExtension.class)
 public class FailureProcessorLoggingTest extends BaseIgniteAbstractTest {
     @InjectConfiguration("mock: { "
             + "oomBufferSizeBytes=0, "
@@ -49,7 +52,7 @@ public class FailureProcessorLoggingTest extends 
BaseIgniteAbstractTest {
      * Tests log message for ignored failure types.
      */
     @Test
-    public void testFailureProcessorLoggedIgnoredFailureTest() throws 
Exception {
+    public void testFailureProcessorLoggedIgnoredFailureTest() {
         AtomicInteger dumpMessageCounter = new AtomicInteger();
         AtomicInteger ignoredMessageCounter = new AtomicInteger();
 
@@ -84,7 +87,8 @@ public class FailureProcessorLoggingTest extends 
BaseIgniteAbstractTest {
      * Tests log message for not ignored failure types.
      */
     @Test
-    public void testFailureProcessorLoggedFailureTest() throws Exception {
+    @MuteFailureManagerLogging // Failure is expected.
+    public void testFailureProcessorLoggedFailureTest() {
         AtomicInteger dumpMessageCounter = new AtomicInteger();
         AtomicInteger errorMessageCounter = new AtomicInteger();
 
diff --git 
a/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorTest.java
 
b/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorTest.java
index 6cbfe31241a..2a49ee33794 100644
--- 
a/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorTest.java
+++ 
b/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorTest.java
@@ -37,6 +37,8 @@ import 
org.apache.ignite.internal.failure.handlers.FailureHandler;
 import org.apache.ignite.internal.failure.handlers.NoOpFailureHandler;
 import org.apache.ignite.internal.manager.ComponentContext;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
@@ -44,11 +46,13 @@ import org.junit.jupiter.api.extension.ExtendWith;
  * Tests for {@link FailureManager}.
  */
 @ExtendWith(ConfigurationExtension.class)
+@ExtendWith(FailureManagerExtension.class)
 class FailureProcessorTest extends BaseIgniteAbstractTest {
     @InjectConfiguration(value = "mock: { oomBufferSizeBytes=0, handler 
{type=noop} }")
     protected static FailureProcessorConfiguration 
failureProcessorConfiguration;
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     public void testFailureProcessing() {
         FailureHandler handler = mock(FailureHandler.class);
 
diff --git 
a/modules/index/src/main/java/org/apache/ignite/internal/index/ChangeIndexStatusTask.java
 
b/modules/index/src/main/java/org/apache/ignite/internal/index/ChangeIndexStatusTask.java
index 5725a5842f1..0300cada32f 100644
--- 
a/modules/index/src/main/java/org/apache/ignite/internal/index/ChangeIndexStatusTask.java
+++ 
b/modules/index/src/main/java/org/apache/ignite/internal/index/ChangeIndexStatusTask.java
@@ -30,6 +30,7 @@ import static 
org.apache.ignite.internal.index.IndexManagementUtils.isPrimaryRep
 import static org.apache.ignite.internal.index.IndexManagementUtils.localNode;
 import static 
org.apache.ignite.internal.lang.IgniteSystemProperties.enabledColocation;
 import static 
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.internal.util.ExceptionUtils.hasCause;
 import static org.apache.ignite.internal.util.ExceptionUtils.unwrapCause;
 
 import java.util.Set;
@@ -43,6 +44,7 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 import org.apache.ignite.internal.catalog.CatalogCommand;
 import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.ChangeIndexStatusValidationException;
 import org.apache.ignite.internal.catalog.IndexNotFoundValidationException;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexStatus;
@@ -64,6 +66,7 @@ import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.network.ClusterService;
 import org.apache.ignite.internal.network.RecipientLeftException;
 import org.apache.ignite.internal.placementdriver.PlacementDriver;
+import org.apache.ignite.internal.placementdriver.PrimaryReplicaAwaitException;
 import 
org.apache.ignite.internal.placementdriver.PrimaryReplicaAwaitTimeoutException;
 import org.apache.ignite.internal.placementdriver.ReplicaMeta;
 import org.apache.ignite.internal.replicator.ReplicationGroupId;
@@ -181,18 +184,7 @@ abstract class ChangeIndexStatusTask {
                     .thenComposeAsync(unused -> inBusyLocks(() -> 
catalogManager.execute(switchIndexStatusCommand())), executor)
                     .whenComplete((unused, throwable) -> {
                         if (throwable != null) {
-                            Throwable cause = unwrapCause(throwable);
-
-                            if (!(cause instanceof IndexTaskStoppingException)
-                                    && !(cause instanceof 
NodeStoppingException)
-                                    // The index's table might have been 
dropped while we were waiting for the ability
-                                    // to switch the index status to a new 
state, so IndexNotFound is not a problem.
-                                    && !(cause instanceof 
IndexNotFoundValidationException)) {
-                                failureProcessor.process(new FailureContext(
-                                        throwable,
-                                        String.format("Error starting index 
task: %s", indexDescriptor.id())
-                                ));
-                            }
+                            handleStatusSwitchException(throwable);
                         }
                     })
                     .thenApply(unused -> null);
@@ -201,6 +193,41 @@ abstract class ChangeIndexStatusTask {
         }
     }
 
+    private void handleStatusSwitchException(Throwable throwable) {
+        if (hasCause(
+                throwable,
+                IndexTaskStoppingException.class,
+                NodeStoppingException.class,
+                // The index's table might have been dropped while we were 
waiting for the ability
+                // to switch the index status to a new state, so IndexNotFound 
is not a problem.
+                IndexNotFoundValidationException.class,
+                // Someone could have already switched the index status, not a 
problem.
+                ChangeIndexStatusValidationException.class,
+                // No primary replica is not a reason to fail the node.
+                PrimaryReplicaAwaitException.class
+        )) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug(
+                        "Stop index operation due to an expected exception; 
index operation is either requested to be stopped "
+                                + "or it will be picked up later",
+                        throwable
+                );
+            } else {
+                LOG.info(
+                        "Stop index operation due to an expected exception; 
index operation is either requested to be stopped "
+                                + "or it will be picked up later 
[exceptionClass={}, message={}]",
+                        throwable.getClass().getName(),
+                        throwable.getMessage()
+                );
+            }
+        } else {
+            failureProcessor.process(new FailureContext(
+                    throwable,
+                    String.format("Error starting index task: %s", 
indexDescriptor.id())
+            ));
+        }
+    }
+
     /**
      * Returns a CatalogCommand that will be submitted to the Catalog after 
all RW transactions that had observed the catalog version in
      * which the{@link CatalogIndexDescriptor#status()} of {@link 
#targetIndex() index} appeared and have finished their execution.
diff --git 
a/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
 
b/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
index aabef39235b..67632500c25 100644
--- 
a/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
+++ 
b/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
@@ -96,6 +96,8 @@ import 
org.apache.ignite.internal.table.distributed.index.IndexMetaStorage;
 import org.apache.ignite.internal.testframework.ExecutorServiceExtension;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.testframework.InjectExecutorService;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 import org.apache.ignite.network.ClusterNode;
 import org.junit.jupiter.api.AfterEach;
@@ -108,6 +110,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 /** For {@link ChangeIndexStatusTask} testing. */
 @ExtendWith(ExecutorServiceExtension.class)
 @ExtendWith(MockitoExtension.class)
+@ExtendWith(FailureManagerExtension.class)
 public class ChangeIndexStatusTaskTest extends IgniteAbstractTest {
     private static final IndexMessagesFactory FACTORY = new 
IndexMessagesFactory();
 
@@ -336,6 +339,7 @@ public class ChangeIndexStatusTaskTest extends 
IgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void testFailedSendIsNodeFinishedRwTransactionsStartedBeforeRequest() {
         when(clusterService.messagingService().invoke(any(ClusterNode.class), 
any(), anyLong()))
                 .thenReturn(failedFuture(new Exception("test")));
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
index 0248f6d560d..b7f9e685f7e 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
@@ -79,6 +79,8 @@ import 
org.apache.ignite.internal.metastorage.impl.CommandIdGenerator;
 import org.apache.ignite.internal.metastorage.server.ValueCondition.Type;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.apache.ignite.internal.util.ByteUtils;
 import org.apache.ignite.internal.util.Cursor;
 import org.jetbrains.annotations.Nullable;
@@ -90,7 +92,7 @@ import org.junit.jupiter.params.provider.EnumSource;
 /**
  * Tests for key-value storage implementations.
  */
-@ExtendWith(WorkDirectoryExtension.class)
+@ExtendWith({WorkDirectoryExtension.class, FailureManagerExtension.class})
 public abstract class BasicOperationsKeyValueStorageTest extends 
AbstractKeyValueStorageTest {
     @WorkDirectory
     Path workDir;
@@ -1878,6 +1880,7 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
      * Tests that, if a watch throws an exception, its {@code onError} method 
is invoked.
      */
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     void testWatchErrorHandling() {
         byte[] value = "value".getBytes(UTF_8);
 
diff --git 
a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseNegotiationTest.java
 
b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseNegotiationTest.java
index 0ea633a3d44..79934746ae3 100644
--- 
a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseNegotiationTest.java
+++ 
b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseNegotiationTest.java
@@ -154,6 +154,9 @@ public class LeaseNegotiationTest extends 
BaseIgniteAbstractTest {
     public void tearDown() {
         leaseUpdater.deactivate();
         assignmentsTracker.stopTrack();
+
+        metaStorageManager.beforeNodeStop();
+        assertThat(metaStorageManager.stopAsync(), willCompleteSuccessfully());
     }
 
     private LeaseUpdater createLeaseUpdater() {
diff --git 
a/modules/raft/src/test/java/org/apache/ignite/internal/raft/StateMachineFailureHandlerTest.java
 
b/modules/raft/src/test/java/org/apache/ignite/internal/raft/StateMachineFailureHandlerTest.java
index 965c03fb703..e8afdbf0a52 100644
--- 
a/modules/raft/src/test/java/org/apache/ignite/internal/raft/StateMachineFailureHandlerTest.java
+++ 
b/modules/raft/src/test/java/org/apache/ignite/internal/raft/StateMachineFailureHandlerTest.java
@@ -36,14 +36,19 @@ import 
org.apache.ignite.internal.raft.server.impl.JraftServerImpl.DelegatingSta
 import org.apache.ignite.internal.raft.service.CommandClosure;
 import org.apache.ignite.internal.raft.service.RaftGroupListener;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.apache.ignite.raft.jraft.Closure;
 import org.apache.ignite.raft.jraft.storage.snapshot.SnapshotReader;
 import org.apache.ignite.raft.jraft.storage.snapshot.SnapshotWriter;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * Test that checks that {@link FailureManager} handles exceptions from {@link 
RaftGroupListener} correctly.
  */
+@ExtendWith(FailureManagerExtension.class)
+@MuteFailureManagerLogging // Failures are expected.
 public class StateMachineFailureHandlerTest extends BaseIgniteAbstractTest {
     private static final RuntimeException EXPECTED_ERROR = new 
RuntimeException();
 
diff --git 
a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java
 
b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java
index 5742dd8f3bd..fcc15a9081e 100644
--- 
a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java
+++ 
b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java
@@ -53,6 +53,8 @@ import org.apache.ignite.internal.raft.Peer;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupService;
 import org.apache.ignite.internal.replicator.listener.ReplicaListener;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.PendingComparableValuesTracker;
@@ -61,10 +63,12 @@ import org.apache.ignite.network.NetworkAddress;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * Test for placement driver messages processing on replica side.
  */
+@ExtendWith(FailureManagerExtension.class)
 public class PlacementDriverReplicaSideTest extends BaseIgniteAbstractTest {
     private static final ReplicationGroupId GRP_ID = new 
TestReplicationGroupId("group_1");
 
@@ -375,6 +379,7 @@ public class PlacementDriverReplicaSideTest extends 
BaseIgniteAbstractTest {
     }
 
     @Test
+    @MuteFailureManagerLogging // Failure is expected.
     public void testReservationFailed() {
         reservationSuccess = false;
 
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
index 38cb46a8d34..f04396a7b5b 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
@@ -149,6 +149,8 @@ import 
org.apache.ignite.internal.sql.engine.util.cache.CaffeineCacheFactory;
 import org.apache.ignite.internal.sql.engine.util.cache.StatsCounter;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.apache.ignite.internal.type.NativeTypes;
 import org.apache.ignite.internal.util.AsyncCursor;
 import org.apache.ignite.internal.util.AsyncCursor.BatchedResult;
@@ -166,6 +168,7 @@ import org.junit.jupiter.api.Named;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -174,6 +177,9 @@ import org.junit.jupiter.params.provider.MethodSource;
  * Test class to verify {@link ExecutionServiceImplTest}.
  */
 @SuppressWarnings("ThrowableNotThrown")
+@ExtendWith(FailureManagerExtension.class)
+// TODO: https://issues.apache.org/jira/browse/IGNITE-25221 - remove the mute.
+@MuteFailureManagerLogging
 public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
     /** Tag allows to skip default cluster setup. */
     private static final String CUSTOM_CLUSTER_SETUP_TAG = 
"skipDefaultClusterSetup";
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
index 7a9bb5dc010..b6666dbd9fd 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerExceptionHandlingTest.java
@@ -27,6 +27,7 @@ import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutur
 import static org.apache.ignite.internal.util.IgniteUtils.stopAsync;
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ScheduledExecutorService;
 import org.apache.ignite.internal.catalog.CatalogCommand;
@@ -39,9 +40,12 @@ import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.hlc.HybridClockImpl;
 import org.apache.ignite.internal.hlc.TestClockService;
 import org.apache.ignite.internal.manager.ComponentContext;
+import org.apache.ignite.internal.manager.IgniteComponent;
 import org.apache.ignite.internal.testframework.ExecutorServiceExtension;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.testframework.InjectExecutorService;
+import 
org.apache.ignite.internal.testframework.failure.FailureManagerExtension;
+import 
org.apache.ignite.internal.testframework.failure.MuteFailureManagerLogging;
 import org.hamcrest.core.Is;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -50,6 +54,9 @@ import org.junit.jupiter.api.extension.ExtendWith;
 
 /** Tests distribution zone command exception handling. */
 @ExtendWith(ExecutorServiceExtension.class)
+@ExtendWith(FailureManagerExtension.class)
+// TODO: https://issues.apache.org/jira/browse/IGNITE-25222 - unmute.
+@MuteFailureManagerLogging
 public class DdlCommandHandlerExceptionHandlingTest extends IgniteAbstractTest 
{
     private DdlCommandHandler commandHandler;
 
@@ -75,7 +82,10 @@ public class DdlCommandHandlerExceptionHandlingTest extends 
IgniteAbstractTest {
     }
 
     @AfterEach
-    public void after() {
+    public void after() throws Exception {
+        commandHandler.stop();
+
+        List.of(clockWaiter, 
catalogManager).forEach(IgniteComponent::beforeNodeStop);
         assertThat(stopAsync(new ComponentContext(), clockWaiter, 
catalogManager), willCompleteSuccessfully());
     }
 


Reply via email to