Class MemoryMappedFileManager

All Implemented Interfaces:
AutoCloseable, ByteBufferDestination

public class MemoryMappedFileManager extends OutputStreamManager
Extends OutputStreamManager but instead of using a buffered output stream, this class maps a region of a file into memory and writes to this memory region.

Since:
2.1
See Also:
  • Field Details

    • DEFAULT_REGION_LENGTH

      static final int DEFAULT_REGION_LENGTH
      Default length of region to map.
      See Also:
    • MAX_REMAP_COUNT

      private static final int MAX_REMAP_COUNT
      See Also:
    • NANOS_PER_MILLISEC

      private static final double NANOS_PER_MILLISEC
      See Also:
    • immediateFlush

      private final boolean immediateFlush
    • regionLength

      private final int regionLength
    • advertiseURI

      private final String advertiseURI
    • randomAccessFile

      private final RandomAccessFile randomAccessFile
    • mappedBuffer

      private MappedByteBuffer mappedBuffer
    • mappingOffset

      private long mappingOffset
  • Constructor Details

  • Method Details

    • getFileManager

      public static MemoryMappedFileManager getFileManager(String fileName, boolean append, boolean immediateFlush, int regionLength, String advertiseURI, Layout<? extends Serializable> layout)
      Returns the MemoryMappedFileManager.
      Parameters:
      fileName - The name of the file to manage.
      append - true if the file should be appended to, false if it should be overwritten.
      immediateFlush - true if the contents should be flushed to disk on every write
      regionLength - The mapped region length.
      advertiseURI - the URI to use when advertising the file
      layout - The layout.
      Returns:
      A MemoryMappedFileManager for the File.
    • isEndOfBatch

      @Deprecated public Boolean isEndOfBatch()
      Deprecated.
      end-of-batch on the event is used instead.
      No longer used, the LogEvent.isEndOfBatch() attribute is used instead.
      Returns:
      Boolean.FALSE.
    • setEndOfBatch

      @Deprecated public void setEndOfBatch(boolean endOfBatch)
      Deprecated.
      end-of-batch on the event is used instead.
      No longer used, the LogEvent.isEndOfBatch() attribute is used instead. This method is a no-op.
    • write

      protected void write(byte[] bytes, int offset, int length, boolean immediateFlush)
      Description copied from class: OutputStreamManager
      Some output streams synchronize writes while others do not. Synchronizing here insures that log events won't be intertwined.
      Overrides:
      write in class OutputStreamManager
      Parameters:
      bytes - The serialized Log event.
      offset - The offset into the byte array.
      length - The number of bytes to write.
      immediateFlush - flushes immediately after writing.
    • remap

      private void remap()
    • flush

      public void flush()
      Description copied from class: OutputStreamManager
      Flushes any buffers.
      Overrides:
      flush in class OutputStreamManager
    • closeOutputStream

      public boolean closeOutputStream()
      Overrides:
      closeOutputStream in class OutputStreamManager
    • mmap

      public static MappedByteBuffer mmap(FileChannel fileChannel, String fileName, long start, int size) throws IOException
      Throws:
      IOException
    • unsafeUnmap

      private static void unsafeUnmap(MappedByteBuffer mbb) throws Exception
      Throws:
      Exception
    • getFileName

      public String getFileName()
      Returns the name of the File being managed.
      Returns:
      The name of the File being managed.
    • getRegionLength

      public int getRegionLength()
      Returns the length of the memory mapped region.
      Returns:
      the length of the mapped region
    • isImmediateFlush

      public boolean isImmediateFlush()
      Returns true if the content of the buffer should be forced to the storage device on every write, false otherwise.
      Returns:
      whether each write should be force-sync'ed
    • getContentFormat

      public Map<String,String> getContentFormat()
      Gets this FileManager's content format specified by:

      Key: "fileURI" Value: provided "advertiseURI" param.

      Overrides:
      getContentFormat in class AbstractManager
      Returns:
      Map of content format keys supporting FileManager
    • flushBuffer

      protected void flushBuffer(ByteBuffer buffer)
      Description copied from class: OutputStreamManager
      Drains the ByteBufferDestination's buffer into the destination. By default this calls OutputStreamManager.write(byte[], int, int, boolean) with the buffer contents. The underlying stream is not flushed.
      Overrides:
      flushBuffer in class OutputStreamManager
      See Also:
    • getByteBuffer

      public ByteBuffer getByteBuffer()
      Description copied from class: OutputStreamManager
      Returns this ByteBufferDestination's buffer.
      Specified by:
      getByteBuffer in interface ByteBufferDestination
      Overrides:
      getByteBuffer in class OutputStreamManager
      Returns:
      the buffer
    • drain

      public ByteBuffer drain(ByteBuffer buf)
      Description copied from class: OutputStreamManager
      Drains the ByteBufferDestination's buffer into the destination. By default this calls OutputStreamManager.flushBuffer(ByteBuffer) with the specified buffer. Subclasses may override.

      Do not call this method lightly! For some subclasses this is a very expensive operation. For example, MemoryMappedFileManager will assume this method was called because the end of the mapped region was reached during a text encoding operation and will remap its buffer.

      To just flush the buffered contents to the underlying stream, call OutputStreamManager.flushBuffer(ByteBuffer) directly instead.

      Specified by:
      drain in interface ByteBufferDestination
      Overrides:
      drain in class OutputStreamManager
      Parameters:
      buf - the buffer whose contents to write the destination
      Returns:
      the specified buffer