You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2023/09/06 11:16:52 UTC

[logging-log4j2] 01/03: Improve concurrency of ListStatusListener

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

pkarwasz pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 16cfa4120518029377424810496cababc2e4b574
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Wed Sep 6 13:14:51 2023 +0200

    Improve concurrency of ListStatusListener
    
    ListStatusListener#getStatusData returns a stream that uses a copy of
    the data to prevent a ConcurrentModificationException.
---
 .../logging/log4j/test/junit/StatusLoggerExtension.java | 17 +++++++++++++----
 .../org/apache/logging/log4j/status/StatusData.java     | 10 +++++++++-
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
index b301783e4f..0452d63bd8 100644
--- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
+++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.test.junit;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Stream;
 
@@ -89,7 +88,7 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene
     private static class JUnitListStatusListener implements ListStatusListener {
 
         private final ExtensionContext context;
-        private final List<StatusData> statusData = Collections.synchronizedList(new ArrayList<StatusData>());
+        private final ArrayList<StatusData> statusData = new ArrayList<>();
 
         public JUnitListStatusListener(final ExtensionContext context) {
             this.context = context;
@@ -98,7 +97,9 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene
         @Override
         public void log(final StatusData data) {
             if (context.equals(ExtensionContextAnchor.getContext())) {
-                statusData.add(data);
+                synchronized (statusData) {
+                    statusData.add(data);
+                }
             }
         }
 
@@ -114,8 +115,16 @@ class StatusLoggerExtension extends TypeBasedParameterResolver<ListStatusListene
 
         @Override
         public Stream<StatusData> getStatusData() {
-            return statusData.stream();
+            synchronized (statusData) {
+                return ((List<StatusData>) statusData.clone()).stream();
+            }
         }
 
+        @Override
+        public void clear() {
+            synchronized (statusData) {
+                statusData.clear();
+            }
+        }
     }
 }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
index 886a0a3b72..a4378900d3 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
@@ -25,7 +25,7 @@ import java.util.Date;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.message.Message;
 
-import static org.apache.logging.log4j.util.Chars.*;
+import static org.apache.logging.log4j.util.Chars.SPACE;
 
 /**
  * The Status data.
@@ -142,4 +142,12 @@ public class StatusData implements Serializable {
         }
         return sb.toString();
     }
+
+    /**
+     * Used in tests
+     */
+    @Override
+    public String toString() {
+        return getMessage().getFormattedMessage();
+    }
 }