You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/04/06 20:11:46 UTC

[10/18] logging-log4j2 git commit: LOG4J2-1343 refactored RandomAccessFileManager to reuse the garbage-free Layout mechanism defined in the superclass, simplified logic when bytes to write exceed buffer size

LOG4J2-1343 refactored RandomAccessFileManager to reuse the garbage-free Layout mechanism defined in the superclass, simplified logic when bytes to write exceed buffer size


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

Branch: refs/heads/master
Commit: 32e557bfffc9330242f7acacfc7a12c4553695ba
Parents: 920f8aa
Author: rpopma <rp...@apache.org>
Authored: Thu Apr 7 03:04:27 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Apr 7 03:04:27 2016 +0900

----------------------------------------------------------------------
 .../core/appender/RandomAccessFileManager.java  | 44 +++++++++++++-------
 1 file changed, 30 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/32e557bf/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
index ec616c4..9b7fc91 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileManager.java
@@ -89,31 +89,37 @@ public class RandomAccessFileManager extends OutputStreamManager implements Byte
     protected synchronized void write(final byte[] bytes, int offset, int length, final boolean immediateFlush) {
         super.write(bytes, offset, length, immediateFlush); // writes to dummy output stream
 
-        int chunk = 0;
-        do {
-            if (length > buffer.remaining()) {
-                flush();
-            }
-            chunk = Math.min(length, buffer.remaining());
-            buffer.put(bytes, offset, chunk);
-            offset += chunk;
-            length -= chunk;
-        } while (length > 0);
+        if (length >= buffer.capacity()) {
+            // if request length exceeds buffer capacity, flush the buffer and write the data directly
+            flush();
+            writeToRandomAccessFile(bytes, offset, length);
+            return;
+        }
+        if (length > buffer.remaining()) {
+            flush();
+        }
+        buffer.put(bytes, offset, length);
 
         if (immediateFlush || isImmediateFlush || isEndOfBatch.get() == Boolean.TRUE) {
             flush();
         }
     }
 
-    @Override
-    public synchronized void flush() {
-        buffer.flip();
+    private void writeToRandomAccessFile(final byte[] bytes, final int offset, final int length) {
         try {
-            randomAccessFile.write(buffer.array(), 0, buffer.limit());
+            randomAccessFile.write(bytes, offset, length);
         } catch (final IOException ex) {
             final String msg = "Error writing to RandomAccessFile " + getName();
             throw new AppenderLoggingException(msg, ex);
         }
+    }
+
+    @Override
+    public synchronized void flush() {
+        buffer.flip();
+        if (buffer.limit() > 0) {
+            writeToRandomAccessFile(buffer.array(), 0, buffer.limit());
+        }
         buffer.clear();
     }
 
@@ -160,6 +166,16 @@ public class RandomAccessFileManager extends OutputStreamManager implements Byte
         return result;
     }
 
+    /**
+     * Returns this {@code RandomAccessFileManager}.
+     * @param immediateFlush ignored
+     * @return this {@code RandomAccessFileManager}
+     */
+    @Override
+    protected ByteBufferDestination createByteBufferDestination(final boolean immediateFlush) {
+        return this;
+    }
+
     @Override
     public ByteBuffer getByteBuffer() {
         return buffer;