2022-02-26 22:51:22 +01:00
|
|
|
package it.cavallium.dbengine.client;
|
|
|
|
|
|
|
|
import it.cavallium.dbengine.lucene.directory.RocksdbDirectory;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.nio.file.Path;
|
2022-02-28 00:40:17 +01:00
|
|
|
import java.util.Map;
|
2022-02-26 22:51:22 +01:00
|
|
|
import java.util.Optional;
|
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
import org.apache.lucene.misc.store.DirectIODirectory;
|
|
|
|
import org.apache.lucene.store.Directory;
|
|
|
|
import org.apache.lucene.store.FSDirectory;
|
|
|
|
import org.apache.lucene.util.Constants;
|
2022-02-28 00:40:17 +01:00
|
|
|
import org.rocksdb.ColumnFamilyHandle;
|
|
|
|
import org.rocksdb.RocksDB;
|
2022-02-26 22:51:22 +01:00
|
|
|
|
|
|
|
public sealed interface LuceneDirectoryOptions {
|
|
|
|
|
|
|
|
Directory createLuceneDirectory(String directoryName) throws IOException;
|
|
|
|
|
|
|
|
Optional<Path> getManagedPath();
|
|
|
|
|
2022-02-28 00:40:17 +01:00
|
|
|
boolean isStorageCompressed();
|
|
|
|
|
2022-02-26 22:51:22 +01:00
|
|
|
record ByteBuffersDirectory() implements LuceneDirectoryOptions {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Directory createLuceneDirectory(String directoryName) {
|
|
|
|
return new org.apache.lucene.store.ByteBuffersDirectory();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Optional<Path> getManagedPath() {
|
|
|
|
return Optional.empty();
|
|
|
|
}
|
2022-02-28 00:40:17 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isStorageCompressed() {
|
|
|
|
return false;
|
|
|
|
}
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
record MemoryMappedFSDirectory(Path managedPath) implements StandardFSDirectoryOptions {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public FSDirectory createLuceneDirectory(String directoryName) throws IOException {
|
|
|
|
return FSDirectory.open(managedPath.resolve(directoryName + ".lucene.db"));
|
|
|
|
}
|
2022-02-28 00:40:17 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isStorageCompressed() {
|
|
|
|
return false;
|
|
|
|
}
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
record NIOFSDirectory(Path managedPath) implements StandardFSDirectoryOptions {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public FSDirectory createLuceneDirectory(String directoryName) throws IOException {
|
|
|
|
return org.apache.lucene.store.NIOFSDirectory.open(managedPath.resolve(directoryName + ".lucene.db"));
|
|
|
|
}
|
2022-02-28 00:40:17 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isStorageCompressed() {
|
|
|
|
return false;
|
|
|
|
}
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
record DirectIOFSDirectory(StandardFSDirectoryOptions delegate, Optional<Integer> mergeBufferSize,
|
|
|
|
Optional<Long> minBytesDirect) implements LuceneDirectoryOptions {
|
|
|
|
|
|
|
|
private static final Logger logger = LogManager.getLogger(DirectIOFSDirectory.class);
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Directory createLuceneDirectory(String directoryName) throws IOException {
|
|
|
|
var delegateDirectory = delegate.createLuceneDirectory(directoryName);
|
|
|
|
if (Constants.LINUX || Constants.MAC_OS_X) {
|
|
|
|
try {
|
|
|
|
int mergeBufferSize = mergeBufferSize().orElse(DirectIODirectory.DEFAULT_MERGE_BUFFER_SIZE);
|
|
|
|
long minBytesDirect = minBytesDirect().orElse(DirectIODirectory.DEFAULT_MIN_BYTES_DIRECT);
|
|
|
|
return new DirectIODirectory(delegateDirectory, mergeBufferSize, minBytesDirect);
|
|
|
|
} catch (UnsupportedOperationException ex) {
|
|
|
|
logger.warn("Failed to open FSDirectory with DIRECT flag", ex);
|
|
|
|
return delegateDirectory;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
logger.warn("Failed to open FSDirectory with DIRECT flag because the operating system is Windows");
|
|
|
|
return delegateDirectory;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Optional<Path> getManagedPath() {
|
|
|
|
return delegate.getManagedPath();
|
|
|
|
}
|
2022-02-28 00:40:17 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isStorageCompressed() {
|
|
|
|
return delegate.isStorageCompressed();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
record RocksDBStandaloneDirectory(Path managedPath, int blockSize) implements PathDirectoryOptions {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Directory createLuceneDirectory(String directoryName) throws IOException {
|
|
|
|
return new RocksdbDirectory(managedPath.resolve(directoryName + ".lucene.db"), blockSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isStorageCompressed() {
|
|
|
|
return true;
|
|
|
|
}
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
|
|
|
|
2022-02-28 00:40:17 +01:00
|
|
|
record RocksDBSharedDirectory(RocksDB db, Map<String, ColumnFamilyHandle> handles, int blockSize) implements
|
|
|
|
LuceneDirectoryOptions {
|
2022-02-26 22:51:22 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public Directory createLuceneDirectory(String directoryName) throws IOException {
|
2022-02-28 00:40:17 +01:00
|
|
|
return new RocksdbDirectory(db, handles, directoryName, blockSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Optional<Path> getManagedPath() {
|
|
|
|
return Optional.empty();
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
2022-02-28 00:40:17 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isStorageCompressed() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
record NRTCachingDirectory(LuceneDirectoryOptions delegate, long maxMergeSizeBytes, long maxCachedBytes) implements
|
|
|
|
LuceneDirectoryOptions {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Directory createLuceneDirectory(String directoryName) throws IOException {
|
|
|
|
var delegateDirectory = delegate.createLuceneDirectory(directoryName);
|
|
|
|
return new org.apache.lucene.store.NRTCachingDirectory(delegateDirectory,
|
|
|
|
maxMergeSizeBytes / 1024D / 1024D,
|
|
|
|
maxCachedBytes / 1024D / 1024D
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Optional<Path> getManagedPath() {
|
|
|
|
return delegate.getManagedPath();
|
|
|
|
}
|
2022-02-28 00:40:17 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isStorageCompressed() {
|
|
|
|
return delegate.isStorageCompressed();
|
|
|
|
}
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sealed interface StandardFSDirectoryOptions extends PathDirectoryOptions {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
FSDirectory createLuceneDirectory(String directoryName) throws IOException;
|
|
|
|
}
|
|
|
|
|
|
|
|
sealed interface PathDirectoryOptions extends LuceneDirectoryOptions {
|
|
|
|
|
|
|
|
Path managedPath();
|
|
|
|
|
|
|
|
@Override
|
|
|
|
default Optional<Path> getManagedPath() {
|
|
|
|
return Optional.of(managedPath());
|
|
|
|
}
|
2022-02-28 00:40:17 +01:00
|
|
|
|
2022-02-26 22:51:22 +01:00
|
|
|
}
|
|
|
|
}
|