@nxtedition/rocksdb 13.1.4 → 13.2.0

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 (237) hide show
  1. package/binding.cc +43 -16
  2. package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
  4. package/deps/rocksdb/rocksdb/Makefile +2 -2
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
  7. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
  8. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
  9. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
  10. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
  11. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  12. package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
  13. package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
  14. package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
  15. package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
  16. package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
  39. package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
  41. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
  42. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
  52. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
  53. package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
  54. package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
  55. package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
  56. package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
  57. package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
  58. package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
  59. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
  60. package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
  61. package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
  62. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
  64. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
  65. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
  67. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
  68. package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
  69. package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
  70. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
  71. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
  72. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
  74. package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
  75. package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
  76. package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
  77. package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
  78. package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
  79. package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
  80. package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
  81. package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
  82. package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
  83. package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
  84. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
  85. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
  86. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
  87. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
  88. package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
  89. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
  90. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
  91. package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
  92. package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
  93. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
  94. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
  96. package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
  98. package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
  99. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
  100. package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
  101. package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
  102. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
  103. package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
  104. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
  105. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
  106. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
  107. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
  108. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
  109. package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
  110. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
  111. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
  113. package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
  114. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
  115. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
  120. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
  121. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
  122. package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
  123. package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
  124. package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
  125. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  126. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
  127. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
  128. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
  129. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
  130. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
  131. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
  132. package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
  134. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
  135. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
  136. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
  137. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
  139. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
  140. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
  142. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
  144. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
  147. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
  148. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
  150. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
  152. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  153. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
  154. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
  155. package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
  156. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
  157. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
  158. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
  159. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
  160. package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
  161. package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
  162. package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
  163. package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
  164. package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
  165. package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
  166. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
  167. package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
  168. package/deps/rocksdb/rocksdb/port/port.h +5 -9
  169. package/deps/rocksdb/rocksdb/src.mk +8 -0
  170. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
  171. package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
  172. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
  174. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
  175. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
  177. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
  178. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
  181. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  182. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  183. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
  184. package/deps/rocksdb/rocksdb/table/format.cc +3 -3
  185. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
  186. package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
  187. package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
  188. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
  189. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  190. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
  191. package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
  192. package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
  193. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
  194. package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
  196. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
  197. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
  198. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  199. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
  200. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
  201. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
  202. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
  203. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
  204. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
  205. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
  206. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
  207. package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
  208. package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
  209. package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
  210. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
  211. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
  212. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
  213. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
  214. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
  215. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
  216. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
  217. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
  218. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
  219. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
  220. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
  221. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
  222. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
  223. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
  224. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
  225. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
  226. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
  227. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
  228. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
  229. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
  230. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
  231. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
  232. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
  233. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
  234. package/deps/rocksdb/rocksdb.gyp +2 -0
  235. package/package.json +1 -1
  236. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  237. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -13,6 +13,7 @@
13
13
  #include "db/compaction/compaction_picker_universal.h"
14
14
  #include "db/compaction/file_pri.h"
15
15
  #include "rocksdb/advanced_options.h"
16
+ #include "table/mock_table.h"
16
17
  #include "table/unique_id_impl.h"
17
18
  #include "test_util/testharness.h"
18
19
  #include "test_util/testutil.h"
@@ -77,7 +78,7 @@ class CompactionPickerTestBase : public testing::Test {
77
78
  ioptions_.level_compaction_dynamic_level_bytes = false;
78
79
  }
79
80
 
80
- ~CompactionPickerTestBase() override = default;
81
+ ~CompactionPickerTestBase() override { ClearFiles(); }
81
82
 
82
83
  void NewVersionStorage(int num_levels, CompactionStyle style) {
83
84
  DeleteVersionStorage();
@@ -103,7 +104,7 @@ class CompactionPickerTestBase : public testing::Test {
103
104
  void DeleteVersionStorage() {
104
105
  vstorage_.reset();
105
106
  temp_vstorage_.reset();
106
- files_.clear();
107
+ ClearFiles();
107
108
  file_map_.clear();
108
109
  input_files_.clear();
109
110
  }
@@ -115,6 +116,7 @@ class CompactionPickerTestBase : public testing::Test {
115
116
  size_t compensated_file_size = 0, bool marked_for_compact = false,
116
117
  Temperature temperature = Temperature::kUnknown,
117
118
  uint64_t oldest_ancestor_time = kUnknownOldestAncesterTime,
119
+ uint64_t newest_key_time = kUnknownNewestKeyTime,
118
120
  Slice ts_of_smallest = Slice(), Slice ts_of_largest = Slice(),
119
121
  uint64_t epoch_number = kUnknownEpochNumber) {
120
122
  assert(ts_of_smallest.size() == ucmp_->timestamp_size());
@@ -161,7 +163,12 @@ class CompactionPickerTestBase : public testing::Test {
161
163
  true /* user_defined_timestamps_persisted */);
162
164
  f->compensated_file_size =
163
165
  (compensated_file_size != 0) ? compensated_file_size : file_size;
166
+ // oldest_ancester_time is only used if newest_key_time is not available
164
167
  f->oldest_ancester_time = oldest_ancestor_time;
168
+ TableProperties tp;
169
+ tp.newest_key_time = newest_key_time;
170
+ f->fd.table_reader = new mock::MockTableReader(mock::KVVector{}, tp);
171
+
165
172
  vstorage->AddFile(level, f);
166
173
  files_.emplace_back(f);
167
174
  file_map_.insert({file_number, {f, level}});
@@ -206,6 +213,15 @@ class CompactionPickerTestBase : public testing::Test {
206
213
  return opts;
207
214
  }
208
215
 
216
+ void ClearFiles() {
217
+ for (auto& file : files_) {
218
+ if (file->fd.table_reader != nullptr) {
219
+ delete file->fd.table_reader;
220
+ }
221
+ }
222
+ files_.clear();
223
+ }
224
+
209
225
  std::unique_ptr<VersionStorageInfo> temp_vstorage_;
210
226
  };
211
227
 
@@ -232,8 +248,9 @@ TEST_F(CompactionPickerTest, Empty) {
232
248
  NewVersionStorage(6, kCompactionStyleLevel);
233
249
  UpdateVersionStorageInfo();
234
250
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
235
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
236
- &log_buffer_));
251
+ cf_name_, mutable_cf_options_, mutable_db_options_,
252
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
253
+ vstorage_.get(), &log_buffer_));
237
254
  ASSERT_TRUE(compaction.get() == nullptr);
238
255
  }
239
256
 
@@ -244,8 +261,9 @@ TEST_F(CompactionPickerTest, Single) {
244
261
  UpdateVersionStorageInfo();
245
262
 
246
263
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
247
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
248
- &log_buffer_));
264
+ cf_name_, mutable_cf_options_, mutable_db_options_,
265
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
266
+ vstorage_.get(), &log_buffer_));
249
267
  ASSERT_TRUE(compaction.get() == nullptr);
250
268
  }
251
269
 
@@ -258,8 +276,9 @@ TEST_F(CompactionPickerTest, Level0Trigger) {
258
276
  UpdateVersionStorageInfo();
259
277
 
260
278
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
261
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
262
- &log_buffer_));
279
+ cf_name_, mutable_cf_options_, mutable_db_options_,
280
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
281
+ vstorage_.get(), &log_buffer_));
263
282
  ASSERT_TRUE(compaction.get() != nullptr);
264
283
  ASSERT_EQ(2U, compaction->num_input_files(0));
265
284
  ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
@@ -272,8 +291,9 @@ TEST_F(CompactionPickerTest, Level1Trigger) {
272
291
  UpdateVersionStorageInfo();
273
292
 
274
293
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
275
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
276
- &log_buffer_));
294
+ cf_name_, mutable_cf_options_, mutable_db_options_,
295
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
296
+ vstorage_.get(), &log_buffer_));
277
297
  ASSERT_TRUE(compaction.get() != nullptr);
278
298
  ASSERT_EQ(1U, compaction->num_input_files(0));
279
299
  ASSERT_EQ(66U, compaction->input(0, 0)->fd.GetNumber());
@@ -291,8 +311,9 @@ TEST_F(CompactionPickerTest, Level1Trigger2) {
291
311
  UpdateVersionStorageInfo();
292
312
 
293
313
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
294
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
295
- &log_buffer_));
314
+ cf_name_, mutable_cf_options_, mutable_db_options_,
315
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
316
+ vstorage_.get(), &log_buffer_));
296
317
  ASSERT_TRUE(compaction.get() != nullptr);
297
318
  ASSERT_EQ(1U, compaction->num_input_files(0));
298
319
  ASSERT_EQ(2U, compaction->num_input_files(1));
@@ -323,8 +344,9 @@ TEST_F(CompactionPickerTest, LevelMaxScore) {
323
344
  UpdateVersionStorageInfo();
324
345
 
325
346
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
326
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
327
- &log_buffer_));
347
+ cf_name_, mutable_cf_options_, mutable_db_options_,
348
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
349
+ vstorage_.get(), &log_buffer_));
328
350
  ASSERT_TRUE(compaction.get() != nullptr);
329
351
  ASSERT_EQ(1U, compaction->num_input_files(0));
330
352
  ASSERT_EQ(7U, compaction->input(0, 0)->fd.GetNumber());
@@ -371,8 +393,9 @@ TEST_F(CompactionPickerTest, Level0TriggerDynamic) {
371
393
  UpdateVersionStorageInfo();
372
394
 
373
395
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
374
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
375
- &log_buffer_));
396
+ cf_name_, mutable_cf_options_, mutable_db_options_,
397
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
398
+ vstorage_.get(), &log_buffer_));
376
399
  ASSERT_TRUE(compaction.get() != nullptr);
377
400
  ASSERT_EQ(2U, compaction->num_input_files(0));
378
401
  ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
@@ -396,8 +419,9 @@ TEST_F(CompactionPickerTest, Level0TriggerDynamic2) {
396
419
  ASSERT_EQ(vstorage_->base_level(), num_levels - 2);
397
420
 
398
421
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
399
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
400
- &log_buffer_));
422
+ cf_name_, mutable_cf_options_, mutable_db_options_,
423
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
424
+ vstorage_.get(), &log_buffer_));
401
425
  ASSERT_TRUE(compaction.get() != nullptr);
402
426
  ASSERT_EQ(2U, compaction->num_input_files(0));
403
427
  ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
@@ -422,8 +446,9 @@ TEST_F(CompactionPickerTest, Level0TriggerDynamic3) {
422
446
  ASSERT_EQ(vstorage_->base_level(), num_levels - 3);
423
447
 
424
448
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
425
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
426
- &log_buffer_));
449
+ cf_name_, mutable_cf_options_, mutable_db_options_,
450
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
451
+ vstorage_.get(), &log_buffer_));
427
452
  ASSERT_TRUE(compaction.get() != nullptr);
428
453
  ASSERT_EQ(2U, compaction->num_input_files(0));
429
454
  ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
@@ -452,8 +477,9 @@ TEST_F(CompactionPickerTest, Level0TriggerDynamic4) {
452
477
  ASSERT_EQ(vstorage_->base_level(), num_levels - 3);
453
478
 
454
479
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
455
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
456
- &log_buffer_));
480
+ cf_name_, mutable_cf_options_, mutable_db_options_,
481
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
482
+ vstorage_.get(), &log_buffer_));
457
483
  ASSERT_TRUE(compaction.get() != nullptr);
458
484
  ASSERT_EQ(2U, compaction->num_input_files(0));
459
485
  ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
@@ -485,8 +511,9 @@ TEST_F(CompactionPickerTest, LevelTriggerDynamic4) {
485
511
  UpdateVersionStorageInfo();
486
512
 
487
513
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
488
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
489
- &log_buffer_));
514
+ cf_name_, mutable_cf_options_, mutable_db_options_,
515
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
516
+ vstorage_.get(), &log_buffer_));
490
517
  ASSERT_TRUE(compaction.get() != nullptr);
491
518
  ASSERT_EQ(1U, compaction->num_input_files(0));
492
519
  ASSERT_EQ(5U, compaction->input(0, 0)->fd.GetNumber());
@@ -540,8 +567,9 @@ TEST_F(CompactionPickerTest, CompactionUniversalIngestBehindReservedLevel) {
540
567
 
541
568
  std::unique_ptr<Compaction> compaction(
542
569
  universal_compaction_picker.PickCompaction(
543
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
544
- &log_buffer_));
570
+ cf_name_, mutable_cf_options_, mutable_db_options_,
571
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
572
+ vstorage_.get(), &log_buffer_));
545
573
 
546
574
  // output level should be the one above the bottom-most
547
575
  ASSERT_EQ(1, compaction->output_level());
@@ -583,8 +611,9 @@ TEST_F(CompactionPickerTest, CannotTrivialMoveUniversal) {
583
611
 
584
612
  std::unique_ptr<Compaction> compaction(
585
613
  universal_compaction_picker.PickCompaction(
586
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
587
- &log_buffer_));
614
+ cf_name_, mutable_cf_options_, mutable_db_options_,
615
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
616
+ vstorage_.get(), &log_buffer_));
588
617
 
589
618
  ASSERT_TRUE(!compaction->is_trivial_move());
590
619
  }
@@ -610,8 +639,9 @@ TEST_F(CompactionPickerTest, AllowsTrivialMoveUniversal) {
610
639
 
611
640
  std::unique_ptr<Compaction> compaction(
612
641
  universal_compaction_picker.PickCompaction(
613
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
614
- &log_buffer_));
642
+ cf_name_, mutable_cf_options_, mutable_db_options_,
643
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
644
+ vstorage_.get(), &log_buffer_));
615
645
 
616
646
  ASSERT_TRUE(compaction->is_trivial_move());
617
647
  }
@@ -639,8 +669,9 @@ TEST_F(CompactionPickerTest, UniversalPeriodicCompaction1) {
639
669
 
640
670
  std::unique_ptr<Compaction> compaction(
641
671
  universal_compaction_picker.PickCompaction(
642
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
643
- &log_buffer_));
672
+ cf_name_, mutable_cf_options_, mutable_db_options_,
673
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
674
+ vstorage_.get(), &log_buffer_));
644
675
 
645
676
  ASSERT_TRUE(compaction);
646
677
  ASSERT_EQ(4, compaction->output_level());
@@ -670,8 +701,9 @@ TEST_F(CompactionPickerTest, UniversalPeriodicCompaction2) {
670
701
 
671
702
  std::unique_ptr<Compaction> compaction(
672
703
  universal_compaction_picker.PickCompaction(
673
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
674
- &log_buffer_));
704
+ cf_name_, mutable_cf_options_, mutable_db_options_,
705
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
706
+ vstorage_.get(), &log_buffer_));
675
707
 
676
708
  ASSERT_FALSE(compaction);
677
709
  }
@@ -697,8 +729,9 @@ TEST_F(CompactionPickerTest, UniversalPeriodicCompaction3) {
697
729
 
698
730
  std::unique_ptr<Compaction> compaction(
699
731
  universal_compaction_picker.PickCompaction(
700
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
701
- &log_buffer_));
732
+ cf_name_, mutable_cf_options_, mutable_db_options_,
733
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
734
+ vstorage_.get(), &log_buffer_));
702
735
 
703
736
  ASSERT_FALSE(compaction);
704
737
  }
@@ -728,8 +761,9 @@ TEST_F(CompactionPickerTest, UniversalPeriodicCompaction4) {
728
761
 
729
762
  std::unique_ptr<Compaction> compaction(
730
763
  universal_compaction_picker.PickCompaction(
731
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
732
- &log_buffer_));
764
+ cf_name_, mutable_cf_options_, mutable_db_options_,
765
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
766
+ vstorage_.get(), &log_buffer_));
733
767
  ASSERT_TRUE(!compaction ||
734
768
  compaction->start_level() != compaction->output_level());
735
769
  }
@@ -749,8 +783,9 @@ TEST_F(CompactionPickerTest, UniversalPeriodicCompaction5) {
749
783
 
750
784
  std::unique_ptr<Compaction> compaction(
751
785
  universal_compaction_picker.PickCompaction(
752
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
753
- &log_buffer_));
786
+ cf_name_, mutable_cf_options_, mutable_db_options_,
787
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
788
+ vstorage_.get(), &log_buffer_));
754
789
  ASSERT_TRUE(compaction);
755
790
  ASSERT_EQ(0, compaction->start_level());
756
791
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -774,8 +809,9 @@ TEST_F(CompactionPickerTest, UniversalPeriodicCompaction6) {
774
809
 
775
810
  std::unique_ptr<Compaction> compaction(
776
811
  universal_compaction_picker.PickCompaction(
777
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
778
- &log_buffer_));
812
+ cf_name_, mutable_cf_options_, mutable_db_options_,
813
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
814
+ vstorage_.get(), &log_buffer_));
779
815
  ASSERT_TRUE(compaction);
780
816
  ASSERT_EQ(4, compaction->start_level());
781
817
  ASSERT_EQ(2U, compaction->num_input_files(0));
@@ -812,8 +848,9 @@ TEST_F(CompactionPickerTest, UniversalIncrementalSpace1) {
812
848
 
813
849
  std::unique_ptr<Compaction> compaction(
814
850
  universal_compaction_picker.PickCompaction(
815
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
816
- &log_buffer_));
851
+ cf_name_, mutable_cf_options_, mutable_db_options_,
852
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
853
+ vstorage_.get(), &log_buffer_));
817
854
  ASSERT_TRUE(compaction);
818
855
  ASSERT_EQ(4, compaction->output_level());
819
856
  ASSERT_EQ(3, compaction->start_level());
@@ -854,8 +891,9 @@ TEST_F(CompactionPickerTest, UniversalIncrementalSpace2) {
854
891
 
855
892
  std::unique_ptr<Compaction> compaction(
856
893
  universal_compaction_picker.PickCompaction(
857
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
858
- &log_buffer_));
894
+ cf_name_, mutable_cf_options_, mutable_db_options_,
895
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
896
+ vstorage_.get(), &log_buffer_));
859
897
  ASSERT_TRUE(compaction);
860
898
  ASSERT_EQ(4, compaction->output_level());
861
899
  ASSERT_EQ(2, compaction->start_level());
@@ -896,8 +934,9 @@ TEST_F(CompactionPickerTest, UniversalIncrementalSpace3) {
896
934
 
897
935
  std::unique_ptr<Compaction> compaction(
898
936
  universal_compaction_picker.PickCompaction(
899
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
900
- &log_buffer_));
937
+ cf_name_, mutable_cf_options_, mutable_db_options_,
938
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
939
+ vstorage_.get(), &log_buffer_));
901
940
  ASSERT_TRUE(compaction);
902
941
  ASSERT_EQ(4, compaction->output_level());
903
942
  ASSERT_EQ(2, compaction->start_level());
@@ -944,8 +983,9 @@ TEST_F(CompactionPickerTest, UniversalIncrementalSpace4) {
944
983
 
945
984
  std::unique_ptr<Compaction> compaction(
946
985
  universal_compaction_picker.PickCompaction(
947
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
948
- &log_buffer_));
986
+ cf_name_, mutable_cf_options_, mutable_db_options_,
987
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
988
+ vstorage_.get(), &log_buffer_));
949
989
  ASSERT_TRUE(compaction);
950
990
  ASSERT_EQ(4, compaction->output_level());
951
991
  ASSERT_EQ(3, compaction->start_level());
@@ -988,8 +1028,9 @@ TEST_F(CompactionPickerTest, UniversalIncrementalSpace5) {
988
1028
 
989
1029
  std::unique_ptr<Compaction> compaction(
990
1030
  universal_compaction_picker.PickCompaction(
991
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
992
- &log_buffer_));
1031
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1032
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1033
+ vstorage_.get(), &log_buffer_));
993
1034
  ASSERT_TRUE(compaction);
994
1035
  ASSERT_EQ(4, compaction->output_level());
995
1036
  ASSERT_EQ(3, compaction->start_level());
@@ -1040,8 +1081,9 @@ TEST_F(CompactionPickerTest,
1040
1081
  ASSERT_TRUE(universal_compaction_picker.NeedsCompaction(vstorage_.get()));
1041
1082
  std::unique_ptr<Compaction> compaction(
1042
1083
  universal_compaction_picker.PickCompaction(
1043
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1044
- &log_buffer_));
1084
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1085
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1086
+ vstorage_.get(), &log_buffer_));
1045
1087
  ASSERT_TRUE(compaction.get() != nullptr);
1046
1088
  ASSERT_EQ(compaction->compaction_reason(),
1047
1089
  CompactionReason::kUniversalSizeAmplification);
@@ -1082,230 +1124,326 @@ TEST_F(CompactionPickerTest, NeedsCompactionFIFO) {
1082
1124
  }
1083
1125
 
1084
1126
  TEST_F(CompactionPickerTest, FIFOToCold1) {
1085
- NewVersionStorage(1, kCompactionStyleFIFO);
1086
- const uint64_t kFileSize = 100000;
1087
- const uint64_t kMaxSize = kFileSize * 100000;
1088
- uint64_t kColdThreshold = 2000;
1089
-
1090
- fifo_options_.max_table_files_size = kMaxSize;
1091
- fifo_options_.file_temperature_age_thresholds = {
1092
- {Temperature::kCold, kColdThreshold}};
1093
- mutable_cf_options_.compaction_options_fifo = fifo_options_;
1094
- mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1095
- mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1096
- FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1097
-
1098
- int64_t current_time = 0;
1099
- ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1100
- uint64_t threshold_time =
1101
- static_cast<uint64_t>(current_time) - kColdThreshold;
1102
- Add(0 /* level */, 4U /* file_number */, "260", "300", 1 * kFileSize, 0, 2500,
1103
- 2600, 0, true, Temperature::kUnknown,
1104
- threshold_time - 2000 /* oldest_ancestor_time */);
1105
- // Qualifies for compaction to kCold.
1106
- Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1107
- Temperature::kUnknown, threshold_time - 3000);
1108
- UpdateVersionStorageInfo();
1127
+ // Test fallback behavior from newest_key_time to oldest_ancestor_time
1128
+ for (bool newestKeyTimeKnown : {false, true}) {
1129
+ NewVersionStorage(1, kCompactionStyleFIFO);
1130
+ const uint64_t kFileSize = 100000;
1131
+ const uint64_t kMaxSize = kFileSize * 100000;
1132
+ uint64_t kColdThreshold = 2000;
1133
+
1134
+ fifo_options_.max_table_files_size = kMaxSize;
1135
+ fifo_options_.file_temperature_age_thresholds = {
1136
+ {Temperature::kCold, kColdThreshold}};
1137
+ mutable_cf_options_.compaction_options_fifo = fifo_options_;
1138
+ mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1139
+ mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1140
+ FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1141
+
1142
+ int64_t current_time = 0;
1143
+ ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1144
+ uint64_t threshold_time =
1145
+ static_cast<uint64_t>(current_time) - kColdThreshold;
1146
+ Add(0 /* level */, 4U /* file_number */, "260", "300", 1 * kFileSize, 0,
1147
+ 2500, 2600, 0, true, Temperature::kUnknown,
1148
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1149
+ : threshold_time - 2000 /* oldest_ancestor_time */,
1150
+ newestKeyTimeKnown ? threshold_time - 2000
1151
+ : kUnknownNewestKeyTime /* newest_key_time */);
1152
+ // Qualifies for compaction to kCold.
1153
+ Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1154
+ Temperature::kUnknown,
1155
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 3000,
1156
+ newestKeyTimeKnown ? threshold_time - 3000
1157
+ : kUnknownNewestKeyTime /* newest_key_time */);
1158
+ UpdateVersionStorageInfo();
1109
1159
 
1110
- ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1111
- std::unique_ptr<Compaction> compaction(fifo_compaction_picker.PickCompaction(
1112
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1113
- &log_buffer_));
1114
- ASSERT_TRUE(compaction.get() != nullptr);
1115
- ASSERT_EQ(compaction->compaction_reason(),
1116
- CompactionReason::kChangeTemperature);
1117
- ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1118
- ASSERT_EQ(1U, compaction->num_input_files(0));
1119
- ASSERT_EQ(3U, compaction->input(0, 0)->fd.GetNumber());
1160
+ ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1161
+ std::unique_ptr<Compaction> compaction(
1162
+ fifo_compaction_picker.PickCompaction(
1163
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1164
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1165
+ vstorage_.get(), &log_buffer_));
1166
+ ASSERT_TRUE(compaction.get() != nullptr);
1167
+ ASSERT_EQ(compaction->compaction_reason(),
1168
+ CompactionReason::kChangeTemperature);
1169
+ ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1170
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1171
+ ASSERT_EQ(3U, compaction->input(0, 0)->fd.GetNumber());
1172
+ }
1120
1173
  }
1121
1174
 
1122
1175
  TEST_F(CompactionPickerTest, FIFOToColdMaxCompactionSize) {
1123
- NewVersionStorage(1, kCompactionStyleFIFO);
1124
- const uint64_t kFileSize = 100000;
1125
- const uint64_t kMaxSize = kFileSize * 100000;
1126
- uint64_t kColdThreshold = 2000;
1127
-
1128
- fifo_options_.max_table_files_size = kMaxSize;
1129
- fifo_options_.file_temperature_age_thresholds = {
1130
- {Temperature::kCold, kColdThreshold}};
1131
- mutable_cf_options_.compaction_options_fifo = fifo_options_;
1132
- mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1133
- mutable_cf_options_.max_compaction_bytes = kFileSize * 9;
1134
- FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1135
-
1136
- int64_t current_time = 0;
1137
- ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1138
- uint64_t threshold_time =
1139
- static_cast<uint64_t>(current_time) - kColdThreshold;
1140
- Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1141
- Temperature::kUnknown, static_cast<uint64_t>(current_time) - 100);
1142
- Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1143
- Temperature::kUnknown, threshold_time + 100);
1144
- Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1145
- Temperature::kUnknown, threshold_time - 2000);
1146
- // The following two files qualify for compaction to kCold.
1147
- // But only the last two should be included to respect `max_compaction_bytes`.
1148
- Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1149
- Temperature::kUnknown, threshold_time - 3000);
1150
- Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1151
- Temperature::kUnknown, threshold_time - 4000);
1152
- Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1153
- Temperature::kUnknown, threshold_time - 5000);
1154
- UpdateVersionStorageInfo();
1176
+ // Test fallback behavior from newest_key_time to oldest_ancestor_time
1177
+ for (bool newestKeyTimeKnown : {false, true}) {
1178
+ NewVersionStorage(1, kCompactionStyleFIFO);
1179
+ const uint64_t kFileSize = 100000;
1180
+ const uint64_t kMaxSize = kFileSize * 100000;
1181
+ uint64_t kColdThreshold = 2000;
1182
+
1183
+ fifo_options_.max_table_files_size = kMaxSize;
1184
+ fifo_options_.file_temperature_age_thresholds = {
1185
+ {Temperature::kCold, kColdThreshold}};
1186
+ mutable_cf_options_.compaction_options_fifo = fifo_options_;
1187
+ mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1188
+ mutable_cf_options_.max_compaction_bytes = kFileSize * 9;
1189
+ FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1190
+
1191
+ int64_t current_time = 0;
1192
+ ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1193
+ uint64_t threshold_time =
1194
+ static_cast<uint64_t>(current_time) - kColdThreshold;
1195
+ Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1196
+ Temperature::kUnknown,
1197
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1198
+ : static_cast<uint64_t>(current_time) - 100,
1199
+ newestKeyTimeKnown ? static_cast<uint64_t>(current_time) - 100
1200
+ : kUnknownNewestKeyTime);
1201
+ Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1202
+ Temperature::kUnknown,
1203
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time + 100,
1204
+ newestKeyTimeKnown ? threshold_time + 100 : kUnknownNewestKeyTime);
1205
+ Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1206
+ Temperature::kUnknown,
1207
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 2000,
1208
+ newestKeyTimeKnown ? threshold_time - 2000 : kUnknownNewestKeyTime);
1209
+ // The following two files qualify for compaction to kCold.
1210
+ // But only the last two should be included to respect
1211
+ // `max_compaction_bytes`.
1212
+ Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1213
+ Temperature::kUnknown,
1214
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 3000,
1215
+ newestKeyTimeKnown ? threshold_time - 3000 : kUnknownNewestKeyTime);
1216
+ Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1217
+ Temperature::kUnknown,
1218
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 4000,
1219
+ newestKeyTimeKnown ? threshold_time - 4000 : kUnknownNewestKeyTime);
1220
+ Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1221
+ Temperature::kUnknown,
1222
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 5000,
1223
+ newestKeyTimeKnown ? threshold_time - 5000 : kUnknownNewestKeyTime);
1224
+ UpdateVersionStorageInfo();
1155
1225
 
1156
- ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1157
- std::unique_ptr<Compaction> compaction(fifo_compaction_picker.PickCompaction(
1158
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1159
- &log_buffer_));
1160
- ASSERT_TRUE(compaction.get() != nullptr);
1161
- ASSERT_EQ(compaction->compaction_reason(),
1162
- CompactionReason::kChangeTemperature);
1163
- // Compaction picker picks older files first and picks one file at a time.
1164
- ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1165
- ASSERT_EQ(1U, compaction->num_input_files(0));
1166
- ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
1226
+ ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1227
+ std::unique_ptr<Compaction> compaction(
1228
+ fifo_compaction_picker.PickCompaction(
1229
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1230
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1231
+ vstorage_.get(), &log_buffer_));
1232
+ ASSERT_TRUE(compaction.get() != nullptr);
1233
+ ASSERT_EQ(compaction->compaction_reason(),
1234
+ CompactionReason::kChangeTemperature);
1235
+ // Compaction picker picks older files first and picks one file at a time.
1236
+ ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1237
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1238
+ ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
1239
+ }
1167
1240
  }
1168
1241
 
1169
1242
  TEST_F(CompactionPickerTest, FIFOToColdWithExistingCold) {
1170
- NewVersionStorage(1, kCompactionStyleFIFO);
1171
- const uint64_t kFileSize = 100000;
1172
- const uint64_t kMaxSize = kFileSize * 100000;
1173
- uint64_t kColdThreshold = 2000;
1174
-
1175
- fifo_options_.max_table_files_size = kMaxSize;
1176
- fifo_options_.file_temperature_age_thresholds = {
1177
- {Temperature::kCold, kColdThreshold}};
1178
- mutable_cf_options_.compaction_options_fifo = fifo_options_;
1179
- mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1180
- mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1181
- FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1182
-
1183
- int64_t current_time = 0;
1184
- ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1185
- uint64_t threshold_time =
1186
- static_cast<uint64_t>(current_time) - kColdThreshold;
1187
- Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1188
- Temperature::kUnknown, static_cast<uint64_t>(current_time) - 100);
1189
- Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1190
- Temperature::kUnknown, threshold_time + 100);
1191
- Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1192
- Temperature::kUnknown, threshold_time - 2000);
1193
- // The following two files qualify for compaction to kCold.
1194
- Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1195
- Temperature::kUnknown, threshold_time - 3000);
1196
- Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1197
- Temperature::kUnknown, threshold_time - 4000);
1198
- Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1199
- Temperature::kCold, threshold_time - 5000);
1200
- UpdateVersionStorageInfo();
1243
+ // Test fallback behavior from newest_key_time to oldest_ancestor_time
1244
+ for (bool newestKeyTimeKnown : {false, true}) {
1245
+ NewVersionStorage(1, kCompactionStyleFIFO);
1246
+ const uint64_t kFileSize = 100000;
1247
+ const uint64_t kMaxSize = kFileSize * 100000;
1248
+ uint64_t kColdThreshold = 2000;
1249
+
1250
+ fifo_options_.max_table_files_size = kMaxSize;
1251
+ fifo_options_.file_temperature_age_thresholds = {
1252
+ {Temperature::kCold, kColdThreshold}};
1253
+ mutable_cf_options_.compaction_options_fifo = fifo_options_;
1254
+ mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1255
+ mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1256
+ FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1257
+
1258
+ int64_t current_time = 0;
1259
+ ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1260
+ uint64_t threshold_time =
1261
+ static_cast<uint64_t>(current_time) - kColdThreshold;
1262
+ Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1263
+ Temperature::kUnknown,
1264
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1265
+ : static_cast<uint64_t>(current_time) - 100,
1266
+ newestKeyTimeKnown ? static_cast<uint64_t>(current_time) - 100
1267
+ : kUnknownNewestKeyTime);
1268
+ Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1269
+ Temperature::kUnknown,
1270
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time + 100,
1271
+ newestKeyTimeKnown ? threshold_time + 100 : kUnknownNewestKeyTime);
1272
+ Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1273
+ Temperature::kUnknown,
1274
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 2000,
1275
+ newestKeyTimeKnown ? threshold_time - 2000 : kUnknownNewestKeyTime);
1276
+ // The following two files qualify for compaction to kCold.
1277
+ Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1278
+ Temperature::kUnknown,
1279
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 3000,
1280
+ newestKeyTimeKnown ? threshold_time - 3000 : kUnknownNewestKeyTime);
1281
+ Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1282
+ Temperature::kUnknown,
1283
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 4000,
1284
+ newestKeyTimeKnown ? threshold_time - 4000 : kUnknownNewestKeyTime);
1285
+ Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1286
+ Temperature::kCold,
1287
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 5000,
1288
+ newestKeyTimeKnown ? threshold_time - 5000 : kUnknownNewestKeyTime);
1289
+ UpdateVersionStorageInfo();
1201
1290
 
1202
- ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1203
- std::unique_ptr<Compaction> compaction(fifo_compaction_picker.PickCompaction(
1204
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1205
- &log_buffer_));
1206
- ASSERT_TRUE(compaction.get() != nullptr);
1207
- ASSERT_EQ(compaction->compaction_reason(),
1208
- CompactionReason::kChangeTemperature);
1209
- // Compaction picker picks older files first and picks one file at a time.
1210
- ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1211
- ASSERT_EQ(1U, compaction->num_input_files(0));
1212
- ASSERT_EQ(2U, compaction->input(0, 0)->fd.GetNumber());
1291
+ ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1292
+ std::unique_ptr<Compaction> compaction(
1293
+ fifo_compaction_picker.PickCompaction(
1294
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1295
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1296
+ vstorage_.get(), &log_buffer_));
1297
+ ASSERT_TRUE(compaction.get() != nullptr);
1298
+ ASSERT_EQ(compaction->compaction_reason(),
1299
+ CompactionReason::kChangeTemperature);
1300
+ // Compaction picker picks older files first and picks one file at a time.
1301
+ ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1302
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1303
+ ASSERT_EQ(2U, compaction->input(0, 0)->fd.GetNumber());
1304
+ }
1213
1305
  }
1214
1306
 
1215
1307
  TEST_F(CompactionPickerTest, FIFOToColdWithHotBetweenCold) {
1216
- NewVersionStorage(1, kCompactionStyleFIFO);
1217
- const uint64_t kFileSize = 100000;
1218
- const uint64_t kMaxSize = kFileSize * 100000;
1219
- uint64_t kColdThreshold = 2000;
1220
-
1221
- fifo_options_.max_table_files_size = kMaxSize;
1222
- fifo_options_.file_temperature_age_thresholds = {
1223
- {Temperature::kCold, kColdThreshold}};
1224
- mutable_cf_options_.compaction_options_fifo = fifo_options_;
1225
- mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1226
- mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1227
- FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1228
-
1229
- int64_t current_time = 0;
1230
- ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1231
- uint64_t threshold_time =
1232
- static_cast<uint64_t>(current_time) - kColdThreshold;
1233
- Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1234
- Temperature::kUnknown, static_cast<uint64_t>(current_time) - 100);
1235
- Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1236
- Temperature::kUnknown, threshold_time + 100);
1237
- Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1238
- Temperature::kUnknown, threshold_time - 2000);
1239
- Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1240
- Temperature::kCold, threshold_time - 3000);
1241
- // Qualifies for compaction to kCold.
1242
- Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1243
- Temperature::kUnknown, threshold_time - 4000);
1244
- Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1245
- Temperature::kCold, threshold_time - 5000);
1246
- UpdateVersionStorageInfo();
1308
+ // Test fallback behavior from newest_key_time to oldest_ancestor_time
1309
+ for (bool newestKeyTimeKnown : {false, true}) {
1310
+ NewVersionStorage(1, kCompactionStyleFIFO);
1311
+ const uint64_t kFileSize = 100000;
1312
+ const uint64_t kMaxSize = kFileSize * 100000;
1313
+ uint64_t kColdThreshold = 2000;
1314
+
1315
+ fifo_options_.max_table_files_size = kMaxSize;
1316
+ fifo_options_.file_temperature_age_thresholds = {
1317
+ {Temperature::kCold, kColdThreshold}};
1318
+ mutable_cf_options_.compaction_options_fifo = fifo_options_;
1319
+ mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1320
+ mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1321
+ FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1322
+
1323
+ int64_t current_time = 0;
1324
+ ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1325
+ uint64_t threshold_time =
1326
+ static_cast<uint64_t>(current_time) - kColdThreshold;
1327
+ Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1328
+ Temperature::kUnknown,
1329
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1330
+ : static_cast<uint64_t>(current_time) - 100,
1331
+ newestKeyTimeKnown ? static_cast<uint64_t>(current_time) - 100
1332
+ : kUnknownNewestKeyTime);
1333
+ Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1334
+ Temperature::kUnknown,
1335
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time + 100,
1336
+ newestKeyTimeKnown ? threshold_time + 100 : kUnknownNewestKeyTime);
1337
+ Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1338
+ Temperature::kUnknown,
1339
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 2000,
1340
+ newestKeyTimeKnown ? threshold_time - 2000 : kUnknownNewestKeyTime);
1341
+ Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1342
+ Temperature::kCold,
1343
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 3000,
1344
+ newestKeyTimeKnown ? threshold_time - 3000 : kUnknownNewestKeyTime);
1345
+ // Qualifies for compaction to kCold.
1346
+ Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1347
+ Temperature::kUnknown,
1348
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 4000,
1349
+ newestKeyTimeKnown ? threshold_time - 4000 : kUnknownNewestKeyTime);
1350
+ Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1351
+ Temperature::kCold,
1352
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime : threshold_time - 5000,
1353
+ newestKeyTimeKnown ? threshold_time - 5000 : kUnknownNewestKeyTime);
1354
+ UpdateVersionStorageInfo();
1247
1355
 
1248
- ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1249
- std::unique_ptr<Compaction> compaction(fifo_compaction_picker.PickCompaction(
1250
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1251
- &log_buffer_));
1252
- ASSERT_TRUE(compaction.get() != nullptr);
1253
- ASSERT_EQ(compaction->compaction_reason(),
1254
- CompactionReason::kChangeTemperature);
1255
- ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1256
- ASSERT_EQ(1U, compaction->num_input_files(0));
1257
- ASSERT_EQ(2U, compaction->input(0, 0)->fd.GetNumber());
1356
+ ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1357
+ std::unique_ptr<Compaction> compaction(
1358
+ fifo_compaction_picker.PickCompaction(
1359
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1360
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1361
+ vstorage_.get(), &log_buffer_));
1362
+ ASSERT_TRUE(compaction.get() != nullptr);
1363
+ ASSERT_EQ(compaction->compaction_reason(),
1364
+ CompactionReason::kChangeTemperature);
1365
+ ASSERT_EQ(compaction->output_temperature(), Temperature::kCold);
1366
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1367
+ ASSERT_EQ(2U, compaction->input(0, 0)->fd.GetNumber());
1368
+ }
1258
1369
  }
1259
1370
 
1260
1371
  TEST_F(CompactionPickerTest, FIFOToHotAndWarm) {
1261
- NewVersionStorage(1, kCompactionStyleFIFO);
1262
- const uint64_t kFileSize = 100000;
1263
- const uint64_t kMaxSize = kFileSize * 100000;
1264
- uint64_t kWarmThreshold = 10000;
1265
- uint64_t kHotThreshold = 2000;
1266
-
1267
- fifo_options_.max_table_files_size = kMaxSize;
1268
- // Test that multiple threshold works.
1269
- fifo_options_.file_temperature_age_thresholds = {
1270
- {Temperature::kHot, kHotThreshold}, {Temperature::kWarm, kWarmThreshold}};
1271
- mutable_cf_options_.compaction_options_fifo = fifo_options_;
1272
- mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1273
- mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1274
- FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1275
-
1276
- int64_t current_time = 0;
1277
- ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1278
- uint64_t hot_threshold_time =
1279
- static_cast<uint64_t>(current_time) - kHotThreshold;
1280
- uint64_t warm_threshold_time =
1281
- static_cast<uint64_t>(current_time) - kWarmThreshold;
1282
- Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1283
- Temperature::kUnknown, static_cast<uint64_t>(current_time) - 100);
1284
- Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1285
- Temperature::kUnknown, hot_threshold_time + 100);
1286
- Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1287
- Temperature::kUnknown, hot_threshold_time - 200);
1288
- // Qualifies for Hot
1289
- Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1290
- Temperature::kUnknown, warm_threshold_time - 100);
1291
- // Qualifies for Warm
1292
- Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1293
- Temperature::kUnknown, warm_threshold_time - 4000);
1294
- Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1295
- Temperature::kUnknown, warm_threshold_time - 5000);
1296
- UpdateVersionStorageInfo();
1372
+ // Test fallback behavior from newest_key_time to oldest_ancestor_time
1373
+ for (bool newestKeyTimeKnown : {false, true}) {
1374
+ NewVersionStorage(1, kCompactionStyleFIFO);
1375
+ const uint64_t kFileSize = 100000;
1376
+ const uint64_t kMaxSize = kFileSize * 100000;
1377
+ uint64_t kWarmThreshold = 10000;
1378
+ uint64_t kHotThreshold = 2000;
1379
+
1380
+ fifo_options_.max_table_files_size = kMaxSize;
1381
+ // Test that multiple threshold works.
1382
+ fifo_options_.file_temperature_age_thresholds = {
1383
+ {Temperature::kHot, kHotThreshold},
1384
+ {Temperature::kWarm, kWarmThreshold}};
1385
+ mutable_cf_options_.compaction_options_fifo = fifo_options_;
1386
+ mutable_cf_options_.level0_file_num_compaction_trigger = 100;
1387
+ mutable_cf_options_.max_compaction_bytes = kFileSize * 100;
1388
+ FIFOCompactionPicker fifo_compaction_picker(ioptions_, &icmp_);
1389
+
1390
+ int64_t current_time = 0;
1391
+ ASSERT_OK(Env::Default()->GetCurrentTime(&current_time));
1392
+ uint64_t hot_threshold_time =
1393
+ static_cast<uint64_t>(current_time) - kHotThreshold;
1394
+ uint64_t warm_threshold_time =
1395
+ static_cast<uint64_t>(current_time) - kWarmThreshold;
1396
+ Add(0, 6U, "240", "290", 2 * kFileSize, 0, 2900, 3000, 0, true,
1397
+ Temperature::kUnknown,
1398
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1399
+ : static_cast<uint64_t>(current_time) - 100,
1400
+ newestKeyTimeKnown ? static_cast<uint64_t>(current_time) - 100
1401
+ : kUnknownNewestKeyTime);
1402
+ Add(0, 5U, "240", "290", 2 * kFileSize, 0, 2700, 2800, 0, true,
1403
+ Temperature::kUnknown,
1404
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1405
+ : hot_threshold_time + 100,
1406
+ newestKeyTimeKnown ? hot_threshold_time + 100 : kUnknownNewestKeyTime);
1407
+ Add(0, 4U, "260", "300", 1 * kFileSize, 0, 2500, 2600, 0, true,
1408
+ Temperature::kUnknown,
1409
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1410
+ : hot_threshold_time - 200,
1411
+ newestKeyTimeKnown ? hot_threshold_time - 200 : kUnknownNewestKeyTime);
1412
+ // Qualifies for Hot
1413
+ Add(0, 3U, "200", "300", 4 * kFileSize, 0, 2300, 2400, 0, true,
1414
+ Temperature::kUnknown,
1415
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1416
+ : warm_threshold_time - 100,
1417
+ newestKeyTimeKnown ? warm_threshold_time - 100 : kUnknownNewestKeyTime);
1418
+ // Qualifies for Warm
1419
+ Add(0, 2U, "200", "300", 4 * kFileSize, 0, 2100, 2200, 0, true,
1420
+ Temperature::kUnknown,
1421
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1422
+ : warm_threshold_time - 4000,
1423
+ newestKeyTimeKnown ? warm_threshold_time - 4000
1424
+ : kUnknownNewestKeyTime);
1425
+ Add(0, 1U, "200", "300", 4 * kFileSize, 0, 2000, 2100, 0, true,
1426
+ Temperature::kUnknown,
1427
+ newestKeyTimeKnown ? kUnknownOldestAncesterTime
1428
+ : warm_threshold_time - 5000,
1429
+ newestKeyTimeKnown ? warm_threshold_time - 5000
1430
+ : kUnknownNewestKeyTime);
1431
+ UpdateVersionStorageInfo();
1297
1432
 
1298
- ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1299
- std::unique_ptr<Compaction> compaction(fifo_compaction_picker.PickCompaction(
1300
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1301
- &log_buffer_));
1302
- ASSERT_TRUE(compaction.get() != nullptr);
1303
- ASSERT_EQ(compaction->compaction_reason(),
1304
- CompactionReason::kChangeTemperature);
1305
- // Compaction picker picks older files first and picks one file at a time.
1306
- ASSERT_EQ(compaction->output_temperature(), Temperature::kWarm);
1307
- ASSERT_EQ(1U, compaction->num_input_files(0));
1308
- ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
1433
+ ASSERT_EQ(fifo_compaction_picker.NeedsCompaction(vstorage_.get()), true);
1434
+ std::unique_ptr<Compaction> compaction(
1435
+ fifo_compaction_picker.PickCompaction(
1436
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1437
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1438
+ vstorage_.get(), &log_buffer_));
1439
+ ASSERT_TRUE(compaction.get() != nullptr);
1440
+ ASSERT_EQ(compaction->compaction_reason(),
1441
+ CompactionReason::kChangeTemperature);
1442
+ // Compaction picker picks older files first and picks one file at a time.
1443
+ ASSERT_EQ(compaction->output_temperature(), Temperature::kWarm);
1444
+ ASSERT_EQ(1U, compaction->num_input_files(0));
1445
+ ASSERT_EQ(1U, compaction->input(0, 0)->fd.GetNumber());
1446
+ }
1309
1447
  }
1310
1448
 
1311
1449
  TEST_F(CompactionPickerTest, CompactionPriMinOverlapping1) {
@@ -1329,8 +1467,9 @@ TEST_F(CompactionPickerTest, CompactionPriMinOverlapping1) {
1329
1467
  UpdateVersionStorageInfo();
1330
1468
 
1331
1469
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1332
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1333
- &log_buffer_));
1470
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1471
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1472
+ vstorage_.get(), &log_buffer_));
1334
1473
  ASSERT_TRUE(compaction.get() != nullptr);
1335
1474
  ASSERT_EQ(1U, compaction->num_input_files(0));
1336
1475
  // Pick file 8 because it overlaps with 0 files on level 3.
@@ -1362,8 +1501,9 @@ TEST_F(CompactionPickerTest, CompactionPriMinOverlapping2) {
1362
1501
  UpdateVersionStorageInfo();
1363
1502
 
1364
1503
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1365
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1366
- &log_buffer_));
1504
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1505
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1506
+ vstorage_.get(), &log_buffer_));
1367
1507
  ASSERT_TRUE(compaction.get() != nullptr);
1368
1508
  ASSERT_EQ(1U, compaction->num_input_files(0));
1369
1509
  // Picking file 7 because overlapping ratio is the biggest.
@@ -1390,8 +1530,9 @@ TEST_F(CompactionPickerTest, CompactionPriMinOverlapping3) {
1390
1530
  UpdateVersionStorageInfo();
1391
1531
 
1392
1532
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1393
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1394
- &log_buffer_));
1533
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1534
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1535
+ vstorage_.get(), &log_buffer_));
1395
1536
  ASSERT_TRUE(compaction.get() != nullptr);
1396
1537
  ASSERT_EQ(1U, compaction->num_input_files(0));
1397
1538
  // Picking file 8 because overlapping ratio is the biggest.
@@ -1418,8 +1559,9 @@ TEST_F(CompactionPickerTest, CompactionPriMinOverlapping4) {
1418
1559
  UpdateVersionStorageInfo();
1419
1560
 
1420
1561
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1421
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1422
- &log_buffer_));
1562
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1563
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1564
+ vstorage_.get(), &log_buffer_));
1423
1565
  ASSERT_TRUE(compaction.get() != nullptr);
1424
1566
  ASSERT_EQ(1U, compaction->num_input_files(0));
1425
1567
  // Picking file 6 because overlapping ratio is the biggest.
@@ -1454,8 +1596,9 @@ TEST_F(CompactionPickerTest, CompactionPriRoundRobin) {
1454
1596
  LevelCompactionPicker(ioptions_, &icmp_);
1455
1597
  std::unique_ptr<Compaction> compaction(
1456
1598
  local_level_compaction_picker.PickCompaction(
1457
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1458
- &log_buffer_));
1599
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1600
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1601
+ vstorage_.get(), &log_buffer_));
1459
1602
  ASSERT_TRUE(compaction.get() != nullptr);
1460
1603
  // Since the max bytes for level 2 is 120M, picking one file to compact
1461
1604
  // makes the post-compaction level size less than 120M, there is exactly one
@@ -1494,8 +1637,9 @@ TEST_F(CompactionPickerTest, CompactionPriMultipleFilesRoundRobin1) {
1494
1637
  LevelCompactionPicker(ioptions_, &icmp_);
1495
1638
  std::unique_ptr<Compaction> compaction(
1496
1639
  local_level_compaction_picker.PickCompaction(
1497
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1498
- &log_buffer_));
1640
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1641
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1642
+ vstorage_.get(), &log_buffer_));
1499
1643
  ASSERT_TRUE(compaction.get() != nullptr);
1500
1644
 
1501
1645
  // The maximum compaction bytes is very large in this case so we can igore its
@@ -1537,8 +1681,9 @@ TEST_F(CompactionPickerTest, CompactionPriMultipleFilesRoundRobin2) {
1537
1681
  LevelCompactionPicker(ioptions_, &icmp_);
1538
1682
  std::unique_ptr<Compaction> compaction(
1539
1683
  local_level_compaction_picker.PickCompaction(
1540
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1541
- &log_buffer_));
1684
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1685
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1686
+ vstorage_.get(), &log_buffer_));
1542
1687
  ASSERT_TRUE(compaction.get() != nullptr);
1543
1688
 
1544
1689
  // The maximum compaction bytes is only 2500 bytes now. Even though we are
@@ -1581,8 +1726,9 @@ TEST_F(CompactionPickerTest, CompactionPriMultipleFilesRoundRobin3) {
1581
1726
  LevelCompactionPicker(ioptions_, &icmp_);
1582
1727
  std::unique_ptr<Compaction> compaction(
1583
1728
  local_level_compaction_picker.PickCompaction(
1584
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1585
- &log_buffer_));
1729
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1730
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1731
+ vstorage_.get(), &log_buffer_));
1586
1732
  ASSERT_TRUE(compaction.get() != nullptr);
1587
1733
 
1588
1734
  // Cannot pick more files since we reach the last file in level 2
@@ -1640,8 +1786,9 @@ TEST_F(CompactionPickerTest, CompactionPriMinOverlappingManyFiles) {
1640
1786
  UpdateVersionStorageInfo();
1641
1787
 
1642
1788
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1643
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1644
- &log_buffer_));
1789
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1790
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1791
+ vstorage_.get(), &log_buffer_));
1645
1792
  ASSERT_TRUE(compaction.get() != nullptr);
1646
1793
  ASSERT_EQ(1U, compaction->num_input_files(0));
1647
1794
  // Picking file 8 because overlapping ratio is the biggest.
@@ -1668,8 +1815,9 @@ TEST_F(CompactionPickerTest, ParentIndexResetBug) {
1668
1815
  UpdateVersionStorageInfo();
1669
1816
 
1670
1817
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1671
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1672
- &log_buffer_));
1818
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1819
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1820
+ vstorage_.get(), &log_buffer_));
1673
1821
  }
1674
1822
 
1675
1823
  // This test checks ExpandWhileOverlapping() by having overlapping user keys
@@ -1686,8 +1834,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys) {
1686
1834
  UpdateVersionStorageInfo();
1687
1835
 
1688
1836
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1689
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1690
- &log_buffer_));
1837
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1838
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1839
+ vstorage_.get(), &log_buffer_));
1691
1840
  ASSERT_TRUE(compaction.get() != nullptr);
1692
1841
  ASSERT_EQ(1U, compaction->num_input_levels());
1693
1842
  ASSERT_EQ(2U, compaction->num_input_files(0));
@@ -1706,8 +1855,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys2) {
1706
1855
  UpdateVersionStorageInfo();
1707
1856
 
1708
1857
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1709
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1710
- &log_buffer_));
1858
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1859
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1860
+ vstorage_.get(), &log_buffer_));
1711
1861
  ASSERT_TRUE(compaction.get() != nullptr);
1712
1862
  ASSERT_EQ(2U, compaction->num_input_levels());
1713
1863
  ASSERT_EQ(2U, compaction->num_input_files(0));
@@ -1734,8 +1884,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys3) {
1734
1884
  UpdateVersionStorageInfo();
1735
1885
 
1736
1886
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1737
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1738
- &log_buffer_));
1887
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1888
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1889
+ vstorage_.get(), &log_buffer_));
1739
1890
  ASSERT_TRUE(compaction.get() != nullptr);
1740
1891
  ASSERT_EQ(2U, compaction->num_input_levels());
1741
1892
  ASSERT_EQ(5U, compaction->num_input_files(0));
@@ -1765,8 +1916,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys4) {
1765
1916
  UpdateVersionStorageInfo();
1766
1917
 
1767
1918
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1768
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1769
- &log_buffer_));
1919
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1920
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1921
+ vstorage_.get(), &log_buffer_));
1770
1922
  ASSERT_TRUE(compaction.get() != nullptr);
1771
1923
  ASSERT_EQ(2U, compaction->num_input_levels());
1772
1924
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -1789,8 +1941,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys5) {
1789
1941
  UpdateVersionStorageInfo();
1790
1942
 
1791
1943
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1792
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1793
- &log_buffer_));
1944
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1945
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1946
+ vstorage_.get(), &log_buffer_));
1794
1947
  ASSERT_TRUE(compaction.get() == nullptr);
1795
1948
  }
1796
1949
 
@@ -1811,8 +1964,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys6) {
1811
1964
  UpdateVersionStorageInfo();
1812
1965
 
1813
1966
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1814
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1815
- &log_buffer_));
1967
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1968
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1969
+ vstorage_.get(), &log_buffer_));
1816
1970
  ASSERT_TRUE(compaction.get() != nullptr);
1817
1971
  ASSERT_EQ(2U, compaction->num_input_levels());
1818
1972
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -1832,8 +1986,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys7) {
1832
1986
  UpdateVersionStorageInfo();
1833
1987
 
1834
1988
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1835
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1836
- &log_buffer_));
1989
+ cf_name_, mutable_cf_options_, mutable_db_options_,
1990
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
1991
+ vstorage_.get(), &log_buffer_));
1837
1992
  ASSERT_TRUE(compaction.get() != nullptr);
1838
1993
  ASSERT_EQ(2U, compaction->num_input_levels());
1839
1994
  ASSERT_GE(1U, compaction->num_input_files(0));
@@ -1861,8 +2016,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys8) {
1861
2016
  UpdateVersionStorageInfo();
1862
2017
 
1863
2018
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1864
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1865
- &log_buffer_));
2019
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2020
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2021
+ vstorage_.get(), &log_buffer_));
1866
2022
  ASSERT_TRUE(compaction.get() != nullptr);
1867
2023
  ASSERT_EQ(2U, compaction->num_input_levels());
1868
2024
  ASSERT_EQ(3U, compaction->num_input_files(0));
@@ -1894,8 +2050,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys9) {
1894
2050
  UpdateVersionStorageInfo();
1895
2051
 
1896
2052
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1897
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1898
- &log_buffer_));
2053
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2054
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2055
+ vstorage_.get(), &log_buffer_));
1899
2056
  ASSERT_TRUE(compaction.get() != nullptr);
1900
2057
  ASSERT_EQ(2U, compaction->num_input_levels());
1901
2058
  ASSERT_EQ(5U, compaction->num_input_files(0));
@@ -1935,8 +2092,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys10) {
1935
2092
  UpdateVersionStorageInfo();
1936
2093
 
1937
2094
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1938
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1939
- &log_buffer_));
2095
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2096
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2097
+ vstorage_.get(), &log_buffer_));
1940
2098
  ASSERT_TRUE(compaction.get() != nullptr);
1941
2099
  ASSERT_EQ(2U, compaction->num_input_levels());
1942
2100
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -1974,8 +2132,9 @@ TEST_F(CompactionPickerTest, OverlappingUserKeys11) {
1974
2132
  UpdateVersionStorageInfo();
1975
2133
 
1976
2134
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
1977
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
1978
- &log_buffer_));
2135
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2136
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2137
+ vstorage_.get(), &log_buffer_));
1979
2138
  ASSERT_TRUE(compaction.get() != nullptr);
1980
2139
  ASSERT_EQ(2U, compaction->num_input_levels());
1981
2140
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -2081,8 +2240,9 @@ TEST_F(CompactionPickerTest, NotScheduleL1IfL0WithHigherPri1) {
2081
2240
  ASSERT_EQ(0, vstorage_->CompactionScoreLevel(0));
2082
2241
  ASSERT_EQ(1, vstorage_->CompactionScoreLevel(1));
2083
2242
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2084
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2085
- &log_buffer_));
2243
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2244
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2245
+ vstorage_.get(), &log_buffer_));
2086
2246
  ASSERT_TRUE(compaction.get() == nullptr);
2087
2247
  }
2088
2248
 
@@ -2112,8 +2272,9 @@ TEST_F(CompactionPickerTest, NotScheduleL1IfL0WithHigherPri2) {
2112
2272
  ASSERT_EQ(0, vstorage_->CompactionScoreLevel(0));
2113
2273
  ASSERT_EQ(1, vstorage_->CompactionScoreLevel(1));
2114
2274
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2115
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2116
- &log_buffer_));
2275
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2276
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2277
+ vstorage_.get(), &log_buffer_));
2117
2278
  ASSERT_TRUE(compaction.get() != nullptr);
2118
2279
  }
2119
2280
 
@@ -2146,8 +2307,9 @@ TEST_F(CompactionPickerTest, NotScheduleL1IfL0WithHigherPri3) {
2146
2307
  ASSERT_EQ(1, vstorage_->CompactionScoreLevel(0));
2147
2308
  ASSERT_EQ(0, vstorage_->CompactionScoreLevel(1));
2148
2309
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2149
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2150
- &log_buffer_));
2310
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2311
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2312
+ vstorage_.get(), &log_buffer_));
2151
2313
  ASSERT_TRUE(compaction.get() != nullptr);
2152
2314
  }
2153
2315
 
@@ -2447,8 +2609,9 @@ TEST_F(CompactionPickerTest, CompactionLimitWhenAddFileFromInputLevel) {
2447
2609
  UpdateVersionStorageInfo();
2448
2610
 
2449
2611
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2450
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2451
- &log_buffer_));
2612
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2613
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2614
+ vstorage_.get(), &log_buffer_));
2452
2615
  ASSERT_TRUE(compaction.get() != nullptr);
2453
2616
  ASSERT_EQ(2U, compaction->num_input_levels());
2454
2617
  ASSERT_EQ(4U, compaction->num_input_files(0));
@@ -2482,8 +2645,9 @@ TEST_F(CompactionPickerTest, HitCompactionLimitWhenAddFileFromInputLevel) {
2482
2645
  UpdateVersionStorageInfo();
2483
2646
 
2484
2647
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2485
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2486
- &log_buffer_));
2648
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2649
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2650
+ vstorage_.get(), &log_buffer_));
2487
2651
  ASSERT_TRUE(compaction.get() != nullptr);
2488
2652
  ASSERT_EQ(2U, compaction->num_input_levels());
2489
2653
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -2510,8 +2674,9 @@ TEST_F(CompactionPickerTest, IsTrivialMoveOn) {
2510
2674
  UpdateVersionStorageInfo();
2511
2675
 
2512
2676
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2513
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2514
- &log_buffer_));
2677
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2678
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2679
+ vstorage_.get(), &log_buffer_));
2515
2680
  ASSERT_TRUE(compaction.get() != nullptr);
2516
2681
  ASSERT_TRUE(compaction->IsTrivialMove());
2517
2682
  }
@@ -2535,8 +2700,9 @@ TEST_F(CompactionPickerTest, L0TrivialMove1) {
2535
2700
  UpdateVersionStorageInfo();
2536
2701
 
2537
2702
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2538
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2539
- &log_buffer_));
2703
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2704
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2705
+ vstorage_.get(), &log_buffer_));
2540
2706
  ASSERT_TRUE(compaction.get() != nullptr);
2541
2707
  ASSERT_EQ(1, compaction->num_input_levels());
2542
2708
  ASSERT_EQ(2, compaction->num_input_files(0));
@@ -2564,8 +2730,9 @@ TEST_F(CompactionPickerTest, L0TrivialMoveOneFile) {
2564
2730
  UpdateVersionStorageInfo();
2565
2731
 
2566
2732
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2567
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2568
- &log_buffer_));
2733
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2734
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2735
+ vstorage_.get(), &log_buffer_));
2569
2736
  ASSERT_TRUE(compaction.get() != nullptr);
2570
2737
  ASSERT_EQ(1, compaction->num_input_levels());
2571
2738
  ASSERT_EQ(1, compaction->num_input_files(0));
@@ -2590,8 +2757,9 @@ TEST_F(CompactionPickerTest, L0TrivialMoveWholeL0) {
2590
2757
  UpdateVersionStorageInfo();
2591
2758
 
2592
2759
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2593
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2594
- &log_buffer_));
2760
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2761
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2762
+ vstorage_.get(), &log_buffer_));
2595
2763
  ASSERT_TRUE(compaction.get() != nullptr);
2596
2764
  ASSERT_EQ(1, compaction->num_input_levels());
2597
2765
  ASSERT_EQ(4, compaction->num_input_files(0));
@@ -2618,8 +2786,9 @@ TEST_F(CompactionPickerTest, NonL0TrivialMoveExtendBothDirection) {
2618
2786
  // File #2 should be picked first, and expand both directions to include
2619
2787
  // files #1 and #3.
2620
2788
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2621
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2622
- &log_buffer_));
2789
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2790
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2791
+ vstorage_.get(), &log_buffer_));
2623
2792
  ASSERT_TRUE(compaction.get() != nullptr);
2624
2793
  ASSERT_EQ(1, compaction->num_input_levels());
2625
2794
  ASSERT_EQ(3, compaction->num_input_files(0));
@@ -2648,8 +2817,9 @@ TEST_F(CompactionPickerTest, L0TrivialMoveToEmptyLevel) {
2648
2817
  UpdateVersionStorageInfo();
2649
2818
 
2650
2819
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2651
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2652
- &log_buffer_));
2820
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2821
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2822
+ vstorage_.get(), &log_buffer_));
2653
2823
  ASSERT_TRUE(compaction.get() != nullptr);
2654
2824
  ASSERT_EQ(1, compaction->num_input_levels());
2655
2825
  ASSERT_EQ(1, compaction->num_input_files(0));
@@ -2676,8 +2846,9 @@ TEST_F(CompactionPickerTest, IsTrivialMoveOffSstPartitioned) {
2676
2846
  UpdateVersionStorageInfo();
2677
2847
 
2678
2848
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2679
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2680
- &log_buffer_));
2849
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2850
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2851
+ vstorage_.get(), &log_buffer_));
2681
2852
  ASSERT_TRUE(compaction.get() != nullptr);
2682
2853
  // No trivial move, because partitioning is applied
2683
2854
  ASSERT_TRUE(!compaction->IsTrivialMove());
@@ -2699,8 +2870,9 @@ TEST_F(CompactionPickerTest, IsTrivialMoveOff) {
2699
2870
  UpdateVersionStorageInfo();
2700
2871
 
2701
2872
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2702
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2703
- &log_buffer_));
2873
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2874
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2875
+ vstorage_.get(), &log_buffer_));
2704
2876
  ASSERT_TRUE(compaction.get() != nullptr);
2705
2877
  ASSERT_FALSE(compaction->IsTrivialMove());
2706
2878
  }
@@ -2728,8 +2900,9 @@ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles1) {
2728
2900
  UpdateVersionStorageInfo();
2729
2901
 
2730
2902
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2731
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2732
- &log_buffer_));
2903
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2904
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2905
+ vstorage_.get(), &log_buffer_));
2733
2906
  ASSERT_TRUE(compaction.get() != nullptr);
2734
2907
  ASSERT_TRUE(compaction->IsTrivialMove());
2735
2908
  ASSERT_EQ(1, compaction->num_input_levels());
@@ -2762,8 +2935,9 @@ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles2) {
2762
2935
  UpdateVersionStorageInfo();
2763
2936
 
2764
2937
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2765
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2766
- &log_buffer_));
2938
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2939
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2940
+ vstorage_.get(), &log_buffer_));
2767
2941
  ASSERT_TRUE(compaction.get() != nullptr);
2768
2942
  ASSERT_TRUE(compaction->IsTrivialMove());
2769
2943
  ASSERT_EQ(1, compaction->num_input_levels());
@@ -2795,8 +2969,9 @@ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles3) {
2795
2969
  UpdateVersionStorageInfo();
2796
2970
 
2797
2971
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2798
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2799
- &log_buffer_));
2972
+ cf_name_, mutable_cf_options_, mutable_db_options_,
2973
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
2974
+ vstorage_.get(), &log_buffer_));
2800
2975
  ASSERT_TRUE(compaction.get() != nullptr);
2801
2976
  ASSERT_TRUE(compaction->IsTrivialMove());
2802
2977
  ASSERT_EQ(1, compaction->num_input_levels());
@@ -2821,8 +2996,9 @@ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles4) {
2821
2996
  UpdateVersionStorageInfo();
2822
2997
 
2823
2998
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2824
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2825
- &log_buffer_));
2999
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3000
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3001
+ vstorage_.get(), &log_buffer_));
2826
3002
  ASSERT_TRUE(compaction.get() != nullptr);
2827
3003
  ASSERT_TRUE(compaction->IsTrivialMove());
2828
3004
  ASSERT_EQ(1, compaction->num_input_levels());
@@ -2851,8 +3027,9 @@ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles5) {
2851
3027
  UpdateVersionStorageInfo();
2852
3028
 
2853
3029
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2854
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2855
- &log_buffer_));
3030
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3031
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3032
+ vstorage_.get(), &log_buffer_));
2856
3033
  ASSERT_TRUE(compaction.get() != nullptr);
2857
3034
  ASSERT_TRUE(compaction->IsTrivialMove());
2858
3035
  ASSERT_EQ(1, compaction->num_input_levels());
@@ -2885,8 +3062,9 @@ TEST_F(CompactionPickerTest, TrivialMoveMultipleFiles6) {
2885
3062
  UpdateVersionStorageInfo();
2886
3063
 
2887
3064
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2888
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2889
- &log_buffer_));
3065
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3066
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3067
+ vstorage_.get(), &log_buffer_));
2890
3068
  ASSERT_TRUE(compaction.get() != nullptr);
2891
3069
  ASSERT_TRUE(compaction->IsTrivialMove());
2892
3070
  ASSERT_EQ(1, compaction->num_input_levels());
@@ -2920,8 +3098,9 @@ TEST_F(CompactionPickerTest, CacheNextCompactionIndex) {
2920
3098
  UpdateVersionStorageInfo();
2921
3099
 
2922
3100
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2923
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2924
- &log_buffer_));
3101
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3102
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3103
+ vstorage_.get(), &log_buffer_));
2925
3104
  ASSERT_TRUE(compaction.get() != nullptr);
2926
3105
  ASSERT_EQ(2U, compaction->num_input_levels());
2927
3106
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -2930,8 +3109,9 @@ TEST_F(CompactionPickerTest, CacheNextCompactionIndex) {
2930
3109
  ASSERT_EQ(2, vstorage_->NextCompactionIndex(1 /* level */));
2931
3110
 
2932
3111
  compaction.reset(level_compaction_picker.PickCompaction(
2933
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2934
- &log_buffer_));
3112
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3113
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3114
+ vstorage_.get(), &log_buffer_));
2935
3115
  ASSERT_TRUE(compaction.get() != nullptr);
2936
3116
  ASSERT_EQ(2U, compaction->num_input_levels());
2937
3117
  ASSERT_EQ(1U, compaction->num_input_files(0));
@@ -2940,8 +3120,9 @@ TEST_F(CompactionPickerTest, CacheNextCompactionIndex) {
2940
3120
  ASSERT_EQ(3, vstorage_->NextCompactionIndex(1 /* level */));
2941
3121
 
2942
3122
  compaction.reset(level_compaction_picker.PickCompaction(
2943
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2944
- &log_buffer_));
3123
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3124
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3125
+ vstorage_.get(), &log_buffer_));
2945
3126
  ASSERT_TRUE(compaction.get() == nullptr);
2946
3127
  ASSERT_EQ(4, vstorage_->NextCompactionIndex(1 /* level */));
2947
3128
  }
@@ -2966,8 +3147,9 @@ TEST_F(CompactionPickerTest, IntraL0MaxCompactionBytesNotHit) {
2966
3147
  UpdateVersionStorageInfo();
2967
3148
 
2968
3149
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
2969
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
2970
- &log_buffer_));
3150
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3151
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3152
+ vstorage_.get(), &log_buffer_));
2971
3153
  ASSERT_TRUE(compaction.get() != nullptr);
2972
3154
  ASSERT_EQ(1U, compaction->num_input_levels());
2973
3155
  ASSERT_EQ(5U, compaction->num_input_files(0));
@@ -2997,8 +3179,9 @@ TEST_F(CompactionPickerTest, IntraL0MaxCompactionBytesHit) {
2997
3179
  UpdateVersionStorageInfo();
2998
3180
 
2999
3181
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
3000
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3001
- &log_buffer_));
3182
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3183
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3184
+ vstorage_.get(), &log_buffer_));
3002
3185
  ASSERT_TRUE(compaction.get() != nullptr);
3003
3186
  ASSERT_EQ(1U, compaction->num_input_levels());
3004
3187
  ASSERT_EQ(4U, compaction->num_input_files(0));
@@ -3021,18 +3204,21 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionFullOverlap) {
3021
3204
  Add(0, 1U, "150", "200", kFileSize, 0, 500, 550, /*compensated_file_size*/ 0,
3022
3205
  /*marked_for_compact*/ false, /* temperature*/ Temperature::kUnknown,
3023
3206
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3207
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3024
3208
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3025
3209
  /*epoch_number*/ 3);
3026
3210
  Add(0, 2U, "201", "250", 2 * kFileSize, 0, 401, 450,
3027
3211
  /*compensated_file_size*/ 0, /*marked_for_compact*/ false,
3028
3212
  /* temperature*/ Temperature::kUnknown,
3029
3213
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3214
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3030
3215
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3031
3216
  /*epoch_number*/ 2);
3032
3217
  Add(0, 4U, "260", "300", 4 * kFileSize, 0, 260, 300,
3033
3218
  /*compensated_file_size*/ 0, /*marked_for_compact*/ false,
3034
3219
  /* temperature*/ Temperature::kUnknown,
3035
3220
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3221
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3036
3222
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3037
3223
  /*epoch_number*/ 1);
3038
3224
  Add(3, 5U, "010", "080", 8 * kFileSize, 0, 200, 251);
@@ -3043,8 +3229,9 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionFullOverlap) {
3043
3229
 
3044
3230
  std::unique_ptr<Compaction> compaction(
3045
3231
  universal_compaction_picker.PickCompaction(
3046
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3047
- &log_buffer_));
3232
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3233
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3234
+ vstorage_.get(), &log_buffer_));
3048
3235
 
3049
3236
  ASSERT_TRUE(compaction);
3050
3237
  // Validate that its a compaction to reduce sorted runs
@@ -3059,14 +3246,16 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionFullOverlap) {
3059
3246
  Add(0, 7U, "150", "200", kFileSize, 0, 551, 600, 0, true,
3060
3247
  /* temperature*/ Temperature::kUnknown,
3061
3248
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3249
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3062
3250
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3063
3251
  /*epoch_number*/ 4);
3064
3252
  UpdateVersionStorageInfo();
3065
3253
 
3066
3254
  std::unique_ptr<Compaction> compaction2(
3067
3255
  universal_compaction_picker.PickCompaction(
3068
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3069
- &log_buffer_));
3256
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3257
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3258
+ vstorage_.get(), &log_buffer_));
3070
3259
  ASSERT_FALSE(compaction2);
3071
3260
  }
3072
3261
 
@@ -3085,6 +3274,7 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionFullOverlap2) {
3085
3274
  Add(0, 4U, "260", "300", 4 * kFileSize, 0, 260, 300, 0, true,
3086
3275
  /* temperature*/ Temperature::kUnknown,
3087
3276
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3277
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3088
3278
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3089
3279
  /*epoch_number*/ 1);
3090
3280
  Add(3, 5U, "240", "290", 8 * kFileSize, 0, 201, 250);
@@ -3094,8 +3284,9 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionFullOverlap2) {
3094
3284
 
3095
3285
  std::unique_ptr<Compaction> compaction(
3096
3286
  universal_compaction_picker.PickCompaction(
3097
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3098
- &log_buffer_));
3287
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3288
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3289
+ vstorage_.get(), &log_buffer_));
3099
3290
 
3100
3291
  ASSERT_TRUE(compaction);
3101
3292
  // Validate that its a delete triggered compaction
@@ -3110,20 +3301,23 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionFullOverlap2) {
3110
3301
  Add(0, 1U, "150", "200", kFileSize, 0, 500, 550, /*compensated_file_size*/ 0,
3111
3302
  /*marked_for_compact*/ false, /* temperature*/ Temperature::kUnknown,
3112
3303
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3304
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3113
3305
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3114
3306
  /*epoch_number*/ 3);
3115
3307
  Add(0, 2U, "201", "250", 2 * kFileSize, 0, 401, 450,
3116
3308
  /*compensated_file_size*/ 0, /*marked_for_compact*/ false,
3117
3309
  /* temperature*/ Temperature::kUnknown,
3118
3310
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3311
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3119
3312
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3120
3313
  /*epoch_number*/ 2);
3121
3314
  UpdateVersionStorageInfo();
3122
3315
 
3123
3316
  std::unique_ptr<Compaction> compaction2(
3124
3317
  universal_compaction_picker.PickCompaction(
3125
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3126
- &log_buffer_));
3318
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3319
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3320
+ vstorage_.get(), &log_buffer_));
3127
3321
  ASSERT_FALSE(compaction2);
3128
3322
  }
3129
3323
 
@@ -3163,8 +3357,9 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionStartOutputOverlap) {
3163
3357
 
3164
3358
  std::unique_ptr<Compaction> compaction(
3165
3359
  universal_compaction_picker.PickCompaction(
3166
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3167
- &log_buffer_));
3360
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3361
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3362
+ vstorage_.get(), &log_buffer_));
3168
3363
 
3169
3364
  ASSERT_TRUE(compaction);
3170
3365
  // Validate that its a delete triggered compaction
@@ -3194,8 +3389,9 @@ TEST_F(CompactionPickerTest, UniversalMarkedCompactionStartOutputOverlap) {
3194
3389
  random_index = 0;
3195
3390
  std::unique_ptr<Compaction> compaction2(
3196
3391
  universal_compaction_picker.PickCompaction(
3197
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3198
- &log_buffer_));
3392
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3393
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3394
+ vstorage_.get(), &log_buffer_));
3199
3395
  ASSERT_FALSE(compaction2);
3200
3396
  DeleteVersionStorage();
3201
3397
  }
@@ -3220,8 +3416,9 @@ TEST_F(CompactionPickerTest, UniversalMarkedL0NoOverlap) {
3220
3416
 
3221
3417
  std::unique_ptr<Compaction> compaction(
3222
3418
  universal_compaction_picker.PickCompaction(
3223
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3224
- &log_buffer_));
3419
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3420
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3421
+ vstorage_.get(), &log_buffer_));
3225
3422
 
3226
3423
  ASSERT_TRUE(compaction);
3227
3424
  // Validate that its a delete triggered compaction
@@ -3257,8 +3454,9 @@ TEST_F(CompactionPickerTest, UniversalMarkedL0WithOverlap) {
3257
3454
 
3258
3455
  std::unique_ptr<Compaction> compaction(
3259
3456
  universal_compaction_picker.PickCompaction(
3260
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3261
- &log_buffer_));
3457
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3458
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3459
+ vstorage_.get(), &log_buffer_));
3262
3460
 
3263
3461
  ASSERT_TRUE(compaction);
3264
3462
  // Validate that its a delete triggered compaction
@@ -3287,31 +3485,36 @@ TEST_F(CompactionPickerTest, UniversalMarkedL0Overlap2) {
3287
3485
  /*compensated_file_size*/ 0, /*marked_for_compact*/ false,
3288
3486
  /* temperature*/ Temperature::kUnknown,
3289
3487
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3488
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3290
3489
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3291
3490
  /*epoch_number*/ 4);
3292
3491
  Add(0, 5U, "240", "290", 2 * kFileSize, 0, 201, 250, 0, true,
3293
3492
  /* temperature*/ Temperature::kUnknown,
3294
3493
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3494
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3295
3495
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3296
3496
  /*epoch_number*/ 3);
3297
3497
  Add(0, 3U, "301", "350", 4 * kFileSize, 0, 101, 150,
3298
3498
  /*compensated_file_size*/ 0, /*marked_for_compact*/ false,
3299
3499
  /* temperature*/ Temperature::kUnknown,
3300
3500
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3501
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3301
3502
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3302
3503
  /*epoch_number*/ 2);
3303
3504
  Add(0, 6U, "501", "750", 8 * kFileSize, 0, 50, 100,
3304
3505
  /*compensated_file_size*/ 0, /*marked_for_compact*/ false,
3305
3506
  /* temperature*/ Temperature::kUnknown,
3306
3507
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3508
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3307
3509
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3308
3510
  /*epoch_number*/ 1);
3309
3511
  UpdateVersionStorageInfo();
3310
3512
 
3311
3513
  std::unique_ptr<Compaction> compaction(
3312
3514
  universal_compaction_picker.PickCompaction(
3313
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3314
- &log_buffer_));
3515
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3516
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3517
+ vstorage_.get(), &log_buffer_));
3315
3518
 
3316
3519
  ASSERT_TRUE(compaction);
3317
3520
  // Validate that its a delete triggered compaction
@@ -3329,20 +3532,23 @@ TEST_F(CompactionPickerTest, UniversalMarkedL0Overlap2) {
3329
3532
  /*marked_for_compact*/ false,
3330
3533
  /* temperature*/ Temperature::kUnknown,
3331
3534
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3535
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3332
3536
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3333
3537
  /*epoch_number*/ 6);
3334
3538
  Add(0, 2U, "201", "250", kFileSize, 0, 401, 450, /*compensated_file_size*/ 0,
3335
3539
  /*marked_for_compact*/ false,
3336
3540
  /* temperature*/ Temperature::kUnknown,
3337
3541
  /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3542
+ /*newest_key_time*/ kUnknownNewestKeyTime,
3338
3543
  /*ts_of_smallest*/ Slice(), /*ts_of_largest*/ Slice(),
3339
3544
  /*epoch_number*/ 5);
3340
3545
  UpdateVersionStorageInfo();
3341
3546
 
3342
3547
  std::unique_ptr<Compaction> compaction2(
3343
3548
  universal_compaction_picker.PickCompaction(
3344
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3345
- &log_buffer_));
3549
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3550
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3551
+ vstorage_.get(), &log_buffer_));
3346
3552
  ASSERT_TRUE(compaction2);
3347
3553
  ASSERT_EQ(3U, compaction->num_input_files(0));
3348
3554
  ASSERT_TRUE(file_map_[1].first->being_compacted);
@@ -3403,7 +3609,7 @@ TEST_F(CompactionPickerTest, UniversalSizeAmpTierCompactionNonLastLevel) {
3403
3609
  const int kLastLevel = kNumLevels - 1;
3404
3610
 
3405
3611
  ioptions_.compaction_style = kCompactionStyleUniversal;
3406
- ioptions_.preclude_last_level_data_seconds = 1000;
3612
+ mutable_cf_options_.preclude_last_level_data_seconds = 1000;
3407
3613
  mutable_cf_options_.compaction_options_universal
3408
3614
  .max_size_amplification_percent = 200;
3409
3615
  // To avoid any L0 file exclusion in size amp compaction intended for reducing
@@ -3420,8 +3626,9 @@ TEST_F(CompactionPickerTest, UniversalSizeAmpTierCompactionNonLastLevel) {
3420
3626
 
3421
3627
  std::unique_ptr<Compaction> compaction(
3422
3628
  universal_compaction_picker.PickCompaction(
3423
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3424
- &log_buffer_));
3629
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3630
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3631
+ vstorage_.get(), &log_buffer_));
3425
3632
 
3426
3633
  // Make sure it's a size amp compaction and includes all files
3427
3634
  ASSERT_EQ(compaction->compaction_reason(),
@@ -3442,7 +3649,7 @@ TEST_F(CompactionPickerTest, UniversalSizeRatioTierCompactionLastLevel) {
3442
3649
  const int kPenultimateLevel = kLastLevel - 1;
3443
3650
 
3444
3651
  ioptions_.compaction_style = kCompactionStyleUniversal;
3445
- ioptions_.preclude_last_level_data_seconds = 1000;
3652
+ mutable_cf_options_.preclude_last_level_data_seconds = 1000;
3446
3653
  mutable_cf_options_.compaction_options_universal
3447
3654
  .max_size_amplification_percent = 200;
3448
3655
  UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
@@ -3456,8 +3663,9 @@ TEST_F(CompactionPickerTest, UniversalSizeRatioTierCompactionLastLevel) {
3456
3663
 
3457
3664
  std::unique_ptr<Compaction> compaction(
3458
3665
  universal_compaction_picker.PickCompaction(
3459
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3460
- &log_buffer_));
3666
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3667
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3668
+ vstorage_.get(), &log_buffer_));
3461
3669
 
3462
3670
  // Internally, size amp compaction is evaluated before size ratio compaction.
3463
3671
  // Here to make sure it's size ratio compaction instead of size amp
@@ -3479,7 +3687,7 @@ TEST_F(CompactionPickerTest, UniversalSizeAmpTierCompactionNotSuport) {
3479
3687
  const int kLastLevel = kNumLevels - 1;
3480
3688
 
3481
3689
  ioptions_.compaction_style = kCompactionStyleUniversal;
3482
- ioptions_.preclude_last_level_data_seconds = 1000;
3690
+ mutable_cf_options_.preclude_last_level_data_seconds = 1000;
3483
3691
  mutable_cf_options_.compaction_options_universal
3484
3692
  .max_size_amplification_percent = 200;
3485
3693
  // To avoid any L0 file exclusion in size amp compaction intended for reducing
@@ -3496,8 +3704,9 @@ TEST_F(CompactionPickerTest, UniversalSizeAmpTierCompactionNotSuport) {
3496
3704
 
3497
3705
  std::unique_ptr<Compaction> compaction(
3498
3706
  universal_compaction_picker.PickCompaction(
3499
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3500
- &log_buffer_));
3707
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3708
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3709
+ vstorage_.get(), &log_buffer_));
3501
3710
 
3502
3711
  // size amp compaction is still triggered even preclude_last_level is set
3503
3712
  ASSERT_EQ(compaction->compaction_reason(),
@@ -3516,7 +3725,7 @@ TEST_F(CompactionPickerTest, UniversalSizeAmpTierCompactionLastLevel) {
3516
3725
  const int kPenultimateLevel = kLastLevel - 1;
3517
3726
 
3518
3727
  ioptions_.compaction_style = kCompactionStyleUniversal;
3519
- ioptions_.preclude_last_level_data_seconds = 1000;
3728
+ mutable_cf_options_.preclude_last_level_data_seconds = 1000;
3520
3729
  mutable_cf_options_.compaction_options_universal
3521
3730
  .max_size_amplification_percent = 200;
3522
3731
  UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
@@ -3530,8 +3739,9 @@ TEST_F(CompactionPickerTest, UniversalSizeAmpTierCompactionLastLevel) {
3530
3739
 
3531
3740
  std::unique_ptr<Compaction> compaction(
3532
3741
  universal_compaction_picker.PickCompaction(
3533
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3534
- &log_buffer_));
3742
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3743
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3744
+ vstorage_.get(), &log_buffer_));
3535
3745
 
3536
3746
  // It's a Size Amp compaction, but doesn't include the last level file and
3537
3747
  // output to the penultimate level.
@@ -3563,7 +3773,8 @@ TEST_F(CompactionPickerU64TsTest, Overlap) {
3563
3773
  /*file_size=*/1U, /*path_id=*/0,
3564
3774
  /*smallest_seq=*/100, /*largest_seq=*/100, /*compensated_file_size=*/0,
3565
3775
  /*marked_for_compact=*/false, /*temperature=*/Temperature::kUnknown,
3566
- /*oldest_ancestor_time=*/kUnknownOldestAncesterTime, ts1, ts2);
3776
+ /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3777
+ /*newest_key_time*/ kUnknownNewestKeyTime, ts1, ts2);
3567
3778
  UpdateVersionStorageInfo();
3568
3779
  }
3569
3780
 
@@ -3629,17 +3840,20 @@ TEST_F(CompactionPickerU64TsTest, CannotTrivialMoveUniversal) {
3629
3840
  Add(1, 1U, "150", "150", kFileSize, /*path_id=*/0, /*smallest_seq=*/100,
3630
3841
  /*largest_seq=*/100, /*compensated_file_size=*/kFileSize,
3631
3842
  /*marked_for_compact=*/false, Temperature::kUnknown,
3632
- kUnknownOldestAncesterTime, ts1, ts2);
3843
+ /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3844
+ /*newest_key_time*/ kUnknownNewestKeyTime, ts1, ts2);
3633
3845
  Add(2, 2U, "150", "150", kFileSize, /*path_id=*/0, /*smallest_seq=*/100,
3634
3846
  /*largest_seq=*/100, /*compensated_file_size=*/kFileSize,
3635
3847
  /*marked_for_compact=*/false, Temperature::kUnknown,
3636
- kUnknownOldestAncesterTime, ts3, ts4);
3848
+ /*oldest_ancestor_time*/ kUnknownOldestAncesterTime,
3849
+ /*newest_key_time*/ kUnknownNewestKeyTime, ts3, ts4);
3637
3850
  UpdateVersionStorageInfo();
3638
3851
 
3639
3852
  std::unique_ptr<Compaction> compaction(
3640
3853
  universal_compaction_picker.PickCompaction(
3641
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
3642
- &log_buffer_));
3854
+ cf_name_, mutable_cf_options_, mutable_db_options_,
3855
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
3856
+ vstorage_.get(), &log_buffer_));
3643
3857
  assert(compaction);
3644
3858
  ASSERT_TRUE(!compaction->is_trivial_move());
3645
3859
  }
@@ -3695,8 +3909,8 @@ TEST_P(PerKeyPlacementCompactionPickerTest, OverlapWithNormalCompaction) {
3695
3909
  ASSERT_EQ(enable_per_key_placement_,
3696
3910
  level_compaction_picker.FilesRangeOverlapWithCompaction(
3697
3911
  input_files, 6,
3698
- Compaction::EvaluatePenultimateLevel(vstorage_.get(), ioptions_,
3699
- 0, 6)));
3912
+ Compaction::EvaluatePenultimateLevel(
3913
+ vstorage_.get(), mutable_cf_options_, ioptions_, 0, 6)));
3700
3914
  }
3701
3915
 
3702
3916
  TEST_P(PerKeyPlacementCompactionPickerTest, NormalCompactionOverlap) {
@@ -3783,8 +3997,8 @@ TEST_P(PerKeyPlacementCompactionPickerTest,
3783
3997
  ASSERT_EQ(enable_per_key_placement_,
3784
3998
  universal_compaction_picker.FilesRangeOverlapWithCompaction(
3785
3999
  input_files, 6,
3786
- Compaction::EvaluatePenultimateLevel(vstorage_.get(), ioptions_,
3787
- 0, 6)));
4000
+ Compaction::EvaluatePenultimateLevel(
4001
+ vstorage_.get(), mutable_cf_options_, ioptions_, 0, 6)));
3788
4002
  }
3789
4003
 
3790
4004
  TEST_P(PerKeyPlacementCompactionPickerTest, NormalCompactionOverlapUniversal) {
@@ -3835,7 +4049,7 @@ TEST_P(PerKeyPlacementCompactionPickerTest, PenultimateOverlapUniversal) {
3835
4049
  // This test is make sure the Tiered compaction would lock whole range of
3836
4050
  // both output level and penultimate level
3837
4051
  if (enable_per_key_placement_) {
3838
- ioptions_.preclude_last_level_data_seconds = 10000;
4052
+ mutable_cf_options_.preclude_last_level_data_seconds = 10000;
3839
4053
  }
3840
4054
 
3841
4055
  int num_levels = ioptions_.num_levels;
@@ -3890,7 +4104,7 @@ TEST_P(PerKeyPlacementCompactionPickerTest, PenultimateOverlapUniversal) {
3890
4104
 
3891
4105
  TEST_P(PerKeyPlacementCompactionPickerTest, LastLevelOnlyOverlapUniversal) {
3892
4106
  if (enable_per_key_placement_) {
3893
- ioptions_.preclude_last_level_data_seconds = 10000;
4107
+ mutable_cf_options_.preclude_last_level_data_seconds = 10000;
3894
4108
  }
3895
4109
 
3896
4110
  int num_levels = ioptions_.num_levels;
@@ -3949,7 +4163,7 @@ TEST_P(PerKeyPlacementCompactionPickerTest,
3949
4163
  // This should rarely happen in universal compaction, as the non-empty L5
3950
4164
  // should be included in the compaction.
3951
4165
  if (enable_per_key_placement_) {
3952
- ioptions_.preclude_last_level_data_seconds = 10000;
4166
+ mutable_cf_options_.preclude_last_level_data_seconds = 10000;
3953
4167
  }
3954
4168
 
3955
4169
  int num_levels = ioptions_.num_levels;
@@ -4003,7 +4217,7 @@ TEST_P(PerKeyPlacementCompactionPickerTest,
4003
4217
  // penultimate level compaction if there's already an ongoing compaction to
4004
4218
  // the penultimate level
4005
4219
  if (enable_per_key_placement_) {
4006
- ioptions_.preclude_last_level_data_seconds = 10000;
4220
+ mutable_cf_options_.preclude_last_level_data_seconds = 10000;
4007
4221
  }
4008
4222
 
4009
4223
  int num_levels = ioptions_.num_levels;
@@ -4044,8 +4258,8 @@ TEST_P(PerKeyPlacementCompactionPickerTest,
4044
4258
  ASSERT_EQ(enable_per_key_placement_,
4045
4259
  universal_compaction_picker.FilesRangeOverlapWithCompaction(
4046
4260
  input_files, 6,
4047
- Compaction::EvaluatePenultimateLevel(vstorage_.get(), ioptions_,
4048
- 6, 6)));
4261
+ Compaction::EvaluatePenultimateLevel(
4262
+ vstorage_.get(), mutable_cf_options_, ioptions_, 6, 6)));
4049
4263
 
4050
4264
  if (!enable_per_key_placement_) {
4051
4265
  std::unique_ptr<Compaction> comp2(universal_compaction_picker.CompactFiles(
@@ -4063,7 +4277,7 @@ TEST_P(PerKeyPlacementCompactionPickerTest,
4063
4277
  // compaction, so it's safe to move data from the last level to the
4064
4278
  // penultimate level.
4065
4279
  if (enable_per_key_placement_) {
4066
- ioptions_.preclude_last_level_data_seconds = 10000;
4280
+ mutable_cf_options_.preclude_last_level_data_seconds = 10000;
4067
4281
  }
4068
4282
 
4069
4283
  int num_levels = ioptions_.num_levels;
@@ -4104,7 +4318,8 @@ TEST_P(PerKeyPlacementCompactionPickerTest,
4104
4318
  // always safe to move data up
4105
4319
  ASSERT_FALSE(universal_compaction_picker.FilesRangeOverlapWithCompaction(
4106
4320
  input_files, 6,
4107
- Compaction::EvaluatePenultimateLevel(vstorage_.get(), ioptions_, 6, 6)));
4321
+ Compaction::EvaluatePenultimateLevel(vstorage_.get(), mutable_cf_options_,
4322
+ ioptions_, 6, 6)));
4108
4323
 
4109
4324
  // 2 compactions can be run in parallel
4110
4325
  std::unique_ptr<Compaction> comp2(universal_compaction_picker.CompactFiles(
@@ -4169,8 +4384,9 @@ TEST_F(CompactionPickerTest,
4169
4384
  UpdateVersionStorageInfo();
4170
4385
 
4171
4386
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
4172
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
4173
- &log_buffer_));
4387
+ cf_name_, mutable_cf_options_, mutable_db_options_,
4388
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
4389
+ vstorage_.get(), &log_buffer_));
4174
4390
  ASSERT_TRUE(compaction);
4175
4391
  ASSERT_EQ(num_levels - 2, compaction->start_level());
4176
4392
  ASSERT_EQ(num_levels - 1, compaction->output_level());
@@ -4178,9 +4394,10 @@ TEST_F(CompactionPickerTest,
4178
4394
  ASSERT_EQ(5U, compaction->input(0, 0)->fd.GetNumber());
4179
4395
 
4180
4396
  std::unique_ptr<Compaction> second_compaction(
4181
- level_compaction_picker.PickCompaction(cf_name_, mutable_cf_options_,
4182
- mutable_db_options_,
4183
- vstorage_.get(), &log_buffer_));
4397
+ level_compaction_picker.PickCompaction(
4398
+ cf_name_, mutable_cf_options_, mutable_db_options_,
4399
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
4400
+ vstorage_.get(), &log_buffer_));
4184
4401
  ASSERT_TRUE(second_compaction);
4185
4402
  ASSERT_EQ(num_levels - 1, compaction->output_level());
4186
4403
  ASSERT_EQ(num_levels - 2, compaction->start_level());
@@ -4225,8 +4442,9 @@ TEST_F(CompactionPickerTest,
4225
4442
  UpdateVersionStorageInfo();
4226
4443
 
4227
4444
  std::unique_ptr<Compaction> compaction(level_compaction_picker.PickCompaction(
4228
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
4229
- &log_buffer_));
4445
+ cf_name_, mutable_cf_options_, mutable_db_options_,
4446
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
4447
+ vstorage_.get(), &log_buffer_));
4230
4448
  ASSERT_TRUE(compaction);
4231
4449
  ASSERT_EQ(num_levels - 3, compaction->start_level());
4232
4450
  ASSERT_EQ(num_levels - 2, compaction->output_level());
@@ -4274,8 +4492,9 @@ TEST_F(CompactionPickerTest, IntraL0WhenL0IsSmall) {
4274
4492
 
4275
4493
  LevelCompactionPicker compaction_picker(ioptions_, &icmp_);
4276
4494
  std::unique_ptr<Compaction> compaction(compaction_picker.PickCompaction(
4277
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
4278
- &log_buffer_));
4495
+ cf_name_, mutable_cf_options_, mutable_db_options_,
4496
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
4497
+ vstorage_.get(), &log_buffer_));
4279
4498
  ASSERT_TRUE(compaction.get() != nullptr);
4280
4499
  ASSERT_EQ(CompactionReason::kLevelL0FilesNum,
4281
4500
  compaction->compaction_reason());
@@ -4351,6 +4570,7 @@ TEST_F(CompactionPickerTest, UniversalMaxReadAmpLargeDB) {
4351
4570
  std::unique_ptr<Compaction> compaction(
4352
4571
  universal_compaction_picker.PickCompaction(
4353
4572
  cf_name_, mutable_cf_options_, mutable_db_options_,
4573
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
4354
4574
  vstorage_.get(), &log_buffer_));
4355
4575
  if (i == kMaxRuns) {
4356
4576
  // There are in total i + 1 > kMaxRuns sorted runs.
@@ -4397,8 +4617,9 @@ TEST_F(CompactionPickerTest, UniversalMaxReadAmpSmallDB) {
4397
4617
  ASSERT_TRUE(universal_compaction_picker.NeedsCompaction(vstorage_.get()));
4398
4618
  std::unique_ptr<Compaction> compaction(
4399
4619
  universal_compaction_picker.PickCompaction(
4400
- cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
4401
- &log_buffer_));
4620
+ cf_name_, mutable_cf_options_, mutable_db_options_,
4621
+ /*existing_snapshots=*/{}, /* snapshot_checker */ nullptr,
4622
+ vstorage_.get(), &log_buffer_));
4402
4623
  ASSERT_EQ(nullptr, compaction);
4403
4624
  }
4404
4625
  }