@nxtedition/rocksdb 7.1.20 → 7.1.21

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 (262) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -6
  2. package/deps/rocksdb/rocksdb/Makefile +1 -1
  3. package/deps/rocksdb/rocksdb/TARGETS +2 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
  11. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
  13. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
  15. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
  19. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
  27. package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
  29. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
  46. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  47. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  48. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
  49. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
  50. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
  51. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
  60. package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
  61. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
  62. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
  64. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
  65. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
  67. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
  72. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
  73. package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
  74. package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
  75. package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
  76. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
  77. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
  78. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
  79. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
  80. package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
  82. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
  83. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
  84. package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
  85. package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
  86. package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
  87. package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
  88. package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
  89. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  91. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
  92. package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
  93. package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
  94. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
  95. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
  96. package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
  97. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
  98. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
  99. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  100. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  101. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
  102. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
  103. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
  104. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
  105. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
  106. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
  108. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
  109. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
  110. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
  111. package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
  112. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
  113. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
  114. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
  115. package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
  116. package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
  117. package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
  118. package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
  119. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
  120. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
  121. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
  122. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
  123. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
  124. package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
  125. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
  126. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
  127. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
  130. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
  140. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
  142. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
  143. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
  144. package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
  145. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
  146. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
  147. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
  148. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
  149. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
  150. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
  152. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
  153. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
  154. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
  155. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
  157. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
  160. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
  162. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  164. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
  165. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
  166. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  167. package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
  168. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
  169. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  170. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  171. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  172. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  174. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  175. package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
  176. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
  177. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  178. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  179. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
  180. package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
  181. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  182. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  183. package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
  184. package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
  185. package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
  186. package/deps/rocksdb/rocksdb/src.mk +1 -0
  187. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
  188. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
  189. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
  192. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
  195. package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
  196. package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
  197. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
  198. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
  199. package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
  200. package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
  201. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
  202. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
  203. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
  204. package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
  205. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
  206. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
  207. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  208. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
  209. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
  210. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  211. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
  212. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
  213. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
  214. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
  215. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
  216. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
  217. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
  218. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
  219. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
  220. package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
  221. package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
  222. package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
  223. package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
  224. package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
  225. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
  226. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
  227. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
  228. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
  229. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
  230. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
  231. package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
  232. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
  233. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
  234. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
  235. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
  236. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
  237. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
  239. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
  240. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
  241. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
  242. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
  243. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
  244. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
  245. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
  246. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
  247. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
  248. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
  249. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
  250. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
  251. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
  252. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
  253. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
  254. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
  255. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
  256. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
  257. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
  258. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
  259. package/index.js +12 -4
  260. package/package.json +1 -1
  261. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  262. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -121,20 +121,45 @@ Compaction* FIFOCompactionPicker::PickTTLCompaction(
121
121
  return c;
122
122
  }
123
123
 
124
+ // The size-based compaction picker for FIFO.
125
+ //
126
+ // When the entire column family size exceeds max_table_files_size, FIFO will
127
+ // try to delete the oldest sst file(s) until the resulting column family size
128
+ // is smaller than max_table_files_size.
129
+ //
130
+ // This function also takes care the case where a DB is migrating from level /
131
+ // universal compaction to FIFO compaction. During the migration, the column
132
+ // family will also have non-L0 files while FIFO can only create L0 files.
133
+ // In this case, this function will first purge the sst files in the bottom-
134
+ // most non-empty level first, and the DB will eventually converge to the
135
+ // regular FIFO case where there're only L0 files. Note that during the
136
+ // migration case, the purge order will only be an approximation of "FIFO"
137
+ // as entries inside lower-level files might sometimes be newer than some
138
+ // entries inside upper-level files.
124
139
  Compaction* FIFOCompactionPicker::PickSizeCompaction(
125
140
  const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
126
141
  const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
127
142
  LogBuffer* log_buffer) {
128
- const int kLevel0 = 0;
129
- const std::vector<FileMetaData*>& level_files = vstorage->LevelFiles(kLevel0);
130
- uint64_t total_size = GetTotalFilesSize(level_files);
143
+ // compute the total size and identify the last non-empty level
144
+ int last_level = 0;
145
+ uint64_t total_size = 0;
146
+ for (int level = 0; level < vstorage->num_levels(); ++level) {
147
+ auto level_size = GetTotalFilesSize(vstorage->LevelFiles(level));
148
+ total_size += level_size;
149
+ if (level_size > 0) {
150
+ last_level = level;
151
+ }
152
+ }
153
+ const std::vector<FileMetaData*>& last_level_files =
154
+ vstorage->LevelFiles(last_level);
131
155
 
132
- if (total_size <=
133
- mutable_cf_options.compaction_options_fifo.max_table_files_size ||
134
- level_files.size() == 0) {
135
- // total size not exceeded
156
+ if (last_level == 0 &&
157
+ total_size <=
158
+ mutable_cf_options.compaction_options_fifo.max_table_files_size) {
159
+ // total size not exceeded, try to find intra level 0 compaction if enabled
160
+ const std::vector<FileMetaData*>& level0_files = vstorage->LevelFiles(0);
136
161
  if (mutable_cf_options.compaction_options_fifo.allow_compaction &&
137
- level_files.size() > 0) {
162
+ level0_files.size() > 0) {
138
163
  CompactionInputFiles comp_inputs;
139
164
  // try to prevent same files from being compacted multiple times, which
140
165
  // could produce large files that may never TTL-expire. Achieve this by
@@ -146,7 +171,7 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
146
171
  static_cast<uint64_t>(mutable_cf_options.write_buffer_size),
147
172
  1.1));
148
173
  if (FindIntraL0Compaction(
149
- level_files,
174
+ level0_files,
150
175
  mutable_cf_options
151
176
  .level0_file_num_compaction_trigger /* min_files_to_compact */
152
177
  ,
@@ -187,27 +212,58 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
187
212
 
188
213
  std::vector<CompactionInputFiles> inputs;
189
214
  inputs.emplace_back();
190
- inputs[0].level = 0;
215
+ inputs[0].level = last_level;
191
216
 
192
- for (auto ritr = level_files.rbegin(); ritr != level_files.rend(); ++ritr) {
193
- auto f = *ritr;
194
- total_size -= f->fd.file_size;
195
- inputs[0].files.push_back(f);
196
- char tmp_fsize[16];
197
- AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
198
- ROCKS_LOG_BUFFER(log_buffer,
199
- "[%s] FIFO compaction: picking file %" PRIu64
200
- " with size %s for deletion",
201
- cf_name.c_str(), f->fd.GetNumber(), tmp_fsize);
202
- if (total_size <=
203
- mutable_cf_options.compaction_options_fifo.max_table_files_size) {
204
- break;
217
+ if (last_level == 0) {
218
+ // In L0, right-most files are the oldest files.
219
+ for (auto ritr = last_level_files.rbegin(); ritr != last_level_files.rend();
220
+ ++ritr) {
221
+ auto f = *ritr;
222
+ total_size -= f->fd.file_size;
223
+ inputs[0].files.push_back(f);
224
+ char tmp_fsize[16];
225
+ AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
226
+ ROCKS_LOG_BUFFER(log_buffer,
227
+ "[%s] FIFO compaction: picking file %" PRIu64
228
+ " with size %s for deletion",
229
+ cf_name.c_str(), f->fd.GetNumber(), tmp_fsize);
230
+ if (total_size <=
231
+ mutable_cf_options.compaction_options_fifo.max_table_files_size) {
232
+ break;
233
+ }
234
+ }
235
+ } else {
236
+ // If the last level is non-L0, we actually don't know which file is
237
+ // logically the oldest since the file creation time only represents
238
+ // when this file was compacted to this level, which is independent
239
+ // to when the entries in this file were first inserted.
240
+ //
241
+ // As a result, we delete files from the left instead. This means the sst
242
+ // file with the smallest key will be deleted first. This design decision
243
+ // better serves a major type of FIFO use cases where smaller keys are
244
+ // associated with older data.
245
+ for (const auto& f : last_level_files) {
246
+ total_size -= f->fd.file_size;
247
+ inputs[0].files.push_back(f);
248
+ char tmp_fsize[16];
249
+ AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
250
+ ROCKS_LOG_BUFFER(log_buffer,
251
+ "[%s] FIFO compaction: picking file %" PRIu64
252
+ " with size %s for deletion",
253
+ cf_name.c_str(), f->fd.GetNumber(), tmp_fsize);
254
+ if (total_size <=
255
+ mutable_cf_options.compaction_options_fifo.max_table_files_size) {
256
+ break;
257
+ }
205
258
  }
206
259
  }
207
260
 
208
261
  Compaction* c = new Compaction(
209
262
  vstorage, ioptions_, mutable_cf_options, mutable_db_options,
210
- std::move(inputs), 0, 0, 0, 0, kNoCompression,
263
+ std::move(inputs), last_level,
264
+ /* target_file_size */ 0,
265
+ /* max_compaction_bytes */ 0,
266
+ /* output_path_id */ 0, kNoCompression,
211
267
  mutable_cf_options.compression_opts, Temperature::kUnknown,
212
268
  /* max_subcompactions */ 0, {}, /* is manual */ false,
213
269
  /* trim_ts */ "", vstorage->CompactionScore(0),
@@ -224,6 +280,13 @@ Compaction* FIFOCompactionPicker::PickCompactionToWarm(
224
280
  return nullptr;
225
281
  }
226
282
 
283
+ // PickCompactionToWarm is only triggered if there is no non-L0 files.
284
+ for (int level = 1; level < vstorage->num_levels(); ++level) {
285
+ if (GetTotalFilesSize(vstorage->LevelFiles(level)) > 0) {
286
+ return nullptr;
287
+ }
288
+ }
289
+
227
290
  const int kLevel0 = 0;
228
291
  const std::vector<FileMetaData*>& level_files = vstorage->LevelFiles(kLevel0);
229
292
 
@@ -327,8 +390,6 @@ Compaction* FIFOCompactionPicker::PickCompaction(
327
390
  const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
328
391
  const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
329
392
  LogBuffer* log_buffer, SequenceNumber /*earliest_memtable_seqno*/) {
330
- assert(vstorage->num_levels() == 1);
331
-
332
393
  Compaction* c = nullptr;
333
394
  if (mutable_cf_options.ttl > 0) {
334
395
  c = PickTTLCompaction(cf_name, mutable_cf_options, mutable_db_options,
@@ -254,6 +254,25 @@ void LevelCompactionBuilder::SetupInitialFiles() {
254
254
  }
255
255
 
256
256
  // TTL Compaction
257
+ if (ioptions_.compaction_pri == kRoundRobin &&
258
+ !vstorage_->ExpiredTtlFiles().empty()) {
259
+ auto expired_files = vstorage_->ExpiredTtlFiles();
260
+ // the expired files list should already be sorted by level
261
+ start_level_ = expired_files.front().first;
262
+ #ifndef NDEBUG
263
+ for (const auto& file : expired_files) {
264
+ assert(start_level_ <= file.first);
265
+ }
266
+ #endif
267
+ if (start_level_ > 0) {
268
+ output_level_ = start_level_ + 1;
269
+ if (PickFileToCompact()) {
270
+ compaction_reason_ = CompactionReason::kRoundRobinTtl;
271
+ return;
272
+ }
273
+ }
274
+ }
275
+
257
276
  PickFileToCompact(vstorage_->ExpiredTtlFiles(), true);
258
277
  if (!start_level_inputs_.empty()) {
259
278
  compaction_reason_ = CompactionReason::kTtl;
@@ -318,7 +337,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
318
337
  // Constraint 3 (pre-calculate the ideal max bytes to compact)
319
338
  for (auto f : level_files) {
320
339
  if (!f->being_compacted) {
321
- start_lvl_bytes_no_compacting += f->compensated_file_size;
340
+ start_lvl_bytes_no_compacting += f->fd.GetFileSize();
322
341
  }
323
342
  }
324
343
  if (start_lvl_bytes_no_compacting >
@@ -341,7 +360,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
341
360
  }
342
361
  }
343
362
  // Constraint 3
344
- if (start_level_inputs_[0]->compensated_file_size >=
363
+ if (start_level_inputs_[0]->fd.GetFileSize() >=
345
364
  start_lvl_max_bytes_to_compact) {
346
365
  return;
347
366
  }
@@ -368,7 +387,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
368
387
 
369
388
  curr_bytes_to_compact = 0;
370
389
  for (auto start_lvl_f : tmp_start_level_inputs.files) {
371
- curr_bytes_to_compact += start_lvl_f->compensated_file_size;
390
+ curr_bytes_to_compact += start_lvl_f->fd.GetFileSize();
372
391
  }
373
392
 
374
393
  // Check whether any output level files are locked
@@ -385,7 +404,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
385
404
 
386
405
  uint64_t start_lvl_curr_bytes_to_compact = curr_bytes_to_compact;
387
406
  for (auto output_lvl_f : output_level_inputs.files) {
388
- curr_bytes_to_compact += output_lvl_f->compensated_file_size;
407
+ curr_bytes_to_compact += output_lvl_f->fd.GetFileSize();
389
408
  }
390
409
  if (curr_bytes_to_compact > mutable_cf_options_.max_compaction_bytes) {
391
410
  // Constraint 2
@@ -1340,6 +1340,7 @@ TEST_F(CompactionPickerTest, CompactionPriMinOverlapping4) {
1340
1340
  ioptions_.compaction_pri = kMinOverlappingRatio;
1341
1341
  mutable_cf_options_.max_bytes_for_level_base = 10000000;
1342
1342
  mutable_cf_options_.max_bytes_for_level_multiplier = 10;
1343
+ mutable_cf_options_.ignore_max_compaction_bytes_for_input = false;
1343
1344
 
1344
1345
  // file 7 and 8 over lap with the same file, but file 8 is smaller so
1345
1346
  // it will be picked.
@@ -2358,6 +2359,7 @@ TEST_F(CompactionPickerTest, IsBottommostLevelTest) {
2358
2359
  TEST_F(CompactionPickerTest, MaxCompactionBytesHit) {
2359
2360
  mutable_cf_options_.max_bytes_for_level_base = 1000000u;
2360
2361
  mutable_cf_options_.max_compaction_bytes = 800000u;
2362
+ mutable_cf_options_.ignore_max_compaction_bytes_for_input = false;
2361
2363
  ioptions_.level_compaction_dynamic_level_bytes = false;
2362
2364
  NewVersionStorage(6, kCompactionStyleLevel);
2363
2365
  // A compaction should be triggered and pick file 2 and 5.
@@ -2384,6 +2386,7 @@ TEST_F(CompactionPickerTest, MaxCompactionBytesHit) {
2384
2386
  TEST_F(CompactionPickerTest, MaxCompactionBytesNotHit) {
2385
2387
  mutable_cf_options_.max_bytes_for_level_base = 800000u;
2386
2388
  mutable_cf_options_.max_compaction_bytes = 1000000u;
2389
+ mutable_cf_options_.ignore_max_compaction_bytes_for_input = false;
2387
2390
  ioptions_.level_compaction_dynamic_level_bytes = false;
2388
2391
  NewVersionStorage(6, kCompactionStyleLevel);
2389
2392
  // A compaction should be triggered and pick file 2 and 5.
@@ -3656,6 +3659,63 @@ TEST_P(PerKeyPlacementCompactionPickerTest, NormalCompactionOverlapUniversal) {
3656
3659
  input_files, 5));
3657
3660
  }
3658
3661
 
3662
+ TEST_P(PerKeyPlacementCompactionPickerTest, PenultimateOverlapUniversal) {
3663
+ // This test is make sure the Tiered compaction would lock whole range of
3664
+ // both output level and penultimate level
3665
+ if (enable_per_key_placement_) {
3666
+ ioptions_.preclude_last_level_data_seconds = 10000;
3667
+ }
3668
+
3669
+ int num_levels = ioptions_.num_levels;
3670
+ ioptions_.compaction_style = kCompactionStyleUniversal;
3671
+ UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
3672
+ NewVersionStorage(num_levels, kCompactionStyleUniversal);
3673
+
3674
+ // L4: [200, 220] [230, 250] [360, 380]
3675
+ // L5:
3676
+ // L6: [101, 351]
3677
+ Add(4, 40U, "200", "220", 60000000U);
3678
+ Add(4, 41U, "230", "250", 60000000U);
3679
+ Add(4, 42U, "360", "380", 60000000U);
3680
+ Add(6, 50U, "101", "351", 60000000U);
3681
+ UpdateVersionStorageInfo();
3682
+
3683
+ // the existing compaction is the 1st L4 file + L6 file
3684
+ // then compaction of the 2nd L4 file to L5 (penultimate level) is overlapped
3685
+ // when the tiered compaction feature is on.
3686
+ CompactionOptions comp_options;
3687
+ std::unordered_set<uint64_t> input_set;
3688
+ input_set.insert(40);
3689
+ input_set.insert(50);
3690
+ std::vector<CompactionInputFiles> input_files;
3691
+ ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
3692
+ &input_files, &input_set, vstorage_.get(), comp_options));
3693
+
3694
+ std::unique_ptr<Compaction> comp1(universal_compaction_picker.CompactFiles(
3695
+ comp_options, input_files, 6, vstorage_.get(), mutable_cf_options_,
3696
+ mutable_db_options_, 0));
3697
+
3698
+ input_set.clear();
3699
+ input_files.clear();
3700
+ input_set.insert(41);
3701
+ ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
3702
+ &input_files, &input_set, vstorage_.get(), comp_options));
3703
+
3704
+ ASSERT_EQ(enable_per_key_placement_,
3705
+ universal_compaction_picker.FilesRangeOverlapWithCompaction(
3706
+ input_files, 5));
3707
+
3708
+ // compacting the 3rd L4 file is always safe:
3709
+ input_set.clear();
3710
+ input_files.clear();
3711
+ input_set.insert(42);
3712
+ ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
3713
+ &input_files, &input_set, vstorage_.get(), comp_options));
3714
+
3715
+ ASSERT_FALSE(universal_compaction_picker.FilesRangeOverlapWithCompaction(
3716
+ input_files, 5));
3717
+ }
3718
+
3659
3719
  INSTANTIATE_TEST_CASE_P(PerKeyPlacementCompactionPickerTest,
3660
3720
  PerKeyPlacementCompactionPickerTest, ::testing::Bool());
3661
3721
 
@@ -3664,6 +3724,7 @@ INSTANTIATE_TEST_CASE_P(PerKeyPlacementCompactionPickerTest,
3664
3724
  } // namespace ROCKSDB_NAMESPACE
3665
3725
 
3666
3726
  int main(int argc, char** argv) {
3727
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
3667
3728
  ::testing::InitGoogleTest(&argc, argv);
3668
3729
  return RUN_ALL_TESTS();
3669
3730
  }
@@ -11,6 +11,8 @@
11
11
  #include "db/db_test_util.h"
12
12
  #include "port/stack_trace.h"
13
13
  #include "rocksdb/listener.h"
14
+ #include "rocksdb/utilities/debug.h"
15
+ #include "test_util/mock_time_env.h"
14
16
 
15
17
  namespace ROCKSDB_NAMESPACE {
16
18
 
@@ -416,36 +418,18 @@ TEST_P(TieredCompactionTest, RangeBasedTieredStorageUniversal) {
416
418
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
417
419
  ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
418
420
 
419
- // Add 2 keys in higher level, but in separated files, the keys within that
420
- // range should be moved up to the penultimate level
421
+ // Add 2 keys in higher level, but in separated files, all keys can be moved
422
+ // up if it's hot
421
423
  ASSERT_OK(Put(Key(0), "value" + std::to_string(0)));
422
424
  ASSERT_OK(Flush());
423
425
  ASSERT_OK(Put(Key(50), "value" + std::to_string(0)));
424
426
  ASSERT_OK(Flush());
425
- ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
426
- ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
427
-
428
- // Add an SST with a key range cover all the data we want to move from the
429
- // last level to the penultimate level
430
- ASSERT_OK(Put(Key(0), "value" + std::to_string(0)));
431
- ASSERT_OK(Put(Key(99), "value" + std::to_string(0)));
432
- ASSERT_OK(Flush());
433
-
434
- ResetAllStats(expect_stats, expect_pl_stats);
435
-
436
427
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
437
428
  ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
429
+
438
430
  ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
439
431
  ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
440
432
 
441
- last_stats.Add(kBasicCompStats);
442
- last_stats.ResetCompactionReason(CompactionReason::kManualCompaction);
443
- last_stats.bytes_read_output_level = kHasValue;
444
- last_stats.num_input_files_in_output_level = kHasValue;
445
- expect_pl_stats.Add(kBasicPerKeyPlacementCompStats);
446
- expect_pl_stats.ResetCompactionReason(CompactionReason::kManualCompaction);
447
- VerifyCompactionStats(expect_stats, expect_pl_stats);
448
-
449
433
  // change to only 1 key cold, to test compaction could stop even it matches
450
434
  // size amp compaction threshold
451
435
  {
@@ -1215,6 +1199,295 @@ TEST_P(TieredCompactionTest, RangeBasedTieredStorageLevel) {
1215
1199
  INSTANTIATE_TEST_CASE_P(TieredCompactionTest, TieredCompactionTest,
1216
1200
  testing::Bool());
1217
1201
 
1202
+ class PrecludeLastLevelTest : public DBTestBase {
1203
+ public:
1204
+ PrecludeLastLevelTest()
1205
+ : DBTestBase("preclude_last_level_test", /*env_do_fsync=*/false) {
1206
+ mock_clock_ = std::make_shared<MockSystemClock>(env_->GetSystemClock());
1207
+ mock_env_ = std::make_unique<CompositeEnvWrapper>(env_, mock_clock_);
1208
+ }
1209
+
1210
+ protected:
1211
+ std::unique_ptr<Env> mock_env_;
1212
+ std::shared_ptr<MockSystemClock> mock_clock_;
1213
+
1214
+ void SetUp() override {
1215
+ mock_clock_->InstallTimedWaitFixCallback();
1216
+ SyncPoint::GetInstance()->SetCallBack(
1217
+ "DBImpl::StartPeriodicTaskScheduler:Init", [&](void* arg) {
1218
+ auto periodic_task_scheduler_ptr =
1219
+ reinterpret_cast<PeriodicTaskScheduler*>(arg);
1220
+ periodic_task_scheduler_ptr->TEST_OverrideTimer(mock_clock_.get());
1221
+ });
1222
+ mock_clock_->SetCurrentTime(0);
1223
+ }
1224
+ };
1225
+
1226
+ TEST_F(PrecludeLastLevelTest, MigrationFromPreserveTimeManualCompaction) {
1227
+ const int kNumTrigger = 4;
1228
+ const int kNumLevels = 7;
1229
+ const int kNumKeys = 100;
1230
+ const int kKeyPerSec = 10;
1231
+
1232
+ Options options = CurrentOptions();
1233
+ options.compaction_style = kCompactionStyleUniversal;
1234
+ options.preserve_internal_time_seconds = 10000;
1235
+ options.env = mock_env_.get();
1236
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1237
+ options.num_levels = kNumLevels;
1238
+ DestroyAndReopen(options);
1239
+
1240
+ // pass some time first, otherwise the first a few keys write time are going
1241
+ // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
1242
+ dbfull()->TEST_WaitForPeridicTaskRun(
1243
+ [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
1244
+
1245
+ int sst_num = 0;
1246
+ // Write files that are overlap and enough to trigger compaction
1247
+ for (; sst_num < kNumTrigger; sst_num++) {
1248
+ for (int i = 0; i < kNumKeys; i++) {
1249
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
1250
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1251
+ mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
1252
+ });
1253
+ }
1254
+ ASSERT_OK(Flush());
1255
+ }
1256
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1257
+
1258
+ // all data is pushed to the last level
1259
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1260
+
1261
+ // enable preclude feature
1262
+ options.preclude_last_level_data_seconds = 10000;
1263
+ options.last_level_temperature = Temperature::kCold;
1264
+ Reopen(options);
1265
+
1266
+ // all data is hot, even they're in the last level
1267
+ ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
1268
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1269
+
1270
+ // Generate a sstable and trigger manual compaction
1271
+ ASSERT_OK(Put(Key(10), "value"));
1272
+ ASSERT_OK(Flush());
1273
+
1274
+ CompactRangeOptions cro;
1275
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
1276
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
1277
+
1278
+ // all data is moved up to the penultimate level
1279
+ ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
1280
+ ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
1281
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1282
+
1283
+ // close explicitly, because the env is local variable which will be released
1284
+ // first.
1285
+ Close();
1286
+ }
1287
+
1288
+ TEST_F(PrecludeLastLevelTest, MigrationFromPreserveTimeAutoCompaction) {
1289
+ const int kNumTrigger = 4;
1290
+ const int kNumLevels = 7;
1291
+ const int kNumKeys = 100;
1292
+ const int kKeyPerSec = 10;
1293
+
1294
+ Options options = CurrentOptions();
1295
+ options.compaction_style = kCompactionStyleUniversal;
1296
+ options.preserve_internal_time_seconds = 10000;
1297
+ options.env = mock_env_.get();
1298
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1299
+ options.num_levels = kNumLevels;
1300
+ DestroyAndReopen(options);
1301
+
1302
+ // pass some time first, otherwise the first a few keys write time are going
1303
+ // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
1304
+ dbfull()->TEST_WaitForPeridicTaskRun(
1305
+ [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
1306
+
1307
+ int sst_num = 0;
1308
+ // Write files that are overlap and enough to trigger compaction
1309
+ for (; sst_num < kNumTrigger; sst_num++) {
1310
+ for (int i = 0; i < kNumKeys; i++) {
1311
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
1312
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1313
+ mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
1314
+ });
1315
+ }
1316
+ ASSERT_OK(Flush());
1317
+ }
1318
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1319
+
1320
+ // all data is pushed to the last level
1321
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1322
+
1323
+ // enable preclude feature
1324
+ options.preclude_last_level_data_seconds = 10000;
1325
+ options.last_level_temperature = Temperature::kCold;
1326
+ // make sure it won't trigger Size Amp compaction, unlike normal Size Amp
1327
+ // compaction which is typically a last level compaction, when tiered Storage
1328
+ // ("preclude_last_level") is enabled, size amp won't include the last level.
1329
+ // As the last level would be in cold tier and the size would not be a
1330
+ // problem, which also avoid frequent hot to cold storage compaction.
1331
+ options.compaction_options_universal.max_size_amplification_percent = 400;
1332
+ Reopen(options);
1333
+
1334
+ // all data is hot, even they're in the last level
1335
+ ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
1336
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1337
+
1338
+ // Write more data, but still all hot until the 10th SST, as:
1339
+ // write a key every 10 seconds, 100 keys per SST, each SST takes 1000 seconds
1340
+ // The preclude_last_level_data_seconds is 10k
1341
+ Random rnd(301);
1342
+ for (; sst_num < kNumTrigger * 2 - 1; sst_num++) {
1343
+ for (int i = 0; i < kNumKeys; i++) {
1344
+ // the value needs to be big enough to trigger full compaction
1345
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), rnd.RandomString(100)));
1346
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1347
+ mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
1348
+ });
1349
+ }
1350
+ ASSERT_OK(Flush());
1351
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1352
+ }
1353
+
1354
+ // all data is moved up to the penultimate level
1355
+ ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
1356
+ ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
1357
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1358
+
1359
+ // close explicitly, because the env is local variable which will be released
1360
+ // first.
1361
+ Close();
1362
+ }
1363
+
1364
+ TEST_F(PrecludeLastLevelTest, MigrationFromPreserveTimePartial) {
1365
+ const int kNumTrigger = 4;
1366
+ const int kNumLevels = 7;
1367
+ const int kNumKeys = 100;
1368
+ const int kKeyPerSec = 10;
1369
+
1370
+ Options options = CurrentOptions();
1371
+ options.compaction_style = kCompactionStyleUniversal;
1372
+ options.preserve_internal_time_seconds = 2000;
1373
+ options.env = mock_env_.get();
1374
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1375
+ options.num_levels = kNumLevels;
1376
+ DestroyAndReopen(options);
1377
+
1378
+ // pass some time first, otherwise the first a few keys write time are going
1379
+ // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
1380
+ dbfull()->TEST_WaitForPeridicTaskRun(
1381
+ [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
1382
+
1383
+ int sst_num = 0;
1384
+ // Write files that are overlap and enough to trigger compaction
1385
+ for (; sst_num < kNumTrigger; sst_num++) {
1386
+ for (int i = 0; i < kNumKeys; i++) {
1387
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
1388
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1389
+ mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
1390
+ });
1391
+ }
1392
+ ASSERT_OK(Flush());
1393
+ }
1394
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1395
+
1396
+ // all data is pushed to the last level
1397
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1398
+
1399
+ std::vector<KeyVersion> key_versions;
1400
+ ASSERT_OK(GetAllKeyVersions(db_, Slice(), Slice(),
1401
+ std::numeric_limits<size_t>::max(),
1402
+ &key_versions));
1403
+
1404
+ // make sure there're more than 300 keys and first 100 keys are having seqno
1405
+ // zeroed out, the last 100 key seqno not zeroed out
1406
+ ASSERT_GT(key_versions.size(), 300);
1407
+ for (int i = 0; i < 100; i++) {
1408
+ ASSERT_EQ(key_versions[i].sequence, 0);
1409
+ }
1410
+ auto rit = key_versions.rbegin();
1411
+ for (int i = 0; i < 100; i++) {
1412
+ ASSERT_GT(rit->sequence, 0);
1413
+ rit++;
1414
+ }
1415
+
1416
+ // enable preclude feature
1417
+ options.preclude_last_level_data_seconds = 2000;
1418
+ options.last_level_temperature = Temperature::kCold;
1419
+ Reopen(options);
1420
+
1421
+ // Generate a sstable and trigger manual compaction
1422
+ ASSERT_OK(Put(Key(10), "value"));
1423
+ ASSERT_OK(Flush());
1424
+
1425
+ CompactRangeOptions cro;
1426
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
1427
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
1428
+
1429
+ // some data are moved up, some are not
1430
+ ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
1431
+ ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
1432
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1433
+
1434
+ Close();
1435
+ }
1436
+
1437
+ TEST_F(PrecludeLastLevelTest, SmallPrecludeTime) {
1438
+ const int kNumTrigger = 4;
1439
+ const int kNumLevels = 7;
1440
+ const int kNumKeys = 100;
1441
+
1442
+ Options options = CurrentOptions();
1443
+ options.compaction_style = kCompactionStyleUniversal;
1444
+ options.preclude_last_level_data_seconds = 60;
1445
+ options.preserve_internal_time_seconds = 0;
1446
+ options.env = mock_env_.get();
1447
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1448
+ options.num_levels = kNumLevels;
1449
+ options.last_level_temperature = Temperature::kCold;
1450
+ DestroyAndReopen(options);
1451
+
1452
+ Random rnd(301);
1453
+
1454
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1455
+ mock_clock_->MockSleepForSeconds(static_cast<int>(rnd.Uniform(10) + 1));
1456
+ });
1457
+
1458
+ for (int i = 0; i < kNumKeys; i++) {
1459
+ ASSERT_OK(Put(Key(i), rnd.RandomString(100)));
1460
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1461
+ mock_clock_->MockSleepForSeconds(static_cast<int>(rnd.Uniform(2)));
1462
+ });
1463
+ }
1464
+ ASSERT_OK(Flush());
1465
+
1466
+ TablePropertiesCollection tables_props;
1467
+ ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
1468
+ ASSERT_EQ(tables_props.size(), 1);
1469
+ ASSERT_FALSE(tables_props.begin()->second->seqno_to_time_mapping.empty());
1470
+ SeqnoToTimeMapping tp_mapping;
1471
+ ASSERT_OK(
1472
+ tp_mapping.Add(tables_props.begin()->second->seqno_to_time_mapping));
1473
+ ASSERT_OK(tp_mapping.Sort());
1474
+ ASSERT_FALSE(tp_mapping.Empty());
1475
+ auto seqs = tp_mapping.TEST_GetInternalMapping();
1476
+ ASSERT_FALSE(seqs.empty());
1477
+
1478
+ // Wait more than preclude_last_level time, then make sure all the data is
1479
+ // compacted to the last level even there's no write (no seqno -> time
1480
+ // information was flushed to any SST).
1481
+ mock_clock_->MockSleepForSeconds(100);
1482
+
1483
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1484
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1485
+ ASSERT_EQ(GetSstSizeHelper(Temperature::kUnknown), 0);
1486
+ ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
1487
+
1488
+ Close();
1489
+ }
1490
+
1218
1491
  #endif // !defined(ROCKSDB_LITE)
1219
1492
 
1220
1493
  } // namespace ROCKSDB_NAMESPACE
@@ -673,6 +673,7 @@ TEST_P(ComparatorDBTest, SeparatorSuccessorRandomizeTest) {
673
673
  } // namespace ROCKSDB_NAMESPACE
674
674
 
675
675
  int main(int argc, char** argv) {
676
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
676
677
  ::testing::InitGoogleTest(&argc, argv);
677
678
  return RUN_ALL_TESTS();
678
679
  }
@@ -345,6 +345,7 @@ TEST_F(CuckooTableDBTest, AdaptiveTable) {
345
345
 
346
346
  int main(int argc, char** argv) {
347
347
  if (ROCKSDB_NAMESPACE::port::kLittleEndian) {
348
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
348
349
  ::testing::InitGoogleTest(&argc, argv);
349
350
  return RUN_ALL_TESTS();
350
351
  } else {