Class DirectIODirectory

All Implemented Interfaces:
Closeable, AutoCloseable

public class DirectIODirectory extends FilterDirectory
A Directory implementation for all Unixes and Windows that uses DIRECT I/O to bypass OS level IO caching during merging. For all other cases (searching, writing) we delegate to the provided Directory instance.

See Overview for more details.

WARNING: this code is very new and quite easily could contain horrible bugs.

This directory passes Solr and Lucene tests on Linux, OS X, and Windows; other systems should work but have not been tested! Use at your own risk.

@throws UnsupportedOperationException if the operating system, file system or JDK does not support Direct I/O or a sufficient equivalent.

  • Field Details

    • DEFAULT_MERGE_BUFFER_SIZE

      public static final int DEFAULT_MERGE_BUFFER_SIZE
      Default buffer size before writing to disk (256 KB); larger means less IO load but more RAM and direct buffer storage space consumed during merging.
      See Also:
    • DEFAULT_MIN_BYTES_DIRECT

      public static final long DEFAULT_MIN_BYTES_DIRECT
      Default min expected merge size before direct IO is used (10 MB):
      See Also:
    • blockSize

      private final int blockSize
    • mergeBufferSize

      private final int mergeBufferSize
    • minBytesDirect

      private final long minBytesDirect
    • isOpen

      volatile boolean isOpen
    • ExtendedOpenOption_DIRECT

      static final OpenOption ExtendedOpenOption_DIRECT
      Reference to com.sun.nio.file.ExtendedOpenOption.DIRECT by reflective class and enum lookup. There are two reasons for using this instead of directly referencing ExtendedOpenOption.DIRECT:
      1. ExtendedOpenOption.DIRECT is OpenJDK's internal proprietary API. This API causes un-suppressible(?) warning to be emitted when compiling with --release flag and value N, where N is smaller than the the version of javac used for compilation. For details, please refer to https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8259039.
      2. It is possible that Lucene is run using JDK that does not support ExtendedOpenOption.DIRECT. In such a case, dynamic lookup allows us to bail out with UnsupportedOperationException with meaningful error message.

      This reference is null, if the JDK does not support direct I/O.

  • Constructor Details

    • DirectIODirectory

      public DirectIODirectory(FSDirectory delegate, int mergeBufferSize, long minBytesDirect) throws IOException
      Create a new DirectIODirectory for the named location.
      Parameters:
      delegate - Directory for non-merges, also used as reference to file system path.
      mergeBufferSize - Size of buffer to use for merging.
      minBytesDirect - Merges, or files to be opened for reading, smaller than this will not use direct IO. See DEFAULT_MIN_BYTES_DIRECT and useDirectIO(java.lang.String, org.apache.lucene.store.IOContext, java.util.OptionalLong).
      Throws:
      IOException - If there is a low-level I/O error
    • DirectIODirectory

      public DirectIODirectory(FSDirectory delegate) throws IOException
      Create a new DirectIODirectory for the named location.
      Parameters:
      delegate - Directory for non-merges, also used as reference to file system path.
      Throws:
      IOException - If there is a low-level I/O error
  • Method Details