Package org.apache.lucene.misc.store

# Class DirectIODirectory

java.lang.Object
org.apache.lucene.store.Directory
org.apache.lucene.store.FilterDirectory
org.apache.lucene.misc.store.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.

WARNING: This API is experimental and might change in incompatible ways in the next release.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `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.
  `static final long`
  `DEFAULT_MIN_BYTES_DIRECT`
  Default min expected merge size before direct IO is used (10 MB):

  ### Fields inherited from class org.apache.lucene.store.FilterDirectory

  `in`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `DirectIODirectory(FSDirectory delegate)`
  Create a new DirectIODirectory for the named location.
  `DirectIODirectory(FSDirectory delegate, int mergeBufferSize, long minBytesDirect)`
  Create a new DirectIODirectory for the named location.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `close()`
  `IndexOutput`
  `createOutput(String name, IOContext context)`
  `protected void`
  `ensureOpen()`
  `Path`
  `getDirectory()`
  `IndexInput`
  `openInput(String name, IOContext context)`
  `protected boolean`
  `useDirectIO(String name, IOContext context, OptionalLong fileLength)`
  Determines if direct IO should be used for a file.

  ### Methods inherited from class org.apache.lucene.store.FilterDirectory

  `createTempOutput, deleteFile, fileLength, getDelegate, getPendingDeletions, listAll, obtainLock, rename, sync, syncMetaData, toString, unwrap`

  ### Methods inherited from class org.apache.lucene.store.Directory

  `copyFrom, getTempFileName, openChecksumInput`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- ## 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:
      - Constant Field Values

  - ### 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:
      - Constant Field Values

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

  - ### getDirectory

    public Path getDirectory()
    Returns:
      the underlying file system directory

  - ### ensureOpen

    protected void ensureOpen() throws AlreadyClosedException
    Overrides:
      `ensureOpen` in class `FilterDirectory`
    Throws:
      `AlreadyClosedException`

  - ### useDirectIO

    protected boolean useDirectIO(String name, IOContext context, OptionalLong fileLength)
    Determines if direct IO should be used for a file. By default this tests if it is a merge context and if the merge or file length extends the minimum size (see `DEFAULT_MIN_BYTES_DIRECT`). Subclasses may override method to enforce direct IO for specific file types.
    Parameters:
      `name` - file name (unused by default implementation)
      `context` - information about merge size
      `fileLength` - if available, gives the file length. Will be empty when requesting an `IndexOutput`.
    Returns:
      `true` if direct IO should be used; `false` if input/output should be requested from delegate directory.

  - ### openInput

    public IndexInput openInput(String name, IOContext context) throws IOException
    Overrides:
      `openInput` in class `FilterDirectory`
    Throws:
      `IOException`

  - ### createOutput

    public IndexOutput createOutput(String name, IOContext context) throws IOException
    Overrides:
      `createOutput` in class `FilterDirectory`
    Throws:
      `IOException`

  - ### close

    public void close() throws IOException
    Specified by:
      `close` in interface `AutoCloseable`
    Specified by:
      `close` in interface `Closeable`
    Overrides:
      `close` in class `FilterDirectory`
    Throws:
      `IOException`