This is an automated email from the ASF dual-hosted git repository. vy pushed a commit to branch recycler-api-3.x in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 21abf71034d6f936f25ae126f43d4caddc266632 Author: Volkan Yazıcı <[email protected]> AuthorDate: Mon Mar 20 22:35:37 2023 +0100 Use a single cleaner in recyclers --- .../log4j/spi/ThreadLocalRecyclerFactoryTest.java | 12 +++------ .../log4j/message/ReusableMessageFactory.java | 3 --- .../message/ReusableParameterizedMessage.java | 6 +++-- .../logging/log4j/spi/DummyRecyclerFactory.java | 6 ++--- .../logging/log4j/spi/QueueingRecyclerFactory.java | 27 ++++++-------------- .../apache/logging/log4j/spi/RecyclerFactory.java | 27 ++------------------ .../log4j/spi/ThreadLocalRecyclerFactory.java | 29 ++++++---------------- .../log4j/core/layout/AbstractStringLayout.java | 6 +++-- .../logging/log4j/core/layout/GelfLayout.java | 7 ++++-- .../json/resolver/StackTraceStringResolver.java | 14 ++++++----- 10 files changed, 45 insertions(+), 92 deletions(-) diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java index 14428d20c9..b7ab339375 100644 --- a/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java +++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactoryTest.java @@ -43,14 +43,10 @@ class ThreadLocalRecyclerFactoryTest { @BeforeEach void setUp() { - recycler = ThreadLocalRecyclerFactory.getInstance() - .create(RecyclableObject::new, o -> { - o.using = true; - o.returned = false; - }, o -> { - o.returned = true; - o.using = false; - }); + recycler = ThreadLocalRecyclerFactory.getInstance().create(RecyclableObject::new, object -> { + object.using = true; + object.returned = false; + }); } @ParameterizedTest diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java index 4e494dd82e..7410005c0a 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java @@ -55,15 +55,12 @@ public final class ReusableMessageFactory implements MessageFactory { super(); parameterizedMessageRecycler = recyclerFactory.create( ReusableParameterizedMessage::new, - RecyclerFactory.getDefaultCleaner(), ReusableParameterizedMessage::clear); simpleMessageRecycler = recyclerFactory.create( ReusableSimpleMessage::new, - RecyclerFactory.getDefaultCleaner(), ReusableSimpleMessage::clear); objectMessageRecycler = recyclerFactory.create( ReusableObjectMessage::new, - RecyclerFactory.getDefaultCleaner(), ReusableObjectMessage::clear); } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java index 9ec59f6b67..24982934d2 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java @@ -61,8 +61,10 @@ public class ReusableParameterizedMessage implements ReusableMessage, ParameterV final int currentPatternLength = messagePattern == null ? 0 : messagePattern.length(); return new StringBuilder(Math.max(MIN_BUILDER_SIZE, currentPatternLength * 2)); }, - buffer -> buffer.setLength(0), - buffer -> StringBuilders.trimToMaxSize(buffer, Constants.MAX_REUSABLE_MESSAGE_SIZE) + buffer -> { + StringBuilders.trimToMaxSize(buffer, Constants.MAX_REUSABLE_MESSAGE_SIZE); + buffer.setLength(0); + } ); } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java index 3ca81b521d..5f6f6d6019 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java @@ -35,10 +35,7 @@ public class DummyRecyclerFactory implements RecyclerFactory { } @Override - public <V> Recycler<V> create( - final Supplier<V> supplier, - final Consumer<V> lazyCleaner, - final Consumer<V> eagerCleaner) { + public <V> Recycler<V> create(final Supplier<V> supplier, final Consumer<V> cleaner) { return new DummyRecycler<>(supplier); } @@ -59,4 +56,5 @@ public class DummyRecyclerFactory implements RecyclerFactory { public void release(final V value) {} } + } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java index 3387ee4780..7579566ef1 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/QueueingRecyclerFactory.java @@ -31,12 +31,9 @@ public class QueueingRecyclerFactory implements RecyclerFactory { } @Override - public <V> Recycler<V> create( - final Supplier<V> supplier, - final Consumer<V> lazyCleaner, - final Consumer<V> eagerCleaner) { + public <V> Recycler<V> create(final Supplier<V> supplier, final Consumer<V> cleaner) { final Queue<V> queue = queueFactory.create(); - return new QueueingRecycler<>(supplier, lazyCleaner, eagerCleaner, queue); + return new QueueingRecycler<>(supplier, cleaner, queue); } // Visible for tests. @@ -44,20 +41,16 @@ public class QueueingRecyclerFactory implements RecyclerFactory { private final Supplier<V> supplier; - private final Consumer<V> lazyCleaner; - - private final Consumer<V> eagerCleaner; + private final Consumer<V> cleaner; private final Queue<V> queue; private QueueingRecycler( final Supplier<V> supplier, - final Consumer<V> lazyCleaner, - final Consumer<V> eagerCleaner, + final Consumer<V> cleaner, final Queue<V> queue) { this.supplier = supplier; - this.lazyCleaner = lazyCleaner; - this.eagerCleaner = eagerCleaner; + this.cleaner = cleaner; this.queue = queue; } @@ -69,19 +62,15 @@ public class QueueingRecyclerFactory implements RecyclerFactory { @Override public V acquire() { final V value = queue.poll(); - if (value == null) { - return supplier.get(); - } else { - lazyCleaner.accept(value); - return value; - } + return value != null ? value : supplier.get(); } @Override public void release(final V value) { - eagerCleaner.accept(value); + cleaner.accept(value); queue.offer(value); } } + } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java index 5bed301691..90b8132755 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/RecyclerFactory.java @@ -39,7 +39,7 @@ public interface RecyclerFactory { * @return a new recycler for V-type instances */ default <V> Recycler<V> create(final Supplier<V> supplier) { - return create(supplier, getDefaultCleaner()); + return create(supplier, ignored -> {}); } /** @@ -54,29 +54,6 @@ public interface RecyclerFactory { * @param <V> the recyclable type * @return a new recycler for V-type instances */ - default <V> Recycler<V> create(Supplier<V> supplier, Consumer<V> cleaner) { - return create(supplier, cleaner, getDefaultCleaner()); - } - - /** - * Creates a new recycler using the given functions for providing fresh instances and for cleaning recycled - * instances lazily or eagerly. The lazy cleaner function is invoked on recycled instances before being - * returned by {@link Recycler#acquire()}. The eager cleaner function is invoked on recycled instances - * during {@link Recycler#release(Object)}. - * - * @param supplier function to provide new instances of a recyclable object - * @param lazyCleaner function to invoke to clean a recycled object before being acquired - * @param eagerCleaner function to invoke to clean a recycled object after being released - * @param <V> the recyclable type - * @return a new recycler for V-type instances - */ - <V> Recycler<V> create(Supplier<V> supplier, Consumer<V> lazyCleaner, Consumer<V> eagerCleaner); - - /** - * Creates a default cleaner function that does nothing. - */ - static <V> Consumer<V> getDefaultCleaner() { - return ignored -> {}; - } + <V> Recycler<V> create(Supplier<V> supplier, Consumer<V> cleaner); } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java index 8a031c1ed9..65a8d1915f 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java @@ -49,11 +49,8 @@ public class ThreadLocalRecyclerFactory implements RecyclerFactory { } @Override - public <V> Recycler<V> create( - final Supplier<V> supplier, - final Consumer<V> lazyCleaner, - final Consumer<V> eagerCleaner) { - return new ThreadLocalRecycler<>(supplier, lazyCleaner, eagerCleaner); + public <V> Recycler<V> create(final Supplier<V> supplier, final Consumer<V> cleaner) { + return new ThreadLocalRecycler<>(supplier, cleaner); } // Visible for testing @@ -61,19 +58,13 @@ public class ThreadLocalRecyclerFactory implements RecyclerFactory { private final Supplier<V> supplier; - private final Consumer<V> lazyCleaner; - - private final Consumer<V> eagerCleaner; + private final Consumer<V> cleaner; private final ThreadLocal<Queue<V>> holder; - private ThreadLocalRecycler( - final Supplier<V> supplier, - final Consumer<V> lazyCleaner, - final Consumer<V> eagerCleaner) { + private ThreadLocalRecycler(final Supplier<V> supplier, final Consumer<V> cleaner) { this.supplier = supplier; - this.lazyCleaner = lazyCleaner; - this.eagerCleaner = eagerCleaner; + this.cleaner = cleaner; this.holder = ThreadLocal.withInitial(() -> Queues.SPSC.create(MAX_QUEUE_SIZE)); } @@ -81,17 +72,12 @@ public class ThreadLocalRecyclerFactory implements RecyclerFactory { public V acquire() { final Queue<V> queue = holder.get(); final V value = queue.poll(); - if (value == null) { - return supplier.get(); - } else { - lazyCleaner.accept(value); - return value; - } + return value != null ? value : supplier.get(); } @Override public void release(final V value) { - eagerCleaner.accept(value); + cleaner.accept(value); holder.get().offer(value); } @@ -101,4 +87,5 @@ public class ThreadLocalRecyclerFactory implements RecyclerFactory { } } + } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java index da6e062907..55572b4252 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java @@ -123,8 +123,10 @@ public abstract class AbstractStringLayout extends AbstractLayout implements Str protected static Recycler<StringBuilder> createRecycler(final RecyclerFactory recyclerFactory) { return recyclerFactory.create( () -> new StringBuilder(DEFAULT_STRING_BUILDER_SIZE), - stringBuilder -> stringBuilder.setLength(0), - stringBuilder -> StringBuilders.trimToMaxSize(stringBuilder, MAX_STRING_BUILDER_SIZE) + stringBuilder -> { + StringBuilders.trimToMaxSize(stringBuilder, MAX_STRING_BUILDER_SIZE); + stringBuilder.setLength(0); + } ); } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java index bd0d0f6bcb..69baf2f181 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java @@ -488,8 +488,11 @@ public final class GelfLayout extends AbstractStringLayout { this.layout = patternLayout; stacktraceRecycler = recyclerFactory.create( () -> new StringBuilderWriter(MAX_STRING_BUILDER_SIZE), - writer -> writer.getBuilder().setLength(0), - writer -> StringBuilders.trimToMaxSize(writer.getBuilder(), MAX_STRING_BUILDER_SIZE) + writer -> { + final StringBuilder stringBuilder = writer.getBuilder(); + StringBuilders.trimToMaxSize(stringBuilder, MAX_STRING_BUILDER_SIZE); + stringBuilder.setLength(0); + } ); } diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java index 35c2f23ca1..a39a8d6180 100644 --- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java +++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java @@ -17,6 +17,7 @@ package org.apache.logging.log4j.layout.template.json.resolver; import java.util.List; +import java.util.function.Consumer; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -90,19 +91,20 @@ final class StackTraceStringResolver implements StackTraceResolver { final TruncatingBufferedPrintWriter srcWriter = srcWriterRecycler.acquire(); try { throwable.printStackTrace(srcWriter); - final TruncatingBufferedPrintWriter dstWriter = truncate(srcWriter); - jsonWriter.writeString(dstWriter); + truncate(srcWriter, jsonWriter::writeString); } finally { srcWriterRecycler.release(srcWriter); } } - private TruncatingBufferedPrintWriter truncate( - final TruncatingBufferedPrintWriter srcWriter) { + private void truncate( + final TruncatingBufferedPrintWriter srcWriter, + final Consumer<TruncatingBufferedPrintWriter> effectiveWriterConsumer) { // Short-circuit if truncation is not enabled. if (!truncationEnabled) { - return srcWriter; + effectiveWriterConsumer.accept(srcWriter); + return; } // Allocate temporary buffers and truncate the input. @@ -116,10 +118,10 @@ final class StackTraceStringResolver implements StackTraceResolver { } finally { sequencePointerRecycler.release(sequencePointer); } + effectiveWriterConsumer.accept(dstWriter); } finally { dstWriterRecycler.release(dstWriter); } - return dstWriter; }
