diff --git a/src/main/java/it/cavallium/dbengine/database/disk/CacheFactory.java b/src/main/java/it/cavallium/dbengine/database/disk/CacheFactory.java new file mode 100644 index 0000000..35f8daf --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/disk/CacheFactory.java @@ -0,0 +1,8 @@ +package it.cavallium.dbengine.database.disk; + +import org.rocksdb.Cache; + +public interface CacheFactory { + + Cache newCache(long size); +} diff --git a/src/main/java/it/cavallium/dbengine/database/disk/ClockCacheFactory.java b/src/main/java/it/cavallium/dbengine/database/disk/ClockCacheFactory.java new file mode 100644 index 0000000..6949452 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/disk/ClockCacheFactory.java @@ -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); + } +} diff --git a/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java b/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java index 904b8b2..39d4d81 100644 --- a/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java +++ b/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java @@ -58,6 +58,7 @@ import org.rocksdb.BlockBasedTableConfig; import org.rocksdb.BloomFilter; import org.rocksdb.Cache; import org.rocksdb.ChecksumType; +import org.rocksdb.ClockCache; import org.rocksdb.ColumnFamilyDescriptor; import org.rocksdb.ColumnFamilyHandle; 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 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 { RocksDB.loadLibrary(); @@ -954,11 +959,10 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { .setWalSizeLimitMB(0) .setMaxTotalWalSize(0) // automatic ; - // DO NOT USE ClockCache! IT'S BROKEN! - blockCache = new LRUCache(writeBufferManagerSize + databaseOptions.blockCache().orElse( 8L * SizeUnit.MB)); + blockCache = CACHE_FACTORY.newCache(writeBufferManagerSize + databaseOptions.blockCache().orElse(8L * SizeUnit.MB)); refs.track(blockCache); if (databaseOptions.compressedBlockCache().isPresent()) { - compressedCache = new LRUCache(databaseOptions.compressedBlockCache().get()); + compressedCache = CACHE_FACTORY.newCache(databaseOptions.compressedBlockCache().get()); refs.track(compressedCache); } else { compressedCache = null; @@ -991,11 +995,10 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase { .setWalSizeLimitMB(0) // Auto .setMaxTotalWalSize(0) // Auto ; - // DO NOT USE ClockCache! IT'S BROKEN! - blockCache = new LRUCache(writeBufferManagerSize + databaseOptions.blockCache().orElse( 512 * SizeUnit.MB)); + blockCache = CACHE_FACTORY.newCache(writeBufferManagerSize + databaseOptions.blockCache().orElse( 512 * SizeUnit.MB)); refs.track(blockCache); if (databaseOptions.compressedBlockCache().isPresent()) { - compressedCache = new LRUCache(databaseOptions.compressedBlockCache().get()); + compressedCache = CACHE_FACTORY.newCache(databaseOptions.compressedBlockCache().get()); refs.track(compressedCache); } else { compressedCache = null; diff --git a/src/main/java/it/cavallium/dbengine/database/disk/LRUCacheFactory.java b/src/main/java/it/cavallium/dbengine/database/disk/LRUCacheFactory.java new file mode 100644 index 0000000..e1416a1 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/disk/LRUCacheFactory.java @@ -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); + } +}