@nxtedition/rocksdb 7.1.14 → 7.1.16

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 (223) hide show
  1. package/binding.cc +1 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
  3. package/deps/rocksdb/rocksdb/Makefile +91 -11
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -4
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
  14. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
  21. package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
  22. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
  23. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
  24. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
  27. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
  30. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
  31. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
  34. package/deps/rocksdb/rocksdb/db/c.cc +29 -0
  35. package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
  36. package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
  46. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
  50. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
  51. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
  63. package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
  64. package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
  65. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
  71. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
  72. package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
  73. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  74. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
  75. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
  76. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
  77. package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
  80. package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
  82. package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
  83. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
  84. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
  85. package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
  86. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
  87. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
  88. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
  89. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
  90. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
  91. package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
  92. package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
  93. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
  94. package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
  95. package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
  96. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  97. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
  98. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
  99. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  100. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  101. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
  102. package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
  103. package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
  104. package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
  105. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  106. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
  107. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
  108. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
  109. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
  118. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
  119. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
  120. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
  121. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  122. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
  123. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
  124. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
  125. package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
  126. package/deps/rocksdb/rocksdb/file/filename.h +4 -2
  127. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
  128. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
  129. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
  130. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
  131. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
  132. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
  134. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
  135. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
  136. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
  137. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
  139. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
  140. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
  142. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
  143. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  145. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
  148. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
  149. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
  150. package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
  151. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
  152. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
  153. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
  154. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
  155. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
  156. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  157. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
  158. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
  159. package/deps/rocksdb/rocksdb/options/options.cc +2 -2
  160. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  161. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
  162. package/deps/rocksdb/rocksdb/src.mk +4 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
  170. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
  171. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
  172. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
  173. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
  174. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
  175. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  176. package/deps/rocksdb/rocksdb/table/format.cc +26 -29
  177. package/deps/rocksdb/rocksdb/table/format.h +44 -26
  178. package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
  179. package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
  180. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
  181. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
  182. package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
  183. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
  184. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
  186. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
  187. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
  188. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  189. package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
  190. package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
  191. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
  192. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
  193. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
  194. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
  195. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  196. package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
  197. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
  198. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
  199. package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
  200. package/deps/rocksdb/rocksdb/util/timer.h +2 -3
  201. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
  202. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
  203. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
  204. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
  205. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
  206. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
  207. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
  208. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
  209. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
  210. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
  211. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
  212. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
  213. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  214. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
  217. package/deps/rocksdb/rocksdb.gyp +0 -1
  218. package/index.js +6 -10
  219. package/package.json +1 -1
  220. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  221. package/prebuilds/linux-x64/node.napi.node +0 -0
  222. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
@@ -19,7 +19,9 @@
19
19
  #include "db/db_impl/db_impl.h"
20
20
  #include "db/error_handler.h"
21
21
  #include "db/version_set.h"
22
+ #include "file/random_access_file_reader.h"
22
23
  #include "file/writable_file_writer.h"
24
+ #include "options/options_helper.h"
23
25
  #include "rocksdb/cache.h"
24
26
  #include "rocksdb/convenience.h"
25
27
  #include "rocksdb/db.h"
@@ -194,13 +196,15 @@ class MockTestFileSystem : public FileSystemWrapper {
194
196
  Env::IOPriority write_io_priority_;
195
197
  };
196
198
 
199
+ enum TableTypeForTest : uint8_t { kMockTable = 0, kBlockBasedTable = 1 };
200
+
197
201
  } // namespace
198
202
 
199
203
  class CompactionJobTestBase : public testing::Test {
200
204
  protected:
201
205
  CompactionJobTestBase(std::string dbname, const Comparator* ucmp,
202
206
  std::function<std::string(uint64_t)> encode_u64_ts,
203
- bool test_io_priority)
207
+ bool test_io_priority, TableTypeForTest table_type)
204
208
  : dbname_(std::move(dbname)),
205
209
  ucmp_(ucmp),
206
210
  db_options_(),
@@ -217,7 +221,8 @@ class CompactionJobTestBase : public testing::Test {
217
221
  mock_table_factory_(new mock::MockTableFactory()),
218
222
  error_handler_(nullptr, db_options_, &mutex_),
219
223
  encode_u64_ts_(std::move(encode_u64_ts)),
220
- test_io_priority_(test_io_priority) {
224
+ test_io_priority_(test_io_priority),
225
+ table_type_(table_type) {
221
226
  Env* base_env = Env::Default();
222
227
  EXPECT_OK(
223
228
  test::CreateEnvFromSystem(ConfigOptions(), &base_env, &env_guard_));
@@ -232,11 +237,13 @@ class CompactionJobTestBase : public testing::Test {
232
237
  db_options_.db_paths.emplace_back(dbname_,
233
238
  std::numeric_limits<uint64_t>::max());
234
239
  cf_options_.comparator = ucmp_;
235
- if (test_io_priority_) {
240
+ if (table_type_ == TableTypeForTest::kBlockBasedTable) {
236
241
  BlockBasedTableOptions table_options;
237
242
  cf_options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
238
- } else {
243
+ } else if (table_type_ == TableTypeForTest::kMockTable) {
239
244
  cf_options_.table_factory = mock_table_factory_;
245
+ } else {
246
+ assert(false);
240
247
  }
241
248
  }
242
249
 
@@ -358,13 +365,15 @@ class CompactionJobTestBase : public testing::Test {
358
365
 
359
366
  uint64_t file_number = versions_->NewFileNumber();
360
367
 
361
- uint64_t file_size;
362
- if (test_io_priority_) {
368
+ uint64_t file_size = 0;
369
+ if (table_type_ == TableTypeForTest::kBlockBasedTable) {
363
370
  CreateTable(GenerateFileName(file_number), contents, file_size);
364
- } else {
371
+ } else if (table_type_ == TableTypeForTest::kMockTable) {
365
372
  file_size = 10;
366
373
  EXPECT_OK(mock_table_factory_->CreateMockTable(
367
374
  env_, GenerateFileName(file_number), std::move(contents)));
375
+ } else {
376
+ assert(false);
368
377
  }
369
378
 
370
379
  VersionEdit edit;
@@ -377,10 +386,87 @@ class CompactionJobTestBase : public testing::Test {
377
386
  mutex_.Lock();
378
387
  EXPECT_OK(
379
388
  versions_->LogAndApply(versions_->GetColumnFamilySet()->GetDefault(),
380
- mutable_cf_options_, &edit, &mutex_));
389
+ mutable_cf_options_, &edit, &mutex_, nullptr));
381
390
  mutex_.Unlock();
382
391
  }
383
392
 
393
+ void VerifyTables(int output_level,
394
+ const std::vector<mock::KVVector>& expected_results,
395
+ std::vector<uint64_t> expected_oldest_blob_file_numbers) {
396
+ if (expected_results.empty()) {
397
+ ASSERT_EQ(compaction_job_stats_.num_output_files, 0U);
398
+ return;
399
+ }
400
+ int expected_output_file_num = 0;
401
+ for (const auto& e : expected_results) {
402
+ if (!e.empty()) {
403
+ ++expected_output_file_num;
404
+ }
405
+ }
406
+ ASSERT_EQ(expected_output_file_num, compaction_job_stats_.num_output_files);
407
+ if (expected_output_file_num == 0) {
408
+ return;
409
+ }
410
+
411
+ if (expected_oldest_blob_file_numbers.empty()) {
412
+ expected_oldest_blob_file_numbers.resize(expected_output_file_num,
413
+ kInvalidBlobFileNumber);
414
+ }
415
+
416
+ auto cfd = versions_->GetColumnFamilySet()->GetDefault();
417
+ if (table_type_ == TableTypeForTest::kMockTable) {
418
+ assert(expected_results.size() == 1);
419
+ mock_table_factory_->AssertLatestFile(expected_results[0]);
420
+ } else {
421
+ assert(table_type_ == TableTypeForTest::kBlockBasedTable);
422
+ }
423
+
424
+ auto output_files =
425
+ cfd->current()->storage_info()->LevelFiles(output_level);
426
+ ASSERT_EQ(expected_output_file_num, output_files.size());
427
+
428
+ if (table_type_ == TableTypeForTest::kMockTable) {
429
+ assert(output_files.size() == 1);
430
+ const FileMetaData* const output_file = output_files[0];
431
+ ASSERT_EQ(output_file->oldest_blob_file_number,
432
+ expected_oldest_blob_file_numbers[0]);
433
+ return;
434
+ }
435
+
436
+ for (size_t i = 0; i < expected_results.size(); ++i) {
437
+ const FileMetaData* const output_file = output_files[i];
438
+ std::string file_name = GenerateFileName(output_file->fd.GetNumber());
439
+ const auto& fs = env_->GetFileSystem();
440
+ std::unique_ptr<RandomAccessFileReader> freader;
441
+ IOStatus ios = RandomAccessFileReader::Create(
442
+ fs, file_name, FileOptions(), &freader, nullptr);
443
+ ASSERT_OK(ios);
444
+ std::unique_ptr<TableReader> table_reader;
445
+ uint64_t file_size = output_file->fd.GetFileSize();
446
+ ReadOptions read_opts;
447
+ Status s = cf_options_.table_factory->NewTableReader(
448
+ read_opts,
449
+ TableReaderOptions(*cfd->ioptions(), nullptr, FileOptions(),
450
+ cfd_->internal_comparator()),
451
+ std::move(freader), file_size, &table_reader, false);
452
+ ASSERT_OK(s);
453
+ assert(table_reader);
454
+ std::unique_ptr<InternalIterator> iiter(
455
+ table_reader->NewIterator(read_opts, nullptr, nullptr, true,
456
+ TableReaderCaller::kUncategorized));
457
+ assert(iiter);
458
+
459
+ mock::KVVector from_db;
460
+ for (iiter->SeekToFirst(); iiter->Valid(); iiter->Next()) {
461
+ const Slice key = iiter->key();
462
+ const Slice value = iiter->value();
463
+ from_db.emplace_back(
464
+ make_pair(key.ToString(false), value.ToString(false)));
465
+ }
466
+ ASSERT_EQ(expected_results[i], from_db);
467
+ }
468
+ }
469
+
384
470
  void SetLastSequence(const SequenceNumber sequence_number) {
385
471
  versions_->SetLastAllocatedSequence(sequence_number + 1);
386
472
  versions_->SetLastPublishedSequence(sequence_number + 1);
@@ -439,6 +525,13 @@ class CompactionJobTestBase : public testing::Test {
439
525
  void NewDB() {
440
526
  EXPECT_OK(DestroyDB(dbname_, Options()));
441
527
  EXPECT_OK(env_->CreateDirIfMissing(dbname_));
528
+
529
+ std::shared_ptr<Logger> info_log;
530
+ DBOptions db_opts = BuildDBOptions(db_options_, mutable_db_options_);
531
+ Status s = CreateLoggerFromOptions(dbname_, db_opts, &info_log);
532
+ ASSERT_OK(s);
533
+ db_options_.info_log = info_log;
534
+
442
535
  versions_.reset(
443
536
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
444
537
  &write_buffer_manager_, &write_controller_,
@@ -455,9 +548,9 @@ class CompactionJobTestBase : public testing::Test {
455
548
  const std::string manifest = DescriptorFileName(dbname_, 1);
456
549
  std::unique_ptr<WritableFileWriter> file_writer;
457
550
  const auto& fs = env_->GetFileSystem();
458
- Status s = WritableFileWriter::Create(
459
- fs, manifest, fs->OptimizeForManifestWrite(env_options_), &file_writer,
460
- nullptr);
551
+ s = WritableFileWriter::Create(fs, manifest,
552
+ fs->OptimizeForManifestWrite(env_options_),
553
+ &file_writer, nullptr);
461
554
 
462
555
  ASSERT_OK(s);
463
556
  {
@@ -481,27 +574,32 @@ class CompactionJobTestBase : public testing::Test {
481
574
  cfd_ = versions_->GetColumnFamilySet()->GetDefault();
482
575
  }
483
576
 
577
+ // input_files[i] on input_levels[i]
484
578
  void RunLastLevelCompaction(
485
579
  const std::vector<std::vector<FileMetaData*>>& input_files,
580
+ const std::vector<int> input_levels,
486
581
  std::function<void(Compaction& comp)>&& verify_func,
487
582
  const std::vector<SequenceNumber>& snapshots = {}) {
488
583
  const int kLastLevel = cf_options_.num_levels - 1;
489
584
  verify_per_key_placement_ = std::move(verify_func);
490
585
  mock::KVVector empty_map;
491
- RunCompaction(input_files, empty_map, snapshots, kMaxSequenceNumber,
492
- kLastLevel, false);
586
+ RunCompaction(input_files, input_levels, {empty_map}, snapshots,
587
+ kMaxSequenceNumber, kLastLevel, false);
493
588
  }
494
589
 
590
+ // input_files[i] on input_levels[i]
495
591
  void RunCompaction(
496
592
  const std::vector<std::vector<FileMetaData*>>& input_files,
497
- const mock::KVVector& expected_results,
593
+ const std::vector<int>& input_levels,
594
+ const std::vector<mock::KVVector>& expected_results,
498
595
  const std::vector<SequenceNumber>& snapshots = {},
499
596
  SequenceNumber earliest_write_conflict_snapshot = kMaxSequenceNumber,
500
597
  int output_level = 1, bool verify = true,
501
- uint64_t expected_oldest_blob_file_number = kInvalidBlobFileNumber,
598
+ std::vector<uint64_t> expected_oldest_blob_file_numbers = {},
502
599
  bool check_get_priority = false,
503
600
  Env::IOPriority read_io_priority = Env::IO_TOTAL,
504
- Env::IOPriority write_io_priority = Env::IO_TOTAL) {
601
+ Env::IOPriority write_io_priority = Env::IO_TOTAL,
602
+ int max_subcompactions = 0) {
505
603
  // For compaction, set fs as MockTestFileSystem to check the io_priority.
506
604
  if (test_io_priority_) {
507
605
  db_options_.fs.reset(
@@ -512,10 +610,10 @@ class CompactionJobTestBase : public testing::Test {
512
610
 
513
611
  size_t num_input_files = 0;
514
612
  std::vector<CompactionInputFiles> compaction_input_files;
515
- for (size_t level = 0; level < input_files.size(); level++) {
516
- auto level_files = input_files[level];
613
+ for (size_t i = 0; i < input_files.size(); ++i) {
614
+ auto level_files = input_files[i];
517
615
  CompactionInputFiles compaction_level;
518
- compaction_level.level = static_cast<int>(level);
616
+ compaction_level.level = input_levels[i];
519
617
  compaction_level.files.insert(compaction_level.files.end(),
520
618
  level_files.begin(), level_files.end());
521
619
  compaction_input_files.push_back(compaction_level);
@@ -527,9 +625,10 @@ class CompactionJobTestBase : public testing::Test {
527
625
  *cfd->GetLatestMutableCFOptions(), mutable_db_options_,
528
626
  compaction_input_files, output_level, 1024 * 1024, 10 * 1024 * 1024, 0,
529
627
  kNoCompression, cfd->GetLatestMutableCFOptions()->compression_opts,
530
- Temperature::kUnknown, 0, {}, true);
628
+ Temperature::kUnknown, max_subcompactions, {}, true);
531
629
  compaction.SetInputVersion(cfd->current());
532
630
 
631
+ assert(db_options_.info_log);
533
632
  LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, db_options_.info_log.get());
534
633
  mutex_.Lock();
535
634
  EventLogger event_logger(db_options_.info_log.get());
@@ -559,23 +658,14 @@ class CompactionJobTestBase : public testing::Test {
559
658
  ASSERT_OK(compaction_job.Install(*cfd->GetLatestMutableCFOptions()));
560
659
  ASSERT_OK(compaction_job.io_status());
561
660
  mutex_.Unlock();
661
+ log_buffer.FlushBufferToLog();
562
662
 
563
663
  if (verify) {
564
664
  ASSERT_GE(compaction_job_stats_.elapsed_micros, 0U);
565
665
  ASSERT_EQ(compaction_job_stats_.num_input_files, num_input_files);
566
666
 
567
- if (expected_results.empty()) {
568
- ASSERT_EQ(compaction_job_stats_.num_output_files, 0U);
569
- } else {
570
- ASSERT_EQ(compaction_job_stats_.num_output_files, 1U);
571
- mock_table_factory_->AssertLatestFile(expected_results);
572
-
573
- auto output_files =
574
- cfd->current()->storage_info()->LevelFiles(output_level);
575
- ASSERT_EQ(output_files.size(), 1);
576
- ASSERT_EQ(output_files[0]->oldest_blob_file_number,
577
- expected_oldest_blob_file_number);
578
- }
667
+ VerifyTables(output_level, expected_results,
668
+ expected_oldest_blob_file_numbers);
579
669
  }
580
670
 
581
671
  if (check_get_priority) {
@@ -635,8 +725,9 @@ class CompactionJobTestBase : public testing::Test {
635
725
  ErrorHandler error_handler_;
636
726
  std::string full_history_ts_low_;
637
727
  const std::function<std::string(uint64_t)> encode_u64_ts_;
638
- bool test_io_priority_;
728
+ const bool test_io_priority_;
639
729
  std::function<void(Compaction& comp)> verify_per_key_placement_;
730
+ const TableTypeForTest table_type_ = kMockTable;
640
731
  };
641
732
 
642
733
  // TODO(icanadi) Make it simpler once we mock out VersionSet
@@ -645,7 +736,8 @@ class CompactionJobTest : public CompactionJobTestBase {
645
736
  CompactionJobTest()
646
737
  : CompactionJobTestBase(
647
738
  test::PerThreadDBPath("compaction_job_test"), BytewiseComparator(),
648
- [](uint64_t /*ts*/) { return ""; }, false) {}
739
+ [](uint64_t /*ts*/) { return ""; }, /*test_io_priority=*/false,
740
+ TableTypeForTest::kMockTable) {}
649
741
  };
650
742
 
651
743
  TEST_F(CompactionJobTest, Simple) {
@@ -653,9 +745,10 @@ TEST_F(CompactionJobTest, Simple) {
653
745
 
654
746
  auto expected_results = CreateTwoFiles(false);
655
747
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
656
- auto files = cfd->current()->storage_info()->LevelFiles(0);
748
+ constexpr int input_level = 0;
749
+ auto files = cfd->current()->storage_info()->LevelFiles(input_level);
657
750
  ASSERT_EQ(2U, files.size());
658
- RunCompaction({ files }, expected_results);
751
+ RunCompaction({files}, {input_level}, {expected_results});
659
752
  }
660
753
 
661
754
  TEST_F(CompactionJobTest, DISABLED_SimpleCorrupted) {
@@ -663,8 +756,9 @@ TEST_F(CompactionJobTest, DISABLED_SimpleCorrupted) {
663
756
 
664
757
  auto expected_results = CreateTwoFiles(true);
665
758
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
666
- auto files = cfd->current()->storage_info()->LevelFiles(0);
667
- RunCompaction({files}, expected_results);
759
+ constexpr int input_level = 0;
760
+ auto files = cfd->current()->storage_info()->LevelFiles(input_level);
761
+ RunCompaction({files}, {input_level}, {expected_results});
668
762
  ASSERT_EQ(compaction_job_stats_.num_corrupt_keys, 400U);
669
763
  }
670
764
 
@@ -683,8 +777,9 @@ TEST_F(CompactionJobTest, SimpleDeletion) {
683
777
  mock::MakeMockFile({{KeyStr("b", 0U, kTypeValue), "val"}});
684
778
 
685
779
  SetLastSequence(4U);
686
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
687
- RunCompaction({files}, expected_results);
780
+ constexpr int input_level = 0;
781
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
782
+ RunCompaction({files}, {input_level}, {expected_results});
688
783
  }
689
784
 
690
785
  TEST_F(CompactionJobTest, OutputNothing) {
@@ -701,8 +796,10 @@ TEST_F(CompactionJobTest, OutputNothing) {
701
796
  auto expected_results = mock::MakeMockFile();
702
797
 
703
798
  SetLastSequence(4U);
704
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
705
- RunCompaction({files}, expected_results);
799
+
800
+ constexpr int input_level = 0;
801
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
802
+ RunCompaction({files}, {input_level}, {expected_results});
706
803
  }
707
804
 
708
805
  TEST_F(CompactionJobTest, SimpleOverwrite) {
@@ -723,8 +820,9 @@ TEST_F(CompactionJobTest, SimpleOverwrite) {
723
820
  {KeyStr("b", 0U, kTypeValue), "val3"}});
724
821
 
725
822
  SetLastSequence(4U);
726
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
727
- RunCompaction({files}, expected_results);
823
+ constexpr int input_level = 0;
824
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
825
+ RunCompaction({files}, {input_level}, {expected_results});
728
826
  }
729
827
 
730
828
  TEST_F(CompactionJobTest, SimpleNonLastLevel) {
@@ -751,9 +849,12 @@ TEST_F(CompactionJobTest, SimpleNonLastLevel) {
751
849
  {KeyStr("b", 6U, kTypeValue), "val3"}});
752
850
 
753
851
  SetLastSequence(6U);
754
- auto lvl0_files = cfd_->current()->storage_info()->LevelFiles(0);
755
- auto lvl1_files = cfd_->current()->storage_info()->LevelFiles(1);
756
- RunCompaction({lvl0_files, lvl1_files}, expected_results);
852
+ const std::vector<int> input_levels = {0, 1};
853
+ auto lvl0_files =
854
+ cfd_->current()->storage_info()->LevelFiles(input_levels[0]);
855
+ auto lvl1_files =
856
+ cfd_->current()->storage_info()->LevelFiles(input_levels[1]);
857
+ RunCompaction({lvl0_files, lvl1_files}, input_levels, {expected_results});
757
858
  }
758
859
 
759
860
  TEST_F(CompactionJobTest, SimpleMerge) {
@@ -776,8 +877,9 @@ TEST_F(CompactionJobTest, SimpleMerge) {
776
877
  {KeyStr("b", 0U, kTypeValue), "1,2"}});
777
878
 
778
879
  SetLastSequence(5U);
779
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
780
- RunCompaction({files}, expected_results);
880
+ constexpr int input_level = 0;
881
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
882
+ RunCompaction({files}, {input_level}, {expected_results});
781
883
  }
782
884
 
783
885
  TEST_F(CompactionJobTest, NonAssocMerge) {
@@ -800,8 +902,9 @@ TEST_F(CompactionJobTest, NonAssocMerge) {
800
902
  {KeyStr("b", 0U, kTypeValue), "1,2"}});
801
903
 
802
904
  SetLastSequence(5U);
803
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
804
- RunCompaction({files}, expected_results);
905
+ constexpr int input_level = 0;
906
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
907
+ RunCompaction({files}, {input_level}, {expected_results});
805
908
  }
806
909
 
807
910
  // Filters merge operands with value 10.
@@ -827,8 +930,9 @@ TEST_F(CompactionJobTest, MergeOperandFilter) {
827
930
  {KeyStr("b", 0U, kTypeValue), test::EncodeInt(2U)}});
828
931
 
829
932
  SetLastSequence(5U);
830
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
831
- RunCompaction({files}, expected_results);
933
+ constexpr int input_level = 0;
934
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
935
+ RunCompaction({files}, {input_level}, {expected_results});
832
936
  }
833
937
 
834
938
  TEST_F(CompactionJobTest, FilterSomeMergeOperands) {
@@ -863,8 +967,9 @@ TEST_F(CompactionJobTest, FilterSomeMergeOperands) {
863
967
  });
864
968
 
865
969
  SetLastSequence(5U);
866
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
867
- RunCompaction({files}, expected_results);
970
+ constexpr int input_level = 0;
971
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
972
+ RunCompaction({files}, {input_level}, {expected_results});
868
973
  }
869
974
 
870
975
  // Test where all operands/merge results are filtered out.
@@ -897,10 +1002,11 @@ TEST_F(CompactionJobTest, FilterAllMergeOperands) {
897
1002
  AddMockFile(file3, 2);
898
1003
 
899
1004
  SetLastSequence(11U);
900
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
1005
+ constexpr int input_level = 0;
1006
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
901
1007
 
902
1008
  mock::KVVector empty_map;
903
- RunCompaction({files}, empty_map);
1009
+ RunCompaction({files}, {input_level}, {empty_map});
904
1010
  }
905
1011
 
906
1012
  TEST_F(CompactionJobTest, SimpleSingleDelete) {
@@ -925,8 +1031,9 @@ TEST_F(CompactionJobTest, SimpleSingleDelete) {
925
1031
  mock::MakeMockFile({{KeyStr("a", 5U, kTypeDeletion), ""}});
926
1032
 
927
1033
  SetLastSequence(6U);
928
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
929
- RunCompaction({files}, expected_results);
1034
+ constexpr int input_level = 0;
1035
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1036
+ RunCompaction({files}, {input_level}, {expected_results});
930
1037
  }
931
1038
 
932
1039
  TEST_F(CompactionJobTest, SingleDeleteSnapshots) {
@@ -990,8 +1097,9 @@ TEST_F(CompactionJobTest, SingleDeleteSnapshots) {
990
1097
  });
991
1098
 
992
1099
  SetLastSequence(22U);
993
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
994
- RunCompaction({files}, expected_results, {10U, 20U}, 10U);
1100
+ constexpr int input_level = 0;
1101
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1102
+ RunCompaction({files}, {input_level}, {expected_results}, {10U, 20U}, 10U);
995
1103
  }
996
1104
 
997
1105
  TEST_F(CompactionJobTest, EarliestWriteConflictSnapshot) {
@@ -1068,8 +1176,10 @@ TEST_F(CompactionJobTest, EarliestWriteConflictSnapshot) {
1068
1176
  });
1069
1177
 
1070
1178
  SetLastSequence(24U);
1071
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
1072
- RunCompaction({files}, expected_results, {10U, 20U, 30U}, 20U);
1179
+ constexpr int input_level = 0;
1180
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1181
+ RunCompaction({files}, {input_level}, {expected_results}, {10U, 20U, 30U},
1182
+ 20U);
1073
1183
  }
1074
1184
 
1075
1185
  TEST_F(CompactionJobTest, SingleDeleteZeroSeq) {
@@ -1091,8 +1201,9 @@ TEST_F(CompactionJobTest, SingleDeleteZeroSeq) {
1091
1201
  });
1092
1202
 
1093
1203
  SetLastSequence(22U);
1094
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
1095
- RunCompaction({files}, expected_results, {});
1204
+ constexpr int input_level = 0;
1205
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1206
+ RunCompaction({files}, {input_level}, {expected_results}, {});
1096
1207
  }
1097
1208
 
1098
1209
  TEST_F(CompactionJobTest, MultiSingleDelete) {
@@ -1246,8 +1357,9 @@ TEST_F(CompactionJobTest, MultiSingleDelete) {
1246
1357
  {KeyStr("M", 3U, kTypeSingleDeletion), ""}});
1247
1358
 
1248
1359
  SetLastSequence(22U);
1249
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
1250
- RunCompaction({files}, expected_results, {10U}, 10U);
1360
+ constexpr int input_level = 0;
1361
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1362
+ RunCompaction({files}, {input_level}, {expected_results}, {10U}, 10U);
1251
1363
  }
1252
1364
 
1253
1365
  // This test documents the behavior where a corrupt key follows a deletion or a
@@ -1276,8 +1388,9 @@ TEST_F(CompactionJobTest, DISABLED_CorruptionAfterDeletion) {
1276
1388
  {test::KeyStr("c", 0U, kTypeValue), "val2"}});
1277
1389
 
1278
1390
  SetLastSequence(6U);
1279
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
1280
- RunCompaction({files}, expected_results);
1391
+ constexpr int input_level = 0;
1392
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1393
+ RunCompaction({files}, {input_level}, {expected_results});
1281
1394
  }
1282
1395
 
1283
1396
  TEST_F(CompactionJobTest, OldestBlobFileNumber) {
@@ -1322,10 +1435,12 @@ TEST_F(CompactionJobTest, OldestBlobFileNumber) {
1322
1435
  expected_blob4, expected_blob5, expected_blob6});
1323
1436
 
1324
1437
  SetLastSequence(6U);
1325
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
1326
- RunCompaction({files}, expected_results, std::vector<SequenceNumber>(),
1327
- kMaxSequenceNumber, /* output_level */ 1, /* verify */ true,
1328
- /* expected_oldest_blob_file_number */ 19);
1438
+ constexpr int input_level = 0;
1439
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1440
+ RunCompaction({files}, {input_level}, {expected_results},
1441
+ std::vector<SequenceNumber>(), kMaxSequenceNumber,
1442
+ /* output_level */ 1, /* verify */ true,
1443
+ /* expected_oldest_blob_file_numbers */ {19});
1329
1444
  }
1330
1445
 
1331
1446
  TEST_F(CompactionJobTest, VerifyPenultimateLevelOutput) {
@@ -1377,13 +1492,15 @@ TEST_F(CompactionJobTest, VerifyPenultimateLevelOutput) {
1377
1492
  AddMockFile(file3_2, 3);
1378
1493
 
1379
1494
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1380
- auto files0 = cfd->current()->storage_info()->LevelFiles(0);
1381
- auto files1 = cfd->current()->storage_info()->LevelFiles(1);
1382
- auto files2 = cfd->current()->storage_info()->LevelFiles(2);
1383
- auto files3 = cfd->current()->storage_info()->LevelFiles(3);
1495
+ const std::vector<int> input_levels = {0, 1, 2, 3};
1496
+ auto files0 = cfd->current()->storage_info()->LevelFiles(input_levels[0]);
1497
+ auto files1 = cfd->current()->storage_info()->LevelFiles(input_levels[1]);
1498
+ auto files2 = cfd->current()->storage_info()->LevelFiles(input_levels[2]);
1499
+ auto files3 = cfd->current()->storage_info()->LevelFiles(input_levels[3]);
1384
1500
 
1385
1501
  RunLastLevelCompaction(
1386
- {files0, files1, files2, files3}, /*verify_func=*/[&](Compaction& comp) {
1502
+ {files0, files1, files2, files3}, input_levels,
1503
+ /*verify_func=*/[&](Compaction& comp) {
1387
1504
  for (char c = 'a'; c <= 'z'; c++) {
1388
1505
  std::string c_str;
1389
1506
  c_str = c;
@@ -1408,8 +1525,9 @@ TEST_F(CompactionJobTest, NoEnforceSingleDeleteContract) {
1408
1525
  SetLastSequence(4U);
1409
1526
 
1410
1527
  auto expected_results = mock::MakeMockFile();
1411
- auto files = cfd_->current()->storage_info()->LevelFiles(0);
1412
- RunCompaction({files}, expected_results);
1528
+ constexpr int input_level = 0;
1529
+ auto files = cfd_->current()->storage_info()->LevelFiles(input_level);
1530
+ RunCompaction({files}, {input_level}, {expected_results});
1413
1531
  }
1414
1532
 
1415
1533
  TEST_F(CompactionJobTest, InputSerialization) {
@@ -1609,7 +1727,8 @@ class CompactionJobTimestampTest : public CompactionJobTestBase {
1609
1727
  CompactionJobTimestampTest()
1610
1728
  : CompactionJobTestBase(test::PerThreadDBPath("compaction_job_ts_test"),
1611
1729
  test::BytewiseComparatorWithU64TsWrapper(),
1612
- test::EncodeInt, false) {}
1730
+ test::EncodeInt, /*test_io_priority=*/false,
1731
+ TableTypeForTest::kMockTable) {}
1613
1732
  };
1614
1733
 
1615
1734
  TEST_F(CompactionJobTimestampTest, GCDisabled) {
@@ -1641,8 +1760,9 @@ TEST_F(CompactionJobTimestampTest, GCDisabled) {
1641
1760
  {KeyStr("c", 4, ValueType::kTypeValue, 94), "c5"},
1642
1761
  {KeyStr("d", 7, ValueType::kTypeValue, 97), "d7"},
1643
1762
  {KeyStr("d", 3, ValueType::kTypeSingleDeletion, 93), ""}});
1644
- const auto& files = cfd_->current()->storage_info()->LevelFiles(0);
1645
- RunCompaction({files}, expected_results);
1763
+ constexpr int input_level = 0;
1764
+ const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
1765
+ RunCompaction({files}, {input_level}, {expected_results});
1646
1766
  }
1647
1767
 
1648
1768
  TEST_F(CompactionJobTimestampTest, NoKeyExpired) {
@@ -1667,10 +1787,11 @@ TEST_F(CompactionJobTimestampTest, NoKeyExpired) {
1667
1787
  {KeyStr("b", 7, ValueType::kTypeValue, 101), "b7"},
1668
1788
  {KeyStr("c", 5, ValueType::kTypeValue, 99), "c5"},
1669
1789
  {KeyStr("c", 3, ValueType::kTypeValue, 97), "c3"}});
1670
- const auto& files = cfd_->current()->storage_info()->LevelFiles(0);
1790
+ constexpr int input_level = 0;
1791
+ const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
1671
1792
 
1672
1793
  full_history_ts_low_ = encode_u64_ts_(0);
1673
- RunCompaction({files}, expected_results);
1794
+ RunCompaction({files}, {input_level}, {expected_results});
1674
1795
  }
1675
1796
 
1676
1797
  TEST_F(CompactionJobTimestampTest, AllKeysExpired) {
@@ -1693,10 +1814,11 @@ TEST_F(CompactionJobTimestampTest, AllKeysExpired) {
1693
1814
 
1694
1815
  auto expected_results =
1695
1816
  mock::MakeMockFile({{KeyStr("c", 0, ValueType::kTypeValue, 0), "c7"}});
1696
- const auto& files = cfd_->current()->storage_info()->LevelFiles(0);
1817
+ constexpr int input_level = 0;
1818
+ const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
1697
1819
 
1698
1820
  full_history_ts_low_ = encode_u64_ts_(std::numeric_limits<uint64_t>::max());
1699
- RunCompaction({files}, expected_results);
1821
+ RunCompaction({files}, {input_level}, {expected_results});
1700
1822
  }
1701
1823
 
1702
1824
  TEST_F(CompactionJobTimestampTest, SomeKeysExpired) {
@@ -1719,10 +1841,121 @@ TEST_F(CompactionJobTimestampTest, SomeKeysExpired) {
1719
1841
  mock::MakeMockFile({{KeyStr("a", 5, ValueType::kTypeValue, 50), "a5"},
1720
1842
  {KeyStr("a", 0, ValueType::kTypeValue, 0), "a3"},
1721
1843
  {KeyStr("b", 6, ValueType::kTypeValue, 49), "b6"}});
1722
- const auto& files = cfd_->current()->storage_info()->LevelFiles(0);
1844
+ constexpr int input_level = 0;
1845
+ const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
1723
1846
 
1724
1847
  full_history_ts_low_ = encode_u64_ts_(49);
1725
- RunCompaction({files}, expected_results);
1848
+ RunCompaction({files}, {input_level}, {expected_results});
1849
+ }
1850
+
1851
+ class CompactionJobTimestampTestWithBbTable : public CompactionJobTestBase {
1852
+ public:
1853
+ // Block-based table is needed if we want to test subcompaction partitioning
1854
+ // with anchors.
1855
+ explicit CompactionJobTimestampTestWithBbTable()
1856
+ : CompactionJobTestBase(
1857
+ test::PerThreadDBPath("compaction_job_ts_bbt_test"),
1858
+ test::BytewiseComparatorWithU64TsWrapper(), test::EncodeInt,
1859
+ /*test_io_priority=*/false, TableTypeForTest::kBlockBasedTable) {}
1860
+ };
1861
+
1862
+ TEST_F(CompactionJobTimestampTestWithBbTable, SubcompactionAnchorL1) {
1863
+ cf_options_.target_file_size_base = 20;
1864
+ mutable_cf_options_.target_file_size_base = 20;
1865
+ NewDB();
1866
+
1867
+ const std::vector<std::string> keys = {
1868
+ KeyStr("a", 20, ValueType::kTypeValue, 200),
1869
+ KeyStr("b", 21, ValueType::kTypeValue, 210),
1870
+ KeyStr("b", 20, ValueType::kTypeValue, 200),
1871
+ KeyStr("b", 18, ValueType::kTypeValue, 180),
1872
+ KeyStr("c", 17, ValueType::kTypeValue, 170),
1873
+ KeyStr("c", 16, ValueType::kTypeValue, 160),
1874
+ KeyStr("c", 15, ValueType::kTypeValue, 150)};
1875
+ const std::vector<std::string> values = {"a20", "b21", "b20", "b18",
1876
+ "c17", "c16", "c15"};
1877
+
1878
+ constexpr int input_level = 1;
1879
+
1880
+ auto file1 = mock::MakeMockFile(
1881
+ {{keys[0], values[0]}, {keys[1], values[1]}, {keys[2], values[2]}});
1882
+ AddMockFile(file1, input_level);
1883
+
1884
+ auto file2 = mock::MakeMockFile(
1885
+ {{keys[3], values[3]}, {keys[4], values[4]}, {keys[5], values[5]}});
1886
+ AddMockFile(file2, input_level);
1887
+
1888
+ auto file3 = mock::MakeMockFile({{keys[6], values[6]}});
1889
+ AddMockFile(file3, input_level);
1890
+
1891
+ SetLastSequence(20);
1892
+
1893
+ auto output1 = mock::MakeMockFile({{keys[0], values[0]}});
1894
+ auto output2 = mock::MakeMockFile(
1895
+ {{keys[1], values[1]}, {keys[2], values[2]}, {keys[3], values[3]}});
1896
+ auto output3 = mock::MakeMockFile(
1897
+ {{keys[4], values[4]}, {keys[5], values[5]}, {keys[6], values[6]}});
1898
+
1899
+ auto expected_results =
1900
+ std::vector<mock::KVVector>{output1, output2, output3};
1901
+ const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
1902
+
1903
+ constexpr int output_level = 2;
1904
+ constexpr int max_subcompactions = 4;
1905
+ RunCompaction({files}, {input_level}, expected_results, /*snapshots=*/{},
1906
+ /*earliest_write_conflict_snapshot=*/kMaxSequenceNumber,
1907
+ output_level, /*verify=*/true, {kInvalidBlobFileNumber},
1908
+ /*check_get_priority=*/false, Env::IO_TOTAL, Env::IO_TOTAL,
1909
+ max_subcompactions);
1910
+ }
1911
+
1912
+ TEST_F(CompactionJobTimestampTestWithBbTable, SubcompactionL0) {
1913
+ cf_options_.target_file_size_base = 20;
1914
+ mutable_cf_options_.target_file_size_base = 20;
1915
+ NewDB();
1916
+
1917
+ const std::vector<std::string> keys = {
1918
+ KeyStr("a", 20, ValueType::kTypeValue, 200),
1919
+ KeyStr("b", 20, ValueType::kTypeValue, 200),
1920
+ KeyStr("b", 19, ValueType::kTypeValue, 190),
1921
+ KeyStr("b", 18, ValueType::kTypeValue, 180),
1922
+ KeyStr("c", 17, ValueType::kTypeValue, 170),
1923
+ KeyStr("c", 16, ValueType::kTypeValue, 160),
1924
+ KeyStr("c", 15, ValueType::kTypeValue, 150)};
1925
+ const std::vector<std::string> values = {"a20", "b20", "b19", "b18",
1926
+ "c17", "c16", "c15"};
1927
+
1928
+ constexpr int input_level = 0;
1929
+
1930
+ auto file1 = mock::MakeMockFile({{keys[5], values[5]}, {keys[6], values[6]}});
1931
+ AddMockFile(file1, input_level);
1932
+
1933
+ auto file2 = mock::MakeMockFile({{keys[3], values[3]}, {keys[4], values[4]}});
1934
+ AddMockFile(file2, input_level);
1935
+
1936
+ auto file3 = mock::MakeMockFile(
1937
+ {{keys[0], values[0]}, {keys[1], values[1]}, {keys[2], values[2]}});
1938
+ AddMockFile(file3, input_level);
1939
+
1940
+ SetLastSequence(20);
1941
+
1942
+ auto output1 = mock::MakeMockFile({{keys[0], values[0]}});
1943
+ auto output2 = mock::MakeMockFile(
1944
+ {{keys[1], values[1]}, {keys[2], values[2]}, {keys[3], values[3]}});
1945
+ auto output3 = mock::MakeMockFile(
1946
+ {{keys[4], values[4]}, {keys[5], values[5]}, {keys[6], values[6]}});
1947
+
1948
+ auto expected_results =
1949
+ std::vector<mock::KVVector>{output1, output2, output3};
1950
+ const auto& files = cfd_->current()->storage_info()->LevelFiles(input_level);
1951
+
1952
+ constexpr int output_level = 1;
1953
+ constexpr int max_subcompactions = 4;
1954
+ RunCompaction({files}, {input_level}, expected_results, /*snapshots=*/{},
1955
+ /*earliest_write_conflict_snapshot=*/kMaxSequenceNumber,
1956
+ output_level, /*verify=*/true, {kInvalidBlobFileNumber},
1957
+ /*check_get_priority=*/false, Env::IO_TOTAL, Env::IO_TOTAL,
1958
+ max_subcompactions);
1726
1959
  }
1727
1960
 
1728
1961
  // The io priority of the compaction reads and writes are different from
@@ -1734,7 +1967,8 @@ class CompactionJobIOPriorityTest : public CompactionJobTestBase {
1734
1967
  CompactionJobIOPriorityTest()
1735
1968
  : CompactionJobTestBase(
1736
1969
  test::PerThreadDBPath("compaction_job_io_priority_test"),
1737
- BytewiseComparator(), [](uint64_t /*ts*/) { return ""; }, true) {}
1970
+ BytewiseComparator(), [](uint64_t /*ts*/) { return ""; },
1971
+ /*test_io_priority=*/true, TableTypeForTest::kBlockBasedTable) {}
1738
1972
  };
1739
1973
 
1740
1974
  TEST_F(CompactionJobIOPriorityTest, WriteControllerStateNormal) {
@@ -1742,10 +1976,12 @@ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateNormal) {
1742
1976
  NewDB();
1743
1977
  mock::KVVector expected_results = CreateTwoFiles(false);
1744
1978
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1745
- auto files = cfd->current()->storage_info()->LevelFiles(0);
1979
+ constexpr int input_level = 0;
1980
+ auto files = cfd->current()->storage_info()->LevelFiles(input_level);
1746
1981
  ASSERT_EQ(2U, files.size());
1747
- RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1748
- kInvalidBlobFileNumber, false, Env::IO_LOW, Env::IO_LOW);
1982
+ RunCompaction({files}, {input_level}, {expected_results}, {},
1983
+ kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, false,
1984
+ Env::IO_LOW, Env::IO_LOW);
1749
1985
  }
1750
1986
 
1751
1987
  TEST_F(CompactionJobIOPriorityTest, WriteControllerStateDelayed) {
@@ -1753,13 +1989,15 @@ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateDelayed) {
1753
1989
  NewDB();
1754
1990
  mock::KVVector expected_results = CreateTwoFiles(false);
1755
1991
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1756
- auto files = cfd->current()->storage_info()->LevelFiles(0);
1992
+ constexpr int input_level = 0;
1993
+ auto files = cfd->current()->storage_info()->LevelFiles(input_level);
1757
1994
  ASSERT_EQ(2U, files.size());
1758
1995
  {
1759
1996
  std::unique_ptr<WriteControllerToken> delay_token =
1760
1997
  write_controller_.GetDelayToken(1000000);
1761
- RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1762
- kInvalidBlobFileNumber, false, Env::IO_USER, Env::IO_USER);
1998
+ RunCompaction({files}, {input_level}, {expected_results}, {},
1999
+ kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, false,
2000
+ Env::IO_USER, Env::IO_USER);
1763
2001
  }
1764
2002
  }
1765
2003
 
@@ -1768,13 +2006,15 @@ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateStalled) {
1768
2006
  NewDB();
1769
2007
  mock::KVVector expected_results = CreateTwoFiles(false);
1770
2008
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1771
- auto files = cfd->current()->storage_info()->LevelFiles(0);
2009
+ constexpr int input_level = 0;
2010
+ auto files = cfd->current()->storage_info()->LevelFiles(input_level);
1772
2011
  ASSERT_EQ(2U, files.size());
1773
2012
  {
1774
2013
  std::unique_ptr<WriteControllerToken> stop_token =
1775
2014
  write_controller_.GetStopToken();
1776
- RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1777
- kInvalidBlobFileNumber, false, Env::IO_USER, Env::IO_USER);
2015
+ RunCompaction({files}, {input_level}, {expected_results}, {},
2016
+ kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, false,
2017
+ Env::IO_USER, Env::IO_USER);
1778
2018
  }
1779
2019
  }
1780
2020
 
@@ -1782,10 +2022,12 @@ TEST_F(CompactionJobIOPriorityTest, GetRateLimiterPriority) {
1782
2022
  NewDB();
1783
2023
  mock::KVVector expected_results = CreateTwoFiles(false);
1784
2024
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1785
- auto files = cfd->current()->storage_info()->LevelFiles(0);
2025
+ constexpr int input_level = 0;
2026
+ auto files = cfd->current()->storage_info()->LevelFiles(input_level);
1786
2027
  ASSERT_EQ(2U, files.size());
1787
- RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1788
- kInvalidBlobFileNumber, true, Env::IO_LOW, Env::IO_LOW);
2028
+ RunCompaction({files}, {input_level}, {expected_results}, {},
2029
+ kMaxSequenceNumber, 1, false, {kInvalidBlobFileNumber}, true,
2030
+ Env::IO_LOW, Env::IO_LOW);
1789
2031
  }
1790
2032
 
1791
2033
  } // namespace ROCKSDB_NAMESPACE