[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>

Reply via email to