LOG4J2-431 improve parameter validation

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a5325b37
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a5325b37
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a5325b37

Branch: refs/heads/LOG4J2-431
Commit: a5325b37995775a02865f4093f4f4b4ff2df5120
Parents: 80dafe9
Author: rpopma <[email protected]>
Authored: Thu Sep 18 00:43:54 2014 +0900
Committer: rpopma <[email protected]>
Committed: Thu Sep 18 00:43:54 2014 +0900

----------------------------------------------------------------------
 .../core/appender/MemoryMappedFileAppender.java | 35 ++++++++++++++++----
 1 file changed, 28 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a5325b37/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
index 785c3da..56b40b8 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
@@ -42,6 +42,9 @@ public final class MemoryMappedFileAppender extends 
AbstractOutputStreamAppender
 
     private static final long serialVersionUID = 1L;
 
+    private static final int MAX_REGION_LENGTH = 1 << 30; // 1GB
+    private static final int MIN_REGION_LENGTH = 256;
+
     private final String fileName;
     private Object advertisement;
     private final Advertiser advertiser;
@@ -127,7 +130,7 @@ public final class MemoryMappedFileAppender extends 
AbstractOutputStreamAppender
      */
     @PluginFactory
     public static MemoryMappedFileAppender createAppender(
-    // @formatter:off
+// @formatter:off
             @PluginAttribute("fileName") final String fileName, //
             @PluginAttribute("append") final String append, //
             @PluginAttribute("name") final String name, //
@@ -142,15 +145,11 @@ public final class MemoryMappedFileAppender extends 
AbstractOutputStreamAppender
         // @formatter:on
 
         final boolean isAppend = Booleans.parseBoolean(append, true);
-        final boolean isForce = Booleans.parseBoolean(immediateFlush, true);
+        final boolean isForce = Booleans.parseBoolean(immediateFlush, false);
         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
         final boolean isAdvertise = Boolean.parseBoolean(advertise);
         final int regionLength = Integers.parseInt(regionLengthStr, 
MemoryMappedFileManager.DEFAULT_REGION_LENGTH);
-        final int actualRegionLength = 
Integers.ceilingNextPowerOfTwo(regionLength);
-        if (regionLength != actualRegionLength) {
-            LOGGER.info("MemoryMappedAppender[{}] Rounded up region length 
from {} to next power of two: {}", name,
-                    regionLength, actualRegionLength);
-        }
+        final int actualRegionLength = determineValidRegionLength(name, 
regionLength);
 
         if (name == null) {
             LOGGER.error("No name provided for MemoryMappedFileAppender");
@@ -173,4 +172,26 @@ public final class MemoryMappedFileAppender extends 
AbstractOutputStreamAppender
         return new MemoryMappedFileAppender(name, layout, filter, manager, 
fileName, ignoreExceptions, isForce,
                 isAdvertise ? config.getAdvertiser() : null);
     }
+
+    /**
+     * Converts the specified region length to a valid value.
+     */
+    private static int determineValidRegionLength(final String name, final int 
regionLength) {
+        if (regionLength > MAX_REGION_LENGTH) {
+            LOGGER.info("MemoryMappedAppender[{}] Reduced region length from 
{} to max length: {}", name, regionLength,
+                    MAX_REGION_LENGTH);
+            return MAX_REGION_LENGTH;
+        }
+        if (regionLength < MIN_REGION_LENGTH) {
+            LOGGER.info("MemoryMappedAppender[{}] Expanded region length from 
{} to min length: {}", name, regionLength,
+                    MIN_REGION_LENGTH);
+            return MIN_REGION_LENGTH;
+        }
+        final int result = Integers.ceilingNextPowerOfTwo(regionLength);
+        if (regionLength != result) {
+            LOGGER.info("MemoryMappedAppender[{}] Rounded up region length 
from {} to next power of two: {}", name,
+                    regionLength, result);
+        }
+        return result;
+    }
 }

Reply via email to