Use clock cache

This commit is contained in:
Andrea Cavalli 2022-06-17 01:00:45 +02:00
parent afa159de67
commit 367226480b
4 changed files with 42 additions and 6 deletions

View File

@ -0,0 +1,8 @@
package it.cavallium.dbengine.database.disk;
import org.rocksdb.Cache;
public interface CacheFactory {
Cache newCache(long size);
}

View File

@ -0,0 +1,12 @@
package it.cavallium.dbengine.database.disk;
import org.rocksdb.Cache;
import org.rocksdb.ClockCache;
public class ClockCacheFactory implements CacheFactory {
@Override
public Cache newCache(long size) {
return new ClockCache(size);
}
}

View File

@ -58,6 +58,7 @@ import org.rocksdb.BlockBasedTableConfig;
import org.rocksdb.BloomFilter; import org.rocksdb.BloomFilter;
import org.rocksdb.Cache; import org.rocksdb.Cache;
import org.rocksdb.ChecksumType; import org.rocksdb.ChecksumType;
import org.rocksdb.ClockCache;
import org.rocksdb.ColumnFamilyDescriptor; import org.rocksdb.ColumnFamilyDescriptor;
import org.rocksdb.ColumnFamilyHandle; import org.rocksdb.ColumnFamilyHandle;
import org.rocksdb.ColumnFamilyOptions; import org.rocksdb.ColumnFamilyOptions;
@ -98,6 +99,10 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
private static final boolean DELETE_LOG_FILES = false; private static final boolean DELETE_LOG_FILES = false;
private static final boolean FOLLOW_ROCKSDB_OPTIMIZATIONS = true; private static final boolean FOLLOW_ROCKSDB_OPTIMIZATIONS = true;
private static final boolean USE_CLOCK_CACHE
= Boolean.parseBoolean(System.getProperty("it.cavallium.dbengine.clockcache.enable", "true"));
private static final CacheFactory CACHE_FACTORY = USE_CLOCK_CACHE ? new ClockCacheFactory() : new LRUCacheFactory();
static { static {
RocksDB.loadLibrary(); RocksDB.loadLibrary();
@ -954,11 +959,10 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
.setWalSizeLimitMB(0) .setWalSizeLimitMB(0)
.setMaxTotalWalSize(0) // automatic .setMaxTotalWalSize(0) // automatic
; ;
// DO NOT USE ClockCache! IT'S BROKEN! blockCache = CACHE_FACTORY.newCache(writeBufferManagerSize + databaseOptions.blockCache().orElse(8L * SizeUnit.MB));
blockCache = new LRUCache(writeBufferManagerSize + databaseOptions.blockCache().orElse( 8L * SizeUnit.MB));
refs.track(blockCache); refs.track(blockCache);
if (databaseOptions.compressedBlockCache().isPresent()) { if (databaseOptions.compressedBlockCache().isPresent()) {
compressedCache = new LRUCache(databaseOptions.compressedBlockCache().get()); compressedCache = CACHE_FACTORY.newCache(databaseOptions.compressedBlockCache().get());
refs.track(compressedCache); refs.track(compressedCache);
} else { } else {
compressedCache = null; compressedCache = null;
@ -991,11 +995,10 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
.setWalSizeLimitMB(0) // Auto .setWalSizeLimitMB(0) // Auto
.setMaxTotalWalSize(0) // Auto .setMaxTotalWalSize(0) // Auto
; ;
// DO NOT USE ClockCache! IT'S BROKEN! blockCache = CACHE_FACTORY.newCache(writeBufferManagerSize + databaseOptions.blockCache().orElse( 512 * SizeUnit.MB));
blockCache = new LRUCache(writeBufferManagerSize + databaseOptions.blockCache().orElse( 512 * SizeUnit.MB));
refs.track(blockCache); refs.track(blockCache);
if (databaseOptions.compressedBlockCache().isPresent()) { if (databaseOptions.compressedBlockCache().isPresent()) {
compressedCache = new LRUCache(databaseOptions.compressedBlockCache().get()); compressedCache = CACHE_FACTORY.newCache(databaseOptions.compressedBlockCache().get());
refs.track(compressedCache); refs.track(compressedCache);
} else { } else {
compressedCache = null; compressedCache = null;

View File

@ -0,0 +1,13 @@
package it.cavallium.dbengine.database.disk;
import org.rocksdb.Cache;
import org.rocksdb.ClockCache;
import org.rocksdb.LRUCache;
public class LRUCacheFactory implements CacheFactory {
@Override
public Cache newCache(long size) {
return new LRUCache(size);
}
}