|
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