[LOG4J2-1977] Consider the StringBuilder's capacity instead of content length when trimming. Applied patch with minor changes. Closes #92.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/9073618c Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/9073618c Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/9073618c Branch: refs/heads/LOG4J2-1986 Commit: 9073618c94adbf68d41aedb21e58304780182856 Parents: 75d26df Author: Jerry xnslong <[email protected]> Authored: Tue Jul 25 12:35:48 2017 -0700 Committer: Gary Gregory <[email protected]> Committed: Tue Jul 25 12:35:48 2017 -0700 ---------------------------------------------------------------------- .../logging/log4j/util/StringBuilders.java | 2 +- .../logging/log4j/util/StringBuildersTest.java | 14 ++++++++++ .../core/layout/AbstractStringLayoutTest.java | 29 ++++++++++++-------- src/changes/changes.xml | 3 ++ 4 files changed, 35 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9073618c/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java index c84c425..2d6ae9c 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java @@ -153,7 +153,7 @@ public final class StringBuilders { * @since 2.9 */ public static void trimToMaxSize(final StringBuilder stringBuilder, final int maxSize) { - if (stringBuilder != null && stringBuilder.length() > maxSize) { + if (stringBuilder != null && stringBuilder.capacity() > maxSize) { stringBuilder.setLength(maxSize); stringBuilder.trimToSize(); } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9073618c/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java index 24d0e93..b52e3f6 100644 --- a/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java +++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java @@ -34,4 +34,18 @@ public class StringBuildersTest { StringBuilders.trimToMaxSize(sb, Constants.MAX_REUSABLE_MESSAGE_SIZE); assertTrue("trimmed OK", sb.length() <= Constants.MAX_REUSABLE_MESSAGE_SIZE); } + + @Test + public void trimToMaxSizeWithLargeCapacity() throws Exception { + final StringBuilder sb = new StringBuilder(); + final char[] value = new char[4 * 1024]; + sb.append(value); + sb.setLength(0); + + assertTrue("needs trimming", sb.capacity() > Constants.MAX_REUSABLE_MESSAGE_SIZE); + StringBuilders.trimToMaxSize(sb, Constants.MAX_REUSABLE_MESSAGE_SIZE); + assertTrue("trimmed OK", sb.capacity() <= Constants.MAX_REUSABLE_MESSAGE_SIZE); + } + + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9073618c/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java index fcd4ae1..19f5fb5 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/AbstractStringLayoutTest.java @@ -47,26 +47,31 @@ public class AbstractStringLayoutTest { @Test public void testGetStringBuilderCapacityRestrictedToMax() throws Exception { final StringBuilder sb = ConcreteStringLayout.getStringBuilder(); + int initialCapacity = sb.capacity(); assertEquals("initial capacity", ConcreteStringLayout.DEFAULT_STRING_BUILDER_SIZE, sb.capacity()); - final int MEDIUM = ConcreteStringLayout.DEFAULT_STRING_BUILDER_SIZE + 100; - final String mediumMessage = new String(new char[MEDIUM]); - sb.append(mediumMessage); - final int GROWN = sb.capacity(); - assertTrue("capacity has grown", GROWN >= MEDIUM); - assertEquals("length=msg length", MEDIUM, sb.length()); + final int SMALL = 100; + final String smallMessage = new String(new char[SMALL]); + sb.append(smallMessage); + assertTrue("capacity not grown", sb.capacity() == initialCapacity); + assertEquals("length=msg length", SMALL, sb.length()); - final int LARGE = 4096; - final String largeMessage = new String(new char[LARGE]); final StringBuilder sb2 = ConcreteStringLayout.getStringBuilder(); - assertEquals("resized capacity", GROWN, sb2.capacity()); + assertEquals("capacity unchanged", sb2.capacity(), initialCapacity); assertEquals("empty, ready for use", 0, sb2.length()); + + final int LARGE = ConcreteStringLayout.MAX_STRING_BUILDER_SIZE * 2; + final String largeMessage = new String(new char[LARGE]); sb2.append(largeMessage); assertTrue("capacity grown to fit msg length", sb2.capacity() >= LARGE); + assertTrue("capacity is now greater than max length", sb2.capacity() >= ConcreteStringLayout.MAX_STRING_BUILDER_SIZE); assertEquals("length=msg length", LARGE, sb2.length()); + sb2.setLength(0); // set 0 before next getStringBuilder() call + assertEquals("empty, cleared", 0, sb2.length()); + assertTrue("capacity remains very large", sb2.capacity() >= ConcreteStringLayout.MAX_STRING_BUILDER_SIZE); - final StringBuilder next = ConcreteStringLayout.getStringBuilder(); - assertEquals("max capacity", ConcreteStringLayout.MAX_STRING_BUILDER_SIZE, next.capacity()); - assertEquals("empty, ready for use", 0, next.length()); + final StringBuilder sb3 = ConcreteStringLayout.getStringBuilder(); + assertEquals("capacity, trimmed to MAX_STRING_BUILDER_SIZE", ConcreteStringLayout.MAX_STRING_BUILDER_SIZE, sb3.capacity()); + assertEquals("empty, ready for use", 0, sb3.length()); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9073618c/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 2e34b7c..d5db5a6 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -40,6 +40,9 @@ <action issue="LOG4J2-1864" dev="mattsicker" type="add" due-to="Matthias Kappeller"> Support capped collections for MongoDb appender. </action> + <action issue="LOG4J2-1977" dev="ggregory" type="fix" due-to="Jerry xnslong"> + Consider the StringBuilder's capacity instead of content length when trimming. + </action> <action issue="LOG4J2-1971" dev="rgoers" type="fix"> Register log4j-core as an OSGi service. Skip tests for LOG4J2-1766 on MacOS. Use group "staff" for LOG4J2-1699 test on MacOS. </action>
