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
ADirectory
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 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 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
All Methods Instance Methods Concrete Methods 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
-
-
-
-
Field Detail
-
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 Detail
-
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. SeeDEFAULT_MIN_BYTES_DIRECT
anduseDirectIO(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 Detail
-
getDirectory
public Path getDirectory()
- Returns:
- the underlying file system directory
-
ensureOpen
protected void ensureOpen() throws AlreadyClosedException
- Overrides:
ensureOpen
in classFilterDirectory
- 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 (seeDEFAULT_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 sizefileLength
- if available, gives the file length. Will be empty when requesting anIndexOutput
.- 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 classFilterDirectory
- Throws:
IOException
-
createOutput
public IndexOutput createOutput(String name, IOContext context) throws IOException
- Overrides:
createOutput
in classFilterDirectory
- Throws:
IOException
-
close
public void close() throws IOException
- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Overrides:
close
in classFilterDirectory
- Throws:
IOException
-
-