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

mpochatkin 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 da542549313 IGNITE-26097 Duplicate events in the log inspector (#6355)
da542549313 is described below

commit da542549313be84c836ef02a6b49c7f8d00c0fb7
Author: Vadim Pakhnushev <[email protected]>
AuthorDate: Mon Aug 4 16:38:00 2025 +0300

    IGNITE-26097 Duplicate events in the log inspector (#6355)
---
 .../testframework/log4j2/LogInspector.java         | 28 +++++++++++++---------
 .../FailureProcessorThreadDumpThrottlingTest.java  |  8 +++----
 .../placementdriver/LeaseNegotiationTest.java      |  3 +--
 .../ignite/raft/server/ItConnectionErrorTest.java  |  3 +--
 4 files changed, 22 insertions(+), 20 deletions(-)

diff --git 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/log4j2/LogInspector.java
 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/log4j2/LogInspector.java
index 11a708b6172..d7089e1cfcb 100755
--- 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/log4j2/LogInspector.java
+++ 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/log4j2/LogInspector.java
@@ -24,6 +24,7 @@ import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.stream.IntStream;
 import org.apache.logging.log4j.LogManager;
@@ -177,7 +178,7 @@ public class LogInspector {
      * @param action Action to be executed when the {@code predicate} is 
matched.
      */
     public LogInspector(String loggerName, Predicate<LogEvent> predicate, 
Runnable action) {
-        this(loggerName, new Handler(predicate, action));
+        this(loggerName, new Handler(predicate, event -> action.run()));
     }
 
     /**
@@ -214,7 +215,7 @@ public class LogInspector {
      * @return New instance of {@link Handler}.
      */
     public Handler addHandler(Predicate<LogEvent> predicate, Runnable action) {
-        Handler handler = new Handler(predicate, action);
+        Handler handler = new Handler(predicate, event -> action.run());
 
         addHandler(handler);
 
@@ -313,11 +314,16 @@ public class LogInspector {
         appender.stop();
 
         removeAppender(appender, config);
+
+        config = null;
     }
 
     private static synchronized void addAppender(Appender appender, 
Configuration config) {
         for (LoggerConfig loggerConfig : config.getLoggers().values()) {
-            loggerConfig.addAppender(appender, null, null);
+            // Only add appender to the non-additive logger to prevent event 
duplication.
+            if (!loggerConfig.isAdditive()) {
+                loggerConfig.addAppender(appender, null, null);
+            }
         }
         config.getRootLogger().addAppender(appender, null, null);
     }
@@ -336,8 +342,8 @@ public class LogInspector {
         /** Predicate that is used to check log messages. */
         private final Predicate<LogEvent> predicate;
 
-        /** Action to be executed when the {@code predicate} is matched. */
-        private final Runnable action;
+        /** Consumer to be supplied with event when the {@code predicate} is 
matched. */
+        private final Consumer<LogEvent> consumer;
 
         /** Counter that indicates how many times the predicate has matched. */
         private final AtomicInteger timesMatched = new AtomicInteger();
@@ -346,14 +352,14 @@ public class LogInspector {
          * Creates a new instance of {@link Handler}.
          *
          * @param predicate Predicate to check log messages.
-         * @param action Action to be executed when the {@code predicate} is 
matched.
+         * @param consumer Consumer to be supplied with the event when the 
{@code predicate} is matched.
          */
-        public Handler(Predicate<LogEvent> predicate, Runnable action) {
+        public Handler(Predicate<LogEvent> predicate, Consumer<LogEvent> 
consumer) {
             Objects.requireNonNull(predicate);
-            Objects.requireNonNull(action);
+            Objects.requireNonNull(consumer);
 
             this.predicate = predicate;
-            this.action = action;
+            this.consumer = consumer;
         }
 
         /**
@@ -376,7 +382,7 @@ public class LogInspector {
     }
 
     private class TestLogAppender extends AbstractAppender {
-        public TestLogAppender(String name) {
+        private TestLogAppender(String name) {
             super(name, null, null, true, Property.EMPTY_ARRAY);
         }
 
@@ -391,7 +397,7 @@ public class LogInspector {
                 handlers.forEach(handler -> {
                     if (handler.predicate.test(event)) {
                         handler.timesMatched.incrementAndGet();
-                        handler.action.run();
+                        handler.consumer.accept(event);
                     }
                 });
             } finally {
diff --git 
a/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorThreadDumpThrottlingTest.java
 
b/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorThreadDumpThrottlingTest.java
index 52c69046e6a..963cb922bba 100644
--- 
a/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorThreadDumpThrottlingTest.java
+++ 
b/modules/failure-handler/src/test/java/org/apache/ignite/internal/failure/FailureProcessorThreadDumpThrottlingTest.java
@@ -95,12 +95,10 @@ public class FailureProcessorThreadDumpThrottlingTest 
extends BaseIgniteAbstract
      */
     @Test
     public void testNoThrottling() {
-        AtomicInteger messageCounter = new AtomicInteger();
-
         LogInspector logInspector = new LogInspector(
                 FailureManager.class.getName(),
-                evt -> 
evt.getMessage().getFormattedMessage().startsWith(THREAD_DUMP_MSG),
-                messageCounter::incrementAndGet);
+                evt -> 
evt.getMessage().getFormattedMessage().startsWith(THREAD_DUMP_MSG)
+        );
 
         logInspector.start();
         try {
@@ -116,7 +114,7 @@ public class FailureProcessorThreadDumpThrottlingTest 
extends BaseIgniteAbstract
             logInspector.stop();
         }
 
-        assertThat(messageCounter.get(), is(2));
+        assertThat(logInspector.timesMatched().sum(), is(2));
     }
 
     /**
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 d53bbd716e1..80133f0c505 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
@@ -88,7 +88,6 @@ import org.apache.ignite.internal.replicator.ZonePartitionId;
 import 
org.apache.ignite.internal.replicator.configuration.ReplicationConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.log4j2.LogInspector;
-import org.apache.ignite.internal.testframework.log4j2.LogInspector.Handler;
 import org.apache.ignite.network.NetworkAddress;
 import org.apache.logging.log4j.core.LogEvent;
 import org.jetbrains.annotations.Nullable;
@@ -514,7 +513,7 @@ public class LeaseNegotiationTest extends 
BaseIgniteAbstractTest {
         Predicate<LogEvent> pred = logEvent -> 
logEvent.getMessage().getFormattedMessage()
                 .contains("Lease was not negotiated due to exception");
 
-        LogInspector logInspector = new 
LogInspector(LeaseNegotiator.class.getName(), new Handler(pred, () -> {}));
+        LogInspector logInspector = new 
LogInspector(LeaseNegotiator.class.getName(), pred);
 
         logInspector.start();
 
diff --git 
a/modules/raft/src/integrationTest/java/org/apache/ignite/raft/server/ItConnectionErrorTest.java
 
b/modules/raft/src/integrationTest/java/org/apache/ignite/raft/server/ItConnectionErrorTest.java
index 83a19b412fa..c86da4c7aa4 100644
--- 
a/modules/raft/src/integrationTest/java/org/apache/ignite/raft/server/ItConnectionErrorTest.java
+++ 
b/modules/raft/src/integrationTest/java/org/apache/ignite/raft/server/ItConnectionErrorTest.java
@@ -44,7 +44,6 @@ import 
org.apache.ignite.internal.raft.service.RaftGroupService;
 import org.apache.ignite.internal.raft.util.ThreadLocalOptimizedMarshaller;
 import org.apache.ignite.internal.replicator.TestReplicationGroupId;
 import org.apache.ignite.internal.testframework.log4j2.LogInspector;
-import org.apache.ignite.internal.testframework.log4j2.LogInspector.Handler;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.raft.jraft.core.Replicator;
 import org.apache.ignite.raft.jraft.core.ReplicatorGroupImpl;
@@ -171,7 +170,7 @@ public class ItConnectionErrorTest extends 
JraftAbstractTest {
             return false;
         };
 
-        return new LogInspector(cls.getName(), new Handler(pred, () -> {}));
+        return new LogInspector(cls.getName(), pred);
     }
 
     private static void stopLogInspectors(List<LogInspector> logInspectors) {

Reply via email to