|
34 | 34 | import org.apache.lucene.index.VectorSimilarityFunction; |
35 | 35 | import org.apache.lucene.store.Directory; |
36 | 36 | import org.apache.lucene.store.FSDirectory; |
37 | | -import org.apache.lucene.store.IOContext; |
38 | | -import org.apache.lucene.store.IndexInput; |
39 | 37 | import org.apache.lucene.store.MMapDirectory; |
40 | | -import org.apache.lucene.store.NIOFSDirectory; |
41 | 38 | import org.apache.lucene.store.NativeFSLockFactory; |
42 | 39 | import org.apache.lucene.util.PrintStreamInfoStream; |
43 | 40 | import org.elasticsearch.common.io.Channels; |
44 | | -import org.elasticsearch.core.IOUtils; |
45 | | -import org.elasticsearch.index.store.LuceneFilesExtensions; |
46 | | -import org.elasticsearch.index.store.Store; |
| 41 | +import org.elasticsearch.index.store.FsDirectoryFactory; |
47 | 42 |
|
48 | 43 | import java.io.IOException; |
49 | 44 | import java.io.UncheckedIOException; |
@@ -233,7 +228,7 @@ public boolean isEnabled(String component) { |
233 | 228 | static Directory getDirectory(Path indexPath) throws IOException { |
234 | 229 | Directory dir = FSDirectory.open(indexPath); |
235 | 230 | if (dir instanceof MMapDirectory mmapDir) { |
236 | | - return new HybridDirectory(mmapDir); |
| 231 | + return new FsDirectoryFactory.HybridDirectory(NativeFSLockFactory.INSTANCE, mmapDir, 64); |
237 | 232 | } |
238 | 233 | return dir; |
239 | 234 | } |
@@ -375,64 +370,4 @@ synchronized void next(byte[] dest) throws IOException { |
375 | 370 | bytes.get(dest); |
376 | 371 | } |
377 | 372 | } |
378 | | - |
379 | | - // Copy of Elastic's HybridDirectory which extends NIOFSDirectory and uses MMapDirectory for certain files. |
380 | | - static final class HybridDirectory extends NIOFSDirectory { |
381 | | - private final MMapDirectory delegate; |
382 | | - |
383 | | - HybridDirectory(MMapDirectory delegate) throws IOException { |
384 | | - super(delegate.getDirectory(), NativeFSLockFactory.INSTANCE); |
385 | | - this.delegate = delegate; |
386 | | - } |
387 | | - |
388 | | - @Override |
389 | | - public IndexInput openInput(String name, IOContext context) throws IOException { |
390 | | - if (useDelegate(name, context)) { |
391 | | - // we need to do these checks on the outer directory since the inner doesn't know about pending deletes |
392 | | - ensureOpen(); |
393 | | - ensureCanRead(name); |
394 | | - // we switch the context here since mmap checks for the READONCE context by identity |
395 | | - context = context == Store.READONCE_CHECKSUM ? IOContext.READONCE : context; |
396 | | - // we only use the mmap to open inputs. Everything else is managed by the NIOFSDirectory otherwise |
397 | | - // we might run into trouble with files that are pendingDelete in one directory but still |
398 | | - // listed in listAll() from the other. We on the other hand don't want to list files from both dirs |
399 | | - // and intersect for perf reasons. |
400 | | - return delegate.openInput(name, context); |
401 | | - } else { |
402 | | - return super.openInput(name, context); |
403 | | - } |
404 | | - } |
405 | | - |
406 | | - @Override |
407 | | - public void close() throws IOException { |
408 | | - IOUtils.close(super::close, delegate); |
409 | | - } |
410 | | - |
411 | | - private static String getExtension(String name) { |
412 | | - // Unlike FileSwitchDirectory#getExtension, we treat `tmp` as a normal file extension, which can have its own rules for mmaping. |
413 | | - final int lastDotIndex = name.lastIndexOf('.'); |
414 | | - if (lastDotIndex == -1) { |
415 | | - return ""; |
416 | | - } else { |
417 | | - return name.substring(lastDotIndex + 1); |
418 | | - } |
419 | | - } |
420 | | - |
421 | | - static boolean useDelegate(String name, IOContext ioContext) { |
422 | | - if (ioContext == Store.READONCE_CHECKSUM) { |
423 | | - // If we're just reading the footer for the checksum then mmap() isn't really necessary, and it's desperately inefficient |
424 | | - // if pre-loading is enabled on this file. |
425 | | - return false; |
426 | | - } |
427 | | - |
428 | | - final LuceneFilesExtensions extension = LuceneFilesExtensions.fromExtension(getExtension(name)); |
429 | | - if (extension == null || extension.shouldMmap() == false) { |
430 | | - // Other files are either less performance-sensitive (e.g. stored field index, norms metadata) |
431 | | - // or are large and have a random access pattern and mmap leads to page cache trashing |
432 | | - // (e.g. stored fields and term vectors). |
433 | | - return false; |
434 | | - } |
435 | | - return true; |
436 | | - } |
437 | | - } |
438 | 373 | } |
0 commit comments