diff --git a/pom.xml b/pom.xml
index 91274a7..299fdaf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -330,7 +330,7 @@
org.rocksdb
rocksdbjni
- 7.0.3
+ 7.0.4
org.apache.lucene
diff --git a/src/main/data-generator/quic-rpc.yaml b/src/main/data-generator/quic-rpc.yaml
index 3782bc9..8f11375 100644
--- a/src/main/data-generator/quic-rpc.yaml
+++ b/src/main/data-generator/quic-rpc.yaml
@@ -235,6 +235,7 @@ versions:
memtableMemoryBudgetBytes: -long
blockCache: -long
setCacheIndexAndFilterBlocks: -boolean
+ spinning: boolean
DatabaseVolume:
data:
volumePath: Path
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 60b908e..e9458ba 100644
--- a/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java
+++ b/src/main/java/it/cavallium/dbengine/database/disk/LLLocalKeyValueDatabase.java
@@ -143,12 +143,6 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
descriptors.add(new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY));
for (Column column : columns) {
var columnOptions = new ColumnFamilyOptions();
- columnOptions.setMaxBytesForLevelBase(256 * SizeUnit.MB);
- columnOptions.setMaxBytesForLevelMultiplier(10);
- columnOptions.setLevelCompactionDynamicLevelBytes(true);
- columnOptions.setLevel0FileNumCompactionTrigger(2);
- columnOptions.setLevel0SlowdownWritesTrigger(20);
- columnOptions.setLevel0StopWritesTrigger(36);
//noinspection ConstantConditions
if (databaseOptions.memtableMemoryBudgetBytes() != null) {
@@ -158,6 +152,20 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
.orElse(databaseOptions.lowMemory() ? 16L * SizeUnit.MB : 128L * SizeUnit.MB));
}
+ // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html
+ columnOptions.setMaxBytesForLevelBase(256 * SizeUnit.MB);
+ // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html
+ columnOptions.setMaxBytesForLevelMultiplier(10);
+ // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html
+ // https://github.com/facebook/rocksdb/wiki/Tuning-RocksDB-on-Spinning-Disks
+ columnOptions.setLevelCompactionDynamicLevelBytes(true);
+ // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html
+ columnOptions.setLevel0FileNumCompactionTrigger(2);
+ // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html
+ columnOptions.setLevel0SlowdownWritesTrigger(20);
+ // https://www.arangodb.com/docs/stable/programs-arangod-rocksdb.html
+ columnOptions.setLevel0StopWritesTrigger(36);
+
if (!databaseOptions.levels().isEmpty()) {
var firstLevelOptions = getRocksLevelOptions(databaseOptions.levels().get(0));
columnOptions.setCompressionType(firstLevelOptions.compressionType);
@@ -198,11 +206,16 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
tableOptions.setOptimizeFiltersForMemory(true);
tableOptions.setVerifyCompression(false);
}
+ boolean cacheIndexAndFilterBlocks = databaseOptions.setCacheIndexAndFilterBlocks().orElse(true);
+ if (databaseOptions.spinning()) {
+ // https://github.com/facebook/rocksdb/wiki/Tuning-RocksDB-on-Spinning-Disks
+ cacheIndexAndFilterBlocks = true;
+ }
tableOptions
.setPinTopLevelIndexAndFilter(true)
.setPinL0FilterAndIndexBlocksInCache(true)
.setCacheIndexAndFilterBlocksWithHighPriority(true)
- .setCacheIndexAndFilterBlocks(databaseOptions.setCacheIndexAndFilterBlocks().orElse(true))
+ .setCacheIndexAndFilterBlocks(cacheIndexAndFilterBlocks)
.setPartitionFilters(true)
.setIndexType(IndexType.kTwoLevelIndexSearch)
.setFormatVersion(5)
@@ -211,11 +224,11 @@ public class LLLocalKeyValueDatabase implements LLKeyValueDatabase {
.setBlockCacheCompressed(optionsWithCache.compressedCache())
.setBlockCache(optionsWithCache.standardCache())
// Spinning disks: 64KiB to 256KiB (also 512KiB). SSDs: 16KiB
- .setBlockSize(256 * 1024);
+ // https://github.com/facebook/rocksdb/wiki/Tuning-RocksDB-on-Spinning-Disks
+ .setBlockSize((databaseOptions.spinning() ? 256 : 16) * SizeUnit.KB);
- //columnOptions.setLevelCompactionDynamicLevelBytes(true);
columnOptions.setTableFormatConfig(tableOptions);
- columnOptions.setCompactionPriority(CompactionPriority.OldestSmallestSeqFirst);
+ columnOptions.setCompactionPriority(CompactionPriority.MinOverlappingRatio);
descriptors.add(new ColumnFamilyDescriptor(column.name().getBytes(StandardCharsets.US_ASCII), columnOptions));
}
diff --git a/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java b/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java
index 20ecaa3..5efc24f 100644
--- a/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java
+++ b/src/test/java/it/cavallium/dbengine/LocalTemporaryDbGenerator.java
@@ -96,7 +96,8 @@ public class LocalTemporaryDbGenerator implements TemporaryDbGenerator {
Nullableint.of(-1),
Nullablelong.empty(),
Nullablelong.empty(),
- Nullableboolean.empty()
+ Nullableboolean.empty(),
+ false
)
),
conn.getLuceneIndex("testluceneindex1",
diff --git a/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java b/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java
index 5df3755..dc28c21 100644
--- a/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java
+++ b/src/test/java/it/cavallium/dbengine/MemoryTemporaryDbGenerator.java
@@ -67,7 +67,8 @@ public class MemoryTemporaryDbGenerator implements TemporaryDbGenerator {
Nullableint.of(-1),
Nullablelong.empty(),
Nullablelong.empty(),
- Nullableboolean.empty()
+ Nullableboolean.empty(),
+ false
)
),
conn.getLuceneIndex("testluceneindex1",