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
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
Modifier and TypeFieldDescriptionstatic final int
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 expected merge size before direct IO is used (10 MB):Fields inherited from class org.apache.lucene.store.FilterDirectory
in
-
Constructor Summary
ConstructorDescriptionDirectIODirectory
(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 TypeMethodDescriptionvoid
close()
createOutput
(String name, IOContext context) protected void
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 Details
-
DEFAULT_MERGE_BUFFER_SIZE
public static final int DEFAULT_MERGE_BUFFER_SIZEDefault 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_DIRECTDefault min expected merge size before direct IO is used (10 MB):- See Also:
-
-
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. 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
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
- Returns:
- the underlying file system directory
-
ensureOpen
- Overrides:
ensureOpen
in classFilterDirectory
- Throws:
AlreadyClosedException
-
useDirectIO
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
- Overrides:
openInput
in classFilterDirectory
- Throws:
IOException
-
createOutput
- Overrides:
createOutput
in classFilterDirectory
- Throws:
IOException
-
close
- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Overrides:
close
in classFilterDirectory
- Throws:
IOException
-