@nxtedition/rocksdb 7.0.22 → 7.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/binding.cc +9 -4
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +5 -0
  3. package/deps/rocksdb/rocksdb/Makefile +6 -2
  4. package/deps/rocksdb/rocksdb/TARGETS +14 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +4 -1
  6. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +20 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +2 -2
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +44 -31
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +491 -722
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +468 -2
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -1
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +51 -52
  13. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +28 -16
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +12 -1
  15. package/deps/rocksdb/rocksdb/cache/lru_cache.h +1 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +170 -36
  17. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +63 -36
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +4 -6
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +57 -38
  21. package/deps/rocksdb/rocksdb/db/blob/blob_read_request.h +58 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +164 -74
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +42 -29
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +419 -62
  25. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +208 -8
  26. package/deps/rocksdb/rocksdb/db/c.cc +68 -0
  27. package/deps/rocksdb/rocksdb/db/c_test.c +95 -2
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +12 -3
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +92 -15
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +76 -4
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +52 -1
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +30 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +126 -0
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +203 -1584
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +93 -26
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +87 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +314 -0
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +328 -0
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -6
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +4 -1
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +7 -3
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +174 -33
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +474 -7
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -2
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +825 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +46 -0
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +42 -0
  48. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +223 -0
  49. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +255 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +1253 -0
  51. package/deps/rocksdb/rocksdb/db/corruption_test.cc +32 -8
  52. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3 -1
  53. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -8
  54. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +376 -0
  55. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +103 -78
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +4 -6
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +0 -8
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +10 -3
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +21 -6
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +19 -1
  61. package/deps/rocksdb/rocksdb/db/db_iter.cc +91 -14
  62. package/deps/rocksdb/rocksdb/db/db_iter.h +5 -0
  63. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +33 -0
  64. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +79 -0
  65. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +2 -0
  66. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  67. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +5 -2
  68. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +185 -0
  69. package/deps/rocksdb/rocksdb/db/dbformat.cc +1 -4
  70. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -8
  71. package/deps/rocksdb/rocksdb/db/internal_stats.cc +71 -29
  72. package/deps/rocksdb/rocksdb/db/internal_stats.h +160 -5
  73. package/deps/rocksdb/rocksdb/db/log_reader.cc +29 -3
  74. package/deps/rocksdb/rocksdb/db/log_reader.h +12 -3
  75. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -3
  76. package/deps/rocksdb/rocksdb/db/version_edit.cc +6 -0
  77. package/deps/rocksdb/rocksdb/db/version_set.cc +93 -129
  78. package/deps/rocksdb/rocksdb/db/version_set.h +4 -4
  79. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -2
  80. package/deps/rocksdb/rocksdb/db/version_set_test.cc +42 -35
  81. package/deps/rocksdb/rocksdb/db/write_batch.cc +10 -2
  82. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +4 -1
  83. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +10 -4
  84. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -3
  85. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -2
  86. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  87. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +5 -1
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +140 -8
  89. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +12 -0
  90. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +46 -7
  91. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +7 -0
  92. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +27 -7
  93. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +8 -0
  94. package/deps/rocksdb/rocksdb/env/env_posix.cc +14 -0
  95. package/deps/rocksdb/rocksdb/env/env_test.cc +130 -1
  96. package/deps/rocksdb/rocksdb/env/fs_posix.cc +7 -1
  97. package/deps/rocksdb/rocksdb/env/io_posix.cc +18 -50
  98. package/deps/rocksdb/rocksdb/env/io_posix.h +53 -6
  99. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +8 -10
  100. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +3 -7
  101. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +239 -259
  102. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +84 -19
  103. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +24 -4
  104. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +1 -1
  105. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +31 -1
  106. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +11 -7
  107. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +2 -0
  108. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +14 -0
  109. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +20 -0
  110. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +37 -13
  111. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +7 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +14 -0
  113. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +9 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +13 -13
  115. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -2
  116. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +38 -0
  117. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +7 -1
  118. package/deps/rocksdb/rocksdb/port/win/env_win.cc +17 -0
  119. package/deps/rocksdb/rocksdb/port/win/env_win.h +8 -0
  120. package/deps/rocksdb/rocksdb/port/win/io_win.cc +6 -3
  121. package/deps/rocksdb/rocksdb/prebuilds/linux-x64/node.napi.node +0 -0
  122. package/deps/rocksdb/rocksdb/src.mk +5 -0
  123. package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -2
  124. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
  125. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +5 -2
  126. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +1 -1
  127. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +15 -12
  128. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +5 -4
  129. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  130. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1 -1
  131. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -4
  132. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +1 -2
  133. package/deps/rocksdb/rocksdb/table/get_context.cc +1 -0
  134. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -2
  135. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +24 -4
  136. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  137. package/deps/rocksdb/rocksdb/util/compression.h +2 -0
  138. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +18 -1
  139. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +67 -4
  140. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +8 -0
  141. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +15 -12
  142. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -2
  143. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +1 -1
  144. package/deps/rocksdb/rocksdb.gyp +5 -1
  145. package/package.json +1 -1
  146. package/prebuilds/darwin-arm64/node.napi.node +0 -0
@@ -12,6 +12,7 @@
12
12
  #include "db/compaction/compaction_picker_level.h"
13
13
  #include "db/compaction/compaction_picker_universal.h"
14
14
  #include "db/compaction/file_pri.h"
15
+ #include "rocksdb/advanced_options.h"
15
16
  #include "table/unique_id_impl.h"
16
17
  #include "test_util/testharness.h"
17
18
  #include "test_util/testutil.h"
@@ -429,8 +430,7 @@ TEST_F(CompactionPickerTest, LevelTriggerDynamic4) {
429
430
  #ifndef ROCKSDB_LITE
430
431
  TEST_F(CompactionPickerTest, NeedsCompactionUniversal) {
431
432
  NewVersionStorage(1, kCompactionStyleUniversal);
432
- UniversalCompactionPicker universal_compaction_picker(
433
- ioptions_, &icmp_);
433
+ UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
434
434
  UpdateVersionStorageInfo();
435
435
  // must return false when there's no files.
436
436
  ASSERT_EQ(universal_compaction_picker.NeedsCompaction(vstorage_.get()),
@@ -2249,6 +2249,92 @@ TEST_F(CompactionPickerTest, IsTrivialMoveOn) {
2249
2249
  ASSERT_TRUE(compaction->IsTrivialMove());
2250
2250
  }
2251
2251
 
2252
+ TEST_F(CompactionPickerTest, L0TrivialMove1) {
2253
+ mutable_cf_options_.max_bytes_for_level_base = 10000000u;
2254
+ mutable_cf_options_.level0_file_num_compaction_trigger = 4;
2255
+ mutable_cf_options_.max_compaction_bytes = 10000000u;
2256
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2257
+ NewVersionStorage(6, kCompactionStyleLevel);
2258
+
2259
+ Add(0, 1U, "100", "150", 3000U, 0, 710, 800);
2260
+ Add(0, 2U, "151", "200", 3001U, 0, 610, 700);
2261
+ Add(0, 3U, "301", "350", 3000U, 0, 510, 600);
2262
+ Add(0, 4U, "451", "400", 3000U, 0, 410, 500);
2263
+
2264
+ Add(1, 5U, "120", "130", 7000U);
2265
+ Add(1, 6U, "170", "180", 7000U);
2266
+ Add(1, 7U, "220", "230", 7000U);
2267
+ Add(1, 8U, "270", "280", 7000U);
2268
+ UpdateVersionStorageInfo();
2269
+
2270
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2271
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2272
+ &log_buffer_));
2273
+ ASSERT_TRUE(compaction.get() != nullptr);
2274
+ ASSERT_EQ(1, compaction->num_input_levels());
2275
+ ASSERT_EQ(2, compaction->num_input_files(0));
2276
+ ASSERT_EQ(3, compaction->input(0, 0)->fd.GetNumber());
2277
+ ASSERT_EQ(4, compaction->input(0, 1)->fd.GetNumber());
2278
+ ASSERT_TRUE(compaction->IsTrivialMove());
2279
+ }
2280
+
2281
+ TEST_F(CompactionPickerTest, L0TrivialMoveOneFile) {
2282
+ mutable_cf_options_.max_bytes_for_level_base = 10000000u;
2283
+ mutable_cf_options_.level0_file_num_compaction_trigger = 4;
2284
+ mutable_cf_options_.max_compaction_bytes = 10000000u;
2285
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2286
+ NewVersionStorage(6, kCompactionStyleLevel);
2287
+
2288
+ Add(0, 1U, "100", "150", 3000U, 0, 710, 800);
2289
+ Add(0, 2U, "551", "600", 3001U, 0, 610, 700);
2290
+ Add(0, 3U, "101", "150", 3000U, 0, 510, 600);
2291
+ Add(0, 4U, "451", "400", 3000U, 0, 410, 500);
2292
+
2293
+ Add(1, 5U, "120", "130", 7000U);
2294
+ Add(1, 6U, "170", "180", 7000U);
2295
+ Add(1, 7U, "220", "230", 7000U);
2296
+ Add(1, 8U, "270", "280", 7000U);
2297
+ UpdateVersionStorageInfo();
2298
+
2299
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2300
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2301
+ &log_buffer_));
2302
+ ASSERT_TRUE(compaction.get() != nullptr);
2303
+ ASSERT_EQ(1, compaction->num_input_levels());
2304
+ ASSERT_EQ(1, compaction->num_input_files(0));
2305
+ ASSERT_EQ(4, compaction->input(0, 0)->fd.GetNumber());
2306
+ ASSERT_TRUE(compaction->IsTrivialMove());
2307
+ }
2308
+
2309
+ TEST_F(CompactionPickerTest, L0TrivialMoveWholeL0) {
2310
+ mutable_cf_options_.max_bytes_for_level_base = 10000000u;
2311
+ mutable_cf_options_.level0_file_num_compaction_trigger = 4;
2312
+ mutable_cf_options_.max_compaction_bytes = 10000000u;
2313
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2314
+ NewVersionStorage(6, kCompactionStyleLevel);
2315
+
2316
+ Add(0, 1U, "300", "350", 3000U, 0, 710, 800);
2317
+ Add(0, 2U, "651", "600", 3001U, 0, 610, 700);
2318
+ Add(0, 3U, "501", "550", 3000U, 0, 510, 600);
2319
+ Add(0, 4U, "451", "400", 3000U, 0, 410, 500);
2320
+
2321
+ Add(1, 5U, "120", "130", 7000U);
2322
+ Add(1, 6U, "970", "980", 7000U);
2323
+ UpdateVersionStorageInfo();
2324
+
2325
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2326
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2327
+ &log_buffer_));
2328
+ ASSERT_TRUE(compaction.get() != nullptr);
2329
+ ASSERT_EQ(1, compaction->num_input_levels());
2330
+ ASSERT_EQ(4, compaction->num_input_files(0));
2331
+ ASSERT_EQ(1, compaction->input(0, 0)->fd.GetNumber());
2332
+ ASSERT_EQ(4, compaction->input(0, 1)->fd.GetNumber());
2333
+ ASSERT_EQ(3, compaction->input(0, 2)->fd.GetNumber());
2334
+ ASSERT_EQ(2, compaction->input(0, 3)->fd.GetNumber());
2335
+ ASSERT_TRUE(compaction->IsTrivialMove());
2336
+ }
2337
+
2252
2338
  TEST_F(CompactionPickerTest, IsTrivialMoveOffSstPartitioned) {
2253
2339
  mutable_cf_options_.max_bytes_for_level_base = 10000u;
2254
2340
  mutable_cf_options_.max_compaction_bytes = 10001u;
@@ -2297,6 +2383,197 @@ TEST_F(CompactionPickerTest, IsTrivialMoveOff) {
2297
2383
  ASSERT_FALSE(compaction->IsTrivialMove());
2298
2384
  }
2299
2385
 
2386
+ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles1) {
2387
+ mutable_cf_options_.max_bytes_for_level_base = 1000u;
2388
+ mutable_cf_options_.max_compaction_bytes = 10000001u;
2389
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2390
+ ioptions_.compaction_pri = kMinOverlappingRatio;
2391
+ NewVersionStorage(6, kCompactionStyleLevel);
2392
+
2393
+ Add(2, 1U, "100", "150", 3000U);
2394
+ Add(2, 2U, "151", "200", 3001U);
2395
+ Add(2, 3U, "301", "350", 3000U);
2396
+ Add(2, 4U, "451", "400", 3000U);
2397
+ Add(2, 5U, "551", "500", 3000U);
2398
+ Add(2, 6U, "651", "600", 3000U);
2399
+ Add(2, 7U, "751", "700", 3000U);
2400
+ Add(2, 8U, "851", "900", 3000U);
2401
+
2402
+ Add(3, 15U, "120", "130", 700U);
2403
+ Add(3, 16U, "170", "180", 700U);
2404
+ Add(3, 17U, "220", "230", 700U);
2405
+ Add(3, 18U, "870", "880", 700U);
2406
+ UpdateVersionStorageInfo();
2407
+
2408
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2409
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2410
+ &log_buffer_));
2411
+ ASSERT_TRUE(compaction.get() != nullptr);
2412
+ ASSERT_TRUE(compaction->IsTrivialMove());
2413
+ ASSERT_EQ(1, compaction->num_input_levels());
2414
+ ASSERT_EQ(4, compaction->num_input_files(0));
2415
+ ASSERT_EQ(3, compaction->input(0, 0)->fd.GetNumber());
2416
+ ASSERT_EQ(4, compaction->input(0, 1)->fd.GetNumber());
2417
+ ASSERT_EQ(5, compaction->input(0, 2)->fd.GetNumber());
2418
+ ASSERT_EQ(6, compaction->input(0, 3)->fd.GetNumber());
2419
+ }
2420
+
2421
+ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles2) {
2422
+ mutable_cf_options_.max_bytes_for_level_base = 1000u;
2423
+ mutable_cf_options_.max_compaction_bytes = 10000001u;
2424
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2425
+ ioptions_.compaction_pri = kMinOverlappingRatio;
2426
+ NewVersionStorage(6, kCompactionStyleLevel);
2427
+
2428
+ Add(2, 1U, "100", "150", 3000U);
2429
+ Add(2, 2U, "151", "160", 3001U);
2430
+ Add(2, 3U, "161", "179", 3000U);
2431
+ Add(2, 4U, "220", "400", 3000U);
2432
+ Add(2, 5U, "551", "500", 3000U);
2433
+ Add(2, 6U, "651", "600", 3000U);
2434
+ Add(2, 7U, "751", "700", 3000U);
2435
+ Add(2, 8U, "851", "900", 3000U);
2436
+
2437
+ Add(3, 15U, "120", "130", 700U);
2438
+ Add(3, 17U, "220", "230", 700U);
2439
+ Add(3, 18U, "870", "880", 700U);
2440
+ UpdateVersionStorageInfo();
2441
+
2442
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2443
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2444
+ &log_buffer_));
2445
+ ASSERT_TRUE(compaction.get() != nullptr);
2446
+ ASSERT_TRUE(compaction->IsTrivialMove());
2447
+ ASSERT_EQ(1, compaction->num_input_levels());
2448
+ ASSERT_EQ(2, compaction->num_input_files(0));
2449
+ ASSERT_EQ(2, compaction->input(0, 0)->fd.GetNumber());
2450
+ ASSERT_EQ(3, compaction->input(0, 1)->fd.GetNumber());
2451
+ }
2452
+
2453
+ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles3) {
2454
+ mutable_cf_options_.max_bytes_for_level_base = 1000u;
2455
+ mutable_cf_options_.max_compaction_bytes = 10000001u;
2456
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2457
+ ioptions_.compaction_pri = kMinOverlappingRatio;
2458
+ NewVersionStorage(6, kCompactionStyleLevel);
2459
+
2460
+ // Even if consecutive files can be trivial moved, we don't pick them
2461
+ // since in case trivial move can't be issued for a reason, we cannot
2462
+ // fall back to normal compactions.
2463
+ Add(2, 1U, "100", "150", 3000U);
2464
+ Add(2, 2U, "151", "160", 3001U);
2465
+ Add(2, 5U, "551", "500", 3000U);
2466
+ Add(2, 6U, "651", "600", 3000U);
2467
+ Add(2, 7U, "751", "700", 3000U);
2468
+ Add(2, 8U, "851", "900", 3000U);
2469
+
2470
+ Add(3, 15U, "120", "130", 700U);
2471
+ Add(3, 17U, "220", "230", 700U);
2472
+ Add(3, 18U, "870", "880", 700U);
2473
+ UpdateVersionStorageInfo();
2474
+
2475
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2476
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2477
+ &log_buffer_));
2478
+ ASSERT_TRUE(compaction.get() != nullptr);
2479
+ ASSERT_TRUE(compaction->IsTrivialMove());
2480
+ ASSERT_EQ(1, compaction->num_input_levels());
2481
+ ASSERT_EQ(1, compaction->num_input_files(0));
2482
+ ASSERT_EQ(2, compaction->input(0, 0)->fd.GetNumber());
2483
+ }
2484
+
2485
+ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles4) {
2486
+ mutable_cf_options_.max_bytes_for_level_base = 1000u;
2487
+ mutable_cf_options_.max_compaction_bytes = 10000001u;
2488
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2489
+ ioptions_.compaction_pri = kMinOverlappingRatio;
2490
+ NewVersionStorage(6, kCompactionStyleLevel);
2491
+
2492
+ Add(2, 1U, "100", "150", 4000U);
2493
+ Add(2, 2U, "151", "160", 4001U);
2494
+ Add(2, 3U, "161", "179", 4000U);
2495
+
2496
+ Add(3, 15U, "120", "130", 700U);
2497
+ Add(3, 17U, "220", "230", 700U);
2498
+ Add(3, 18U, "870", "880", 700U);
2499
+ UpdateVersionStorageInfo();
2500
+
2501
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2502
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2503
+ &log_buffer_));
2504
+ ASSERT_TRUE(compaction.get() != nullptr);
2505
+ ASSERT_TRUE(compaction->IsTrivialMove());
2506
+ ASSERT_EQ(1, compaction->num_input_levels());
2507
+ ASSERT_EQ(2, compaction->num_input_files(0));
2508
+ ASSERT_EQ(2, compaction->input(0, 0)->fd.GetNumber());
2509
+ ASSERT_EQ(3, compaction->input(0, 1)->fd.GetNumber());
2510
+ }
2511
+
2512
+ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles5) {
2513
+ mutable_cf_options_.max_bytes_for_level_base = 1000u;
2514
+ mutable_cf_options_.max_compaction_bytes = 10000001u;
2515
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2516
+ ioptions_.compaction_pri = kMinOverlappingRatio;
2517
+ NewVersionStorage(6, kCompactionStyleLevel);
2518
+
2519
+ // File 4 and 5 aren't clean cut, so only 2 and 3 are picked.
2520
+ Add(2, 1U, "100", "150", 4000U);
2521
+ Add(2, 2U, "151", "160", 4001U);
2522
+ Add(2, 3U, "161", "179", 4000U);
2523
+ Add(2, 4U, "180", "185", 4000U);
2524
+ Add(2, 5U, "185", "190", 4000U);
2525
+
2526
+ Add(3, 15U, "120", "130", 700U);
2527
+ Add(3, 17U, "220", "230", 700U);
2528
+ Add(3, 18U, "870", "880", 700U);
2529
+ UpdateVersionStorageInfo();
2530
+
2531
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2532
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2533
+ &log_buffer_));
2534
+ ASSERT_TRUE(compaction.get() != nullptr);
2535
+ ASSERT_TRUE(compaction->IsTrivialMove());
2536
+ ASSERT_EQ(1, compaction->num_input_levels());
2537
+ ASSERT_EQ(2, compaction->num_input_files(0));
2538
+ ASSERT_EQ(2, compaction->input(0, 0)->fd.GetNumber());
2539
+ ASSERT_EQ(3, compaction->input(0, 1)->fd.GetNumber());
2540
+ }
2541
+
2542
+ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles6) {
2543
+ mutable_cf_options_.max_bytes_for_level_base = 1000u;
2544
+ mutable_cf_options_.max_compaction_bytes = 10000001u;
2545
+ ioptions_.level_compaction_dynamic_level_bytes = false;
2546
+ ioptions_.compaction_pri = kMinOverlappingRatio;
2547
+ NewVersionStorage(6, kCompactionStyleLevel);
2548
+
2549
+ Add(2, 1U, "100", "150", 3000U);
2550
+ Add(2, 2U, "151", "200", 3001U);
2551
+ Add(2, 3U, "301", "350", 3000U);
2552
+ Add(2, 4U, "451", "400", 3000U);
2553
+ Add(2, 5U, "551", "500", 3000U);
2554
+ file_map_[5U].first->being_compacted = true;
2555
+ Add(2, 6U, "651", "600", 3000U);
2556
+ Add(2, 7U, "751", "700", 3000U);
2557
+ Add(2, 8U, "851", "900", 3000U);
2558
+
2559
+ Add(3, 15U, "120", "130", 700U);
2560
+ Add(3, 16U, "170", "180", 700U);
2561
+ Add(3, 17U, "220", "230", 700U);
2562
+ Add(3, 18U, "870", "880", 700U);
2563
+ UpdateVersionStorageInfo();
2564
+
2565
+ std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2566
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2567
+ &log_buffer_));
2568
+ ASSERT_TRUE(compaction.get() != nullptr);
2569
+ ASSERT_TRUE(compaction->IsTrivialMove());
2570
+ ASSERT_EQ(1, compaction->num_input_levels());
2571
+ // Since the next file is being compacted. Stopping at 3 and 4.
2572
+ ASSERT_EQ(2, compaction->num_input_files(0));
2573
+ ASSERT_EQ(3, compaction->input(0, 0)->fd.GetNumber());
2574
+ ASSERT_EQ(4, compaction->input(0, 1)->fd.GetNumber());
2575
+ }
2576
+
2300
2577
  TEST_F(CompactionPickerTest, CacheNextCompactionIndex) {
2301
2578
  NewVersionStorage(6, kCompactionStyleLevel);
2302
2579
  mutable_cf_options_.max_compaction_bytes = 100000000000u;
@@ -2311,7 +2588,11 @@ TEST_F(CompactionPickerTest, CacheNextCompactionIndex) {
2311
2588
  Add(1 /* level */, 4U /* file_number */, "250" /* smallest */,
2312
2589
  "299" /* largest */, 700000000U /* file_size */);
2313
2590
  Add(2 /* level */, 5U /* file_number */, "150" /* smallest */,
2314
- "199" /* largest */, 1U /* file_size */);
2591
+ "199" /* largest */, 100U /* file_size */);
2592
+ Add(2 /* level */, 6U /* file_number */, "200" /* smallest */,
2593
+ "240" /* largest */, 1U /* file_size */);
2594
+ Add(2 /* level */, 7U /* file_number */, "260" /* smallest */,
2595
+ "270" /* largest */, 1U /* file_size */);
2315
2596
  file_map_[5U].first->being_compacted = true;
2316
2597
 
2317
2598
  UpdateVersionStorageInfo();
@@ -2320,9 +2601,9 @@ TEST_F(CompactionPickerTest, CacheNextCompactionIndex) {
2320
2601
  cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2321
2602
  &log_buffer_));
2322
2603
  ASSERT_TRUE(compaction.get() != nullptr);
2323
- ASSERT_EQ(1U, compaction->num_input_levels());
2604
+ ASSERT_EQ(2U, compaction->num_input_levels());
2324
2605
  ASSERT_EQ(1U, compaction->num_input_files(0));
2325
- ASSERT_EQ(0U, compaction->num_input_files(1));
2606
+ ASSERT_EQ(1U, compaction->num_input_files(1));
2326
2607
  ASSERT_EQ(3U, compaction->input(0, 0)->fd.GetNumber());
2327
2608
  ASSERT_EQ(2, vstorage_->NextCompactionIndex(1 /* level */));
2328
2609
 
@@ -2330,9 +2611,9 @@ TEST_F(CompactionPickerTest, CacheNextCompactionIndex) {
2330
2611
  cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2331
2612
  &log_buffer_));
2332
2613
  ASSERT_TRUE(compaction.get() != nullptr);
2333
- ASSERT_EQ(1U, compaction->num_input_levels());
2614
+ ASSERT_EQ(2U, compaction->num_input_levels());
2334
2615
  ASSERT_EQ(1U, compaction->num_input_files(0));
2335
- ASSERT_EQ(0U, compaction->num_input_files(1));
2616
+ ASSERT_EQ(1U, compaction->num_input_files(1));
2336
2617
  ASSERT_EQ(4U, compaction->input(0, 0)->fd.GetNumber());
2337
2618
  ASSERT_EQ(3, vstorage_->NextCompactionIndex(1 /* level */));
2338
2619
 
@@ -2766,6 +3047,192 @@ TEST_F(CompactionPickerTest, UniversalMarkedManualCompaction) {
2766
3047
  ASSERT_EQ(0U, vstorage_->FilesMarkedForCompaction().size());
2767
3048
  }
2768
3049
 
3050
+ class PerKeyPlacementCompactionPickerTest
3051
+ : public CompactionPickerTest,
3052
+ public testing::WithParamInterface<bool> {
3053
+ public:
3054
+ PerKeyPlacementCompactionPickerTest() : CompactionPickerTest() {}
3055
+
3056
+ void SetUp() override { enable_per_key_placement_ = GetParam(); }
3057
+
3058
+ protected:
3059
+ bool enable_per_key_placement_ = false;
3060
+ };
3061
+
3062
+ TEST_P(PerKeyPlacementCompactionPickerTest, OverlapWithNormalCompaction) {
3063
+ SyncPoint::GetInstance()->SetCallBack(
3064
+ "Compaction::SupportsPerKeyPlacement:Enabled", [&](void* arg) {
3065
+ auto supports_per_key_placement = static_cast<bool*>(arg);
3066
+ *supports_per_key_placement = enable_per_key_placement_;
3067
+ });
3068
+ SyncPoint::GetInstance()->EnableProcessing();
3069
+
3070
+ int num_levels = ioptions_.num_levels;
3071
+ NewVersionStorage(num_levels, kCompactionStyleLevel);
3072
+
3073
+ Add(0, 21U, "100", "150", 60000000U);
3074
+ Add(0, 22U, "300", "350", 60000000U);
3075
+ Add(5, 40U, "200", "250", 60000000U);
3076
+ Add(6, 50U, "101", "351", 60000000U);
3077
+ UpdateVersionStorageInfo();
3078
+
3079
+ CompactionOptions comp_options;
3080
+ std::unordered_set<uint64_t> input_set;
3081
+ input_set.insert(40);
3082
+ std::vector<CompactionInputFiles> input_files;
3083
+ ASSERT_OK(level_compaction_picker.GetCompactionInputsFromFileNumbers(
3084
+ &input_files, &input_set, vstorage_.get(), comp_options));
3085
+
3086
+ std::unique_ptr<Compaction> comp1(level_compaction_picker.CompactFiles(
3087
+ comp_options, input_files, 5, vstorage_.get(), mutable_cf_options_,
3088
+ mutable_db_options_, 0));
3089
+
3090
+ input_set.clear();
3091
+ input_files.clear();
3092
+ input_set.insert(21);
3093
+ input_set.insert(22);
3094
+ input_set.insert(50);
3095
+ ASSERT_OK(level_compaction_picker.GetCompactionInputsFromFileNumbers(
3096
+ &input_files, &input_set, vstorage_.get(), comp_options));
3097
+
3098
+ ASSERT_EQ(
3099
+ enable_per_key_placement_,
3100
+ level_compaction_picker.FilesRangeOverlapWithCompaction(input_files, 6));
3101
+ }
3102
+
3103
+ TEST_P(PerKeyPlacementCompactionPickerTest, NormalCompactionOverlap) {
3104
+ SyncPoint::GetInstance()->SetCallBack(
3105
+ "Compaction::SupportsPerKeyPlacement:Enabled", [&](void* arg) {
3106
+ auto supports_per_key_placement = static_cast<bool*>(arg);
3107
+ *supports_per_key_placement = enable_per_key_placement_;
3108
+ });
3109
+ SyncPoint::GetInstance()->EnableProcessing();
3110
+
3111
+ int num_levels = ioptions_.num_levels;
3112
+ NewVersionStorage(num_levels, kCompactionStyleLevel);
3113
+
3114
+ Add(0, 21U, "100", "150", 60000000U);
3115
+ Add(0, 22U, "300", "350", 60000000U);
3116
+ Add(4, 40U, "200", "220", 60000000U);
3117
+ Add(4, 41U, "230", "250", 60000000U);
3118
+ Add(6, 50U, "101", "351", 60000000U);
3119
+ UpdateVersionStorageInfo();
3120
+
3121
+ CompactionOptions comp_options;
3122
+ std::unordered_set<uint64_t> input_set;
3123
+ input_set.insert(21);
3124
+ input_set.insert(22);
3125
+ input_set.insert(50);
3126
+ std::vector<CompactionInputFiles> input_files;
3127
+ ASSERT_OK(level_compaction_picker.GetCompactionInputsFromFileNumbers(
3128
+ &input_files, &input_set, vstorage_.get(), comp_options));
3129
+
3130
+ std::unique_ptr<Compaction> comp1(level_compaction_picker.CompactFiles(
3131
+ comp_options, input_files, 6, vstorage_.get(), mutable_cf_options_,
3132
+ mutable_db_options_, 0));
3133
+
3134
+ input_set.clear();
3135
+ input_files.clear();
3136
+ input_set.insert(40);
3137
+ input_set.insert(41);
3138
+ ASSERT_OK(level_compaction_picker.GetCompactionInputsFromFileNumbers(
3139
+ &input_files, &input_set, vstorage_.get(), comp_options));
3140
+
3141
+ ASSERT_EQ(
3142
+ enable_per_key_placement_,
3143
+ level_compaction_picker.FilesRangeOverlapWithCompaction(input_files, 5));
3144
+ }
3145
+
3146
+ TEST_P(PerKeyPlacementCompactionPickerTest,
3147
+ OverlapWithNormalCompactionUniveral) {
3148
+ SyncPoint::GetInstance()->SetCallBack(
3149
+ "Compaction::SupportsPerKeyPlacement:Enabled", [&](void* arg) {
3150
+ auto supports_per_key_placement = static_cast<bool*>(arg);
3151
+ *supports_per_key_placement = enable_per_key_placement_;
3152
+ });
3153
+ SyncPoint::GetInstance()->EnableProcessing();
3154
+
3155
+ int num_levels = ioptions_.num_levels;
3156
+ UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
3157
+ NewVersionStorage(num_levels, kCompactionStyleUniversal);
3158
+
3159
+ Add(0, 21U, "100", "150", 60000000U);
3160
+ Add(0, 22U, "300", "350", 60000000U);
3161
+ Add(5, 40U, "200", "250", 60000000U);
3162
+ Add(6, 50U, "101", "351", 60000000U);
3163
+ UpdateVersionStorageInfo();
3164
+
3165
+ CompactionOptions comp_options;
3166
+ std::unordered_set<uint64_t> input_set;
3167
+ input_set.insert(40);
3168
+ std::vector<CompactionInputFiles> input_files;
3169
+ ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
3170
+ &input_files, &input_set, vstorage_.get(), comp_options));
3171
+
3172
+ std::unique_ptr<Compaction> comp1(universal_compaction_picker.CompactFiles(
3173
+ comp_options, input_files, 5, vstorage_.get(), mutable_cf_options_,
3174
+ mutable_db_options_, 0));
3175
+
3176
+ input_set.clear();
3177
+ input_files.clear();
3178
+ input_set.insert(21);
3179
+ input_set.insert(22);
3180
+ input_set.insert(50);
3181
+ ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
3182
+ &input_files, &input_set, vstorage_.get(), comp_options));
3183
+
3184
+ ASSERT_EQ(enable_per_key_placement_,
3185
+ universal_compaction_picker.FilesRangeOverlapWithCompaction(
3186
+ input_files, 6));
3187
+ }
3188
+
3189
+ TEST_P(PerKeyPlacementCompactionPickerTest, NormalCompactionOverlapUniversal) {
3190
+ SyncPoint::GetInstance()->SetCallBack(
3191
+ "Compaction::SupportsPerKeyPlacement:Enabled", [&](void* arg) {
3192
+ auto supports_per_key_placement = static_cast<bool*>(arg);
3193
+ *supports_per_key_placement = enable_per_key_placement_;
3194
+ });
3195
+ SyncPoint::GetInstance()->EnableProcessing();
3196
+
3197
+ int num_levels = ioptions_.num_levels;
3198
+ UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
3199
+ NewVersionStorage(num_levels, kCompactionStyleUniversal);
3200
+
3201
+ Add(0, 21U, "100", "150", 60000000U);
3202
+ Add(0, 22U, "300", "350", 60000000U);
3203
+ Add(4, 40U, "200", "220", 60000000U);
3204
+ Add(4, 41U, "230", "250", 60000000U);
3205
+ Add(6, 50U, "101", "351", 60000000U);
3206
+ UpdateVersionStorageInfo();
3207
+
3208
+ CompactionOptions comp_options;
3209
+ std::unordered_set<uint64_t> input_set;
3210
+ input_set.insert(21);
3211
+ input_set.insert(22);
3212
+ input_set.insert(50);
3213
+ std::vector<CompactionInputFiles> input_files;
3214
+ ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
3215
+ &input_files, &input_set, vstorage_.get(), comp_options));
3216
+
3217
+ std::unique_ptr<Compaction> comp1(universal_compaction_picker.CompactFiles(
3218
+ comp_options, input_files, 6, vstorage_.get(), mutable_cf_options_,
3219
+ mutable_db_options_, 0));
3220
+
3221
+ input_set.clear();
3222
+ input_files.clear();
3223
+ input_set.insert(40);
3224
+ input_set.insert(41);
3225
+ ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
3226
+ &input_files, &input_set, vstorage_.get(), comp_options));
3227
+
3228
+ ASSERT_EQ(enable_per_key_placement_,
3229
+ universal_compaction_picker.FilesRangeOverlapWithCompaction(
3230
+ input_files, 5));
3231
+ }
3232
+
3233
+ INSTANTIATE_TEST_CASE_P(PerKeyPlacementCompactionPickerTest,
3234
+ PerKeyPlacementCompactionPickerTest, ::testing::Bool());
3235
+
2769
3236
  #endif // ROCKSDB_LITE
2770
3237
 
2771
3238
  } // namespace ROCKSDB_NAMESPACE
@@ -758,7 +758,8 @@ Compaction* UniversalCompactionBuilder::PickCompactionToReduceSortedRuns(
758
758
  Temperature::kUnknown,
759
759
  /* max_subcompactions */ 0, grandparents,
760
760
  /* is manual */ false, /* trim_ts */ "", score_,
761
- false /* deletion_compaction */, compaction_reason);
761
+ false /* deletion_compaction */,
762
+ /* l0_files_might_overlap */ true, compaction_reason);
762
763
  }
763
764
 
764
765
  // Look at overall size amplification. If size amplification
@@ -1083,6 +1084,7 @@ Compaction* UniversalCompactionBuilder::PickIncrementalForReduceSizeAmp(
1083
1084
  Temperature::kUnknown,
1084
1085
  /* max_subcompactions */ 0, /* grandparents */ {}, /* is manual */ false,
1085
1086
  /* trim_ts */ "", score_, false /* deletion_compaction */,
1087
+ /* l0_files_might_overlap */ true,
1086
1088
  CompactionReason::kUniversalSizeAmplification);
1087
1089
  }
1088
1090
 
@@ -1225,6 +1227,7 @@ Compaction* UniversalCompactionBuilder::PickDeleteTriggeredCompaction() {
1225
1227
  Temperature::kUnknown,
1226
1228
  /* max_subcompactions */ 0, grandparents, /* is manual */ false,
1227
1229
  /* trim_ts */ "", score_, false /* deletion_compaction */,
1230
+ /* l0_files_might_overlap */ true,
1228
1231
  CompactionReason::kFilesMarkedForCompaction);
1229
1232
  }
1230
1233
 
@@ -1300,7 +1303,7 @@ Compaction* UniversalCompactionBuilder::PickCompactionToOldest(
1300
1303
  Temperature::kUnknown,
1301
1304
  /* max_subcompactions */ 0, /* grandparents */ {}, /* is manual */ false,
1302
1305
  /* trim_ts */ "", score_, false /* deletion_compaction */,
1303
- compaction_reason);
1306
+ /* l0_files_might_overlap */ true, compaction_reason);
1304
1307
  }
1305
1308
 
1306
1309
  Compaction* UniversalCompactionBuilder::PickPeriodicCompaction() {