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