@nxtedition/rocksdb 8.2.0 → 8.2.2

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 (321) hide show
  1. package/binding.cc +3 -3
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -52
  3. package/deps/rocksdb/rocksdb/Makefile +10 -5
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -345
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +92 -0
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +32 -32
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +12 -9
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +6 -43
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +3 -13
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +8 -5
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +21 -47
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -8
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +1 -2
  15. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +44 -7
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +13 -14
  17. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +1 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -0
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +2 -1
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +17 -8
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +40 -21
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +41 -42
  25. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +1 -1
  26. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +1 -1
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +5 -4
  28. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -2
  29. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +5 -3
  30. package/deps/rocksdb/rocksdb/db/builder.cc +7 -6
  31. package/deps/rocksdb/rocksdb/db/builder.h +2 -2
  32. package/deps/rocksdb/rocksdb/db/c.cc +76 -5
  33. package/deps/rocksdb/rocksdb/db/c_test.c +141 -0
  34. package/deps/rocksdb/rocksdb/db/column_family.cc +32 -0
  35. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +3 -2
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +5 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +8 -5
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +12 -10
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +21 -17
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -7
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +3 -1
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +77 -50
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +4 -5
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +55 -8
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +142 -56
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +1 -2
  50. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +21 -20
  51. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  52. package/deps/rocksdb/rocksdb/db/corruption_test.cc +5 -4
  53. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +6 -3
  54. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +260 -220
  55. package/deps/rocksdb/rocksdb/db/db_clip_test.cc +142 -0
  56. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +1 -1
  57. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +333 -27
  58. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +5 -0
  59. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +7 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +189 -27
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +23 -10
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +134 -90
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -2
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -3
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -1
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +124 -16
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +10 -0
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +7 -0
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +15 -0
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -5
  71. package/deps/rocksdb/rocksdb/db/db_iter.cc +7 -8
  72. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +54 -3
  73. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +42 -0
  74. package/deps/rocksdb/rocksdb/db/db_options_test.cc +116 -1
  75. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -2
  76. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +3 -2
  77. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +9 -8
  78. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +142 -63
  79. package/deps/rocksdb/rocksdb/db/db_test.cc +28 -7
  80. package/deps/rocksdb/rocksdb/db/db_test2.cc +71 -131
  81. package/deps/rocksdb/rocksdb/db/db_test_util.cc +18 -0
  82. package/deps/rocksdb/rocksdb/db/db_test_util.h +6 -0
  83. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +10 -10
  84. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +25 -0
  85. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +88 -0
  86. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +67 -0
  87. package/deps/rocksdb/rocksdb/db/db_write_test.cc +5 -0
  88. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  89. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -2
  90. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +86 -1
  91. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +15 -2
  92. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -2
  93. package/deps/rocksdb/rocksdb/db/flush_job.cc +21 -14
  94. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +14 -7
  95. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +31 -8
  96. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +21 -19
  97. package/deps/rocksdb/rocksdb/db/internal_stats.cc +42 -12
  98. package/deps/rocksdb/rocksdb/db/internal_stats.h +1 -0
  99. package/deps/rocksdb/rocksdb/db/kv_checksum.h +92 -6
  100. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -2
  101. package/deps/rocksdb/rocksdb/db/log_format.h +8 -4
  102. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -51
  103. package/deps/rocksdb/rocksdb/db/log_reader.h +16 -0
  104. package/deps/rocksdb/rocksdb/db/log_test.cc +125 -4
  105. package/deps/rocksdb/rocksdb/db/log_writer.cc +32 -2
  106. package/deps/rocksdb/rocksdb/db/log_writer.h +16 -0
  107. package/deps/rocksdb/rocksdb/db/memtable.cc +17 -46
  108. package/deps/rocksdb/rocksdb/db/memtable.h +1 -1
  109. package/deps/rocksdb/rocksdb/db/memtable_list.cc +8 -4
  110. package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -1
  111. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +5 -4
  113. package/deps/rocksdb/rocksdb/db/repair.cc +38 -11
  114. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -3
  115. package/deps/rocksdb/rocksdb/db/table_cache.cc +68 -51
  116. package/deps/rocksdb/rocksdb/db/table_cache.h +20 -10
  117. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -1
  118. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +6 -3
  119. package/deps/rocksdb/rocksdb/db/version_builder.cc +9 -5
  120. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  121. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +140 -120
  122. package/deps/rocksdb/rocksdb/db/version_edit.cc +14 -0
  123. package/deps/rocksdb/rocksdb/db/version_edit.h +12 -4
  124. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +21 -13
  125. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +26 -16
  126. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +9 -9
  127. package/deps/rocksdb/rocksdb/db/version_set.cc +292 -96
  128. package/deps/rocksdb/rocksdb/db/version_set.h +53 -28
  129. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -0
  130. package/deps/rocksdb/rocksdb/db/version_set_test.cc +62 -22
  131. package/deps/rocksdb/rocksdb/db/version_util.h +5 -4
  132. package/deps/rocksdb/rocksdb/db/write_batch.cc +3 -1
  133. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  134. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +119 -27
  135. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +123 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +7 -2
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +34 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -0
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +43 -33
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +29 -17
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -1
  144. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +85 -50
  145. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +96 -54
  146. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.cc +122 -0
  147. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +206 -0
  148. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +9 -1
  149. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +9 -3
  150. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +322 -92
  151. package/deps/rocksdb/rocksdb/env/env_posix.cc +12 -8
  152. package/deps/rocksdb/rocksdb/env/env_test.cc +31 -0
  153. package/deps/rocksdb/rocksdb/env/mock_env.cc +1 -1
  154. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +14 -0
  155. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -1
  156. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +5 -1
  157. package/deps/rocksdb/rocksdb/file/file_util.cc +3 -3
  158. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  159. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +89 -0
  160. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +22 -7
  161. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -2
  162. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +1 -1
  163. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +1 -1
  164. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +1 -1
  165. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +3 -0
  166. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +154 -74
  167. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +27 -7
  168. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +107 -28
  169. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +19 -0
  170. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +8 -0
  171. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
  172. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +7 -1
  173. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +137 -152
  174. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +61 -26
  175. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +30 -26
  176. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +33 -16
  177. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +87 -8
  178. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +1 -1
  179. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +5 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  181. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +1 -0
  182. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -1
  184. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  185. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +9 -2
  186. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -0
  187. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +78 -42
  188. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +14 -9
  189. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +4 -9
  192. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +19 -11
  193. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  194. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +211 -555
  195. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -1
  196. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +36 -2
  197. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +17 -7
  198. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +10 -7
  199. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +19 -18
  200. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +10 -2
  201. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
  202. package/deps/rocksdb/rocksdb/options/cf_options.cc +35 -2
  203. package/deps/rocksdb/rocksdb/options/cf_options.h +5 -0
  204. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1 -1
  205. package/deps/rocksdb/rocksdb/options/options.cc +12 -53
  206. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -0
  207. package/deps/rocksdb/rocksdb/options/options_parser.cc +11 -0
  208. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +32 -4
  209. package/deps/rocksdb/rocksdb/options/options_test.cc +89 -5
  210. package/deps/rocksdb/rocksdb/port/lang.h +27 -0
  211. package/deps/rocksdb/rocksdb/port/stack_trace.cc +67 -24
  212. package/deps/rocksdb/rocksdb/src.mk +2 -0
  213. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -3
  214. package/deps/rocksdb/rocksdb/table/block_based/block.cc +195 -35
  215. package/deps/rocksdb/rocksdb/table/block_based/block.h +197 -24
  216. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +71 -51
  217. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +7 -1
  218. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +4 -6
  219. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +3 -0
  220. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +43 -2
  221. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +36 -6
  222. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +266 -166
  223. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +44 -14
  224. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -1
  225. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +63 -56
  226. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +8 -2
  227. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +4 -2
  228. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +10 -0
  229. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +14 -2
  230. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +918 -2
  231. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -2
  232. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -9
  233. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -8
  234. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +2 -2
  235. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -1
  236. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +18 -23
  237. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +8 -8
  238. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -32
  239. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +7 -8
  240. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +4 -5
  241. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +3 -3
  242. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +46 -53
  243. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +12 -12
  244. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -9
  245. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +26 -23
  246. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -1
  247. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +3 -0
  248. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -2
  249. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +3 -2
  250. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +7 -1
  251. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  252. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  253. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +3 -2
  254. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +5 -2
  255. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +4 -2
  256. package/deps/rocksdb/rocksdb/table/format.cc +4 -4
  257. package/deps/rocksdb/rocksdb/table/format.h +1 -1
  258. package/deps/rocksdb/rocksdb/table/get_context.cc +1 -1
  259. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +33 -22
  260. package/deps/rocksdb/rocksdb/table/meta_blocks.h +4 -0
  261. package/deps/rocksdb/rocksdb/table/mock_table.cc +4 -2
  262. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +1 -1
  263. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +1 -1
  264. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +18 -10
  265. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -3
  266. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +10 -7
  267. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +4 -2
  268. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +11 -0
  269. package/deps/rocksdb/rocksdb/table/table_builder.h +14 -5
  270. package/deps/rocksdb/rocksdb/table/table_properties.cc +2 -0
  271. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -3
  272. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +1 -1
  273. package/deps/rocksdb/rocksdb/table/table_test.cc +291 -34
  274. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +3 -1
  275. package/deps/rocksdb/rocksdb/test_util/testharness.h +5 -0
  276. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -2
  277. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +33 -17
  278. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -1
  279. package/deps/rocksdb/rocksdb/util/bloom_impl.h +2 -2
  280. package/deps/rocksdb/rocksdb/util/compression.h +1 -1
  281. package/deps/rocksdb/rocksdb/util/crc32c.cc +24 -83
  282. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +7 -9
  283. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +4 -1
  284. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  285. package/deps/rocksdb/rocksdb/util/gflags_compat.h +9 -10
  286. package/deps/rocksdb/rocksdb/util/math.h +12 -7
  287. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +16 -18
  288. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +46 -2
  289. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +6 -6
  290. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +12 -7
  291. package/deps/rocksdb/rocksdb/util/stop_watch.h +31 -13
  292. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +2 -0
  293. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  294. package/deps/rocksdb/rocksdb/util/udt_util.h +77 -0
  295. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +2 -2
  296. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -1
  297. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +1 -1
  298. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +1 -1
  299. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
  300. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -1
  301. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +11 -1
  302. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +34 -1
  303. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +15 -0
  304. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +1 -1
  305. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +5 -1
  306. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +29 -1
  307. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +0 -1
  308. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +0 -1
  309. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +6 -1
  310. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +10 -0
  311. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +6 -1
  312. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +5 -0
  313. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +5 -0
  314. package/package.json +1 -1
  315. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  316. package/prebuilds/linux-x64/node.napi.node +0 -0
  317. /package/deps/rocksdb/rocksdb/memory/{memory_allocator.h → memory_allocator_impl.h} +0 -0
  318. /package/deps/rocksdb/rocksdb/monitoring/{statistics.h → statistics_impl.h} +0 -0
  319. /package/deps/rocksdb/rocksdb/table/block_based/{flush_block_policy.h → flush_block_policy_impl.h} +0 -0
  320. /package/deps/rocksdb/rocksdb/util/{rate_limiter.h → rate_limiter_impl.h} +0 -0
  321. /package/deps/rocksdb/rocksdb/utilities/agg_merge/{agg_merge.h → agg_merge_impl.h} +0 -0
@@ -0,0 +1,142 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #include "db/db_test_util.h"
7
+ #include "port/port.h"
8
+ #include "util/random.h"
9
+
10
+ namespace ROCKSDB_NAMESPACE {
11
+
12
+ class DBClipTest : public DBTestBase {
13
+ public:
14
+ DBClipTest() : DBTestBase("db_clip_test", /*env_do_fsync=*/true) {}
15
+ };
16
+
17
+ TEST_F(DBClipTest, TestClipRange) {
18
+ Options options = CurrentOptions();
19
+ options.write_buffer_size = 10 * 1024 * 1024;
20
+ options.max_bytes_for_level_multiplier = 2;
21
+ options.num_levels = 3;
22
+ options.max_background_compactions = 3;
23
+ options.disable_auto_compactions = true;
24
+ options.statistics = CreateDBStatistics();
25
+
26
+ DestroyAndReopen(options);
27
+ int32_t value_size = 10 * 1024; // 10 KB
28
+
29
+ Random rnd(301);
30
+ std::map<int32_t, std::string> values;
31
+
32
+ // file [0 => 100), [100 => 200), ... [900, 1000)
33
+ for (auto i = 0; i < 10; i++) {
34
+ for (auto j = 0; j < 100; j++) {
35
+ auto k = i * 100 + j;
36
+ values[k] = rnd.RandomString(value_size);
37
+ ASSERT_OK(Put(Key(k), values[k]));
38
+ }
39
+ ASSERT_OK(Flush());
40
+ }
41
+ ASSERT_EQ("10", FilesPerLevel(0));
42
+ auto begin_key = Key(251), end_key = Key(751);
43
+ ASSERT_OK(
44
+ db_->ClipColumnFamily(db_->DefaultColumnFamily(), begin_key, end_key));
45
+
46
+ for (auto i = 0; i < 251; i++) {
47
+ ReadOptions ropts;
48
+ std::string result;
49
+ auto s = db_->Get(ropts, Key(i), &result);
50
+ ASSERT_TRUE(s.IsNotFound());
51
+ }
52
+ for (auto i = 251; i < 751; i++) {
53
+ ASSERT_EQ(Get(Key(i)), values[i]);
54
+ }
55
+ for (auto i = 751; i < 1000; i++) {
56
+ ReadOptions ropts;
57
+ std::string result;
58
+ auto s = db_->Get(ropts, Key(i), &result);
59
+ ASSERT_TRUE(s.IsNotFound());
60
+ }
61
+
62
+ std::vector<LiveFileMetaData> all_metadata;
63
+ db_->GetLiveFilesMetaData(&all_metadata);
64
+ for (auto& md : all_metadata) {
65
+ // make sure clip_begin_key <= file_smallestkey <= file_largestkey <=
66
+ // clip_end_key
67
+ bool in_range = false;
68
+
69
+ if (options.comparator->Compare(begin_key, md.smallestkey) <= 0 &&
70
+ options.comparator->Compare(end_key, md.largestkey) > 0) {
71
+ in_range = true;
72
+ }
73
+ ASSERT_TRUE(in_range);
74
+ }
75
+
76
+ CompactRangeOptions compact_options;
77
+ compact_options.change_level = true;
78
+ compact_options.target_level = 2;
79
+ ASSERT_OK(db_->CompactRange(compact_options, nullptr, nullptr));
80
+ ASSERT_EQ("0,0,3", FilesPerLevel(0));
81
+
82
+ for (auto i = 0; i < 10; i += 2) {
83
+ for (auto j = 0; j < 100; j++) {
84
+ auto k = i * 100 + j;
85
+ ASSERT_OK(Put(Key(k), values[k]));
86
+ }
87
+ ASSERT_OK(Flush());
88
+ }
89
+ ASSERT_EQ("5,0,3", FilesPerLevel(0));
90
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr));
91
+ ASSERT_EQ("0,5,3", FilesPerLevel(0));
92
+
93
+ for (auto i = 1; i < 10; i += 2) {
94
+ for (auto j = 0; j < 100; j++) {
95
+ auto k = i * 100 + j;
96
+ ASSERT_OK(Put(Key(k), values[k]));
97
+ }
98
+ ASSERT_OK(Flush());
99
+ }
100
+ ASSERT_EQ("5,5,3", FilesPerLevel(0));
101
+
102
+ auto begin_key_2 = Key(222), end_key_2 = Key(888);
103
+
104
+ ASSERT_OK(db_->ClipColumnFamily(db_->DefaultColumnFamily(), begin_key_2,
105
+ end_key_2));
106
+
107
+ for (auto i = 0; i < 222; i++) {
108
+ ReadOptions ropts;
109
+ std::string result;
110
+ auto s = db_->Get(ropts, Key(i), &result);
111
+ ASSERT_TRUE(s.IsNotFound());
112
+ }
113
+ for (auto i = 222; i < 888; i++) {
114
+ ASSERT_EQ(Get(Key(i)), values[i]);
115
+ }
116
+ for (auto i = 888; i < 1000; i++) {
117
+ ReadOptions ropts;
118
+ std::string result;
119
+ auto s = db_->Get(ropts, Key(i), &result);
120
+ ASSERT_TRUE(s.IsNotFound());
121
+ }
122
+
123
+ std::vector<LiveFileMetaData> all_metadata_2;
124
+ db_->GetLiveFilesMetaData(&all_metadata_2);
125
+ for (auto& md : all_metadata_2) {
126
+ // make sure clip_begin_key <= file_smallestkey <= file_largestkey <=
127
+ // clip_end_key
128
+ bool in_range = false;
129
+ if (begin_key_2.compare(md.smallestkey) <= 0 &&
130
+ end_key_2.compare(md.largestkey) > 0) {
131
+ in_range = true;
132
+ }
133
+ ASSERT_TRUE(in_range);
134
+ }
135
+ }
136
+ } // namespace ROCKSDB_NAMESPACE
137
+
138
+ int main(int argc, char** argv) {
139
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
140
+ ::testing::InitGoogleTest(&argc, argv);
141
+ return RUN_ALL_TESTS();
142
+ }
@@ -742,7 +742,7 @@ TEST_F(DBTestCompactionFilter, CompactionFilterContextCfId) {
742
742
  ASSERT_TRUE(filter->compaction_filter_created());
743
743
  }
744
744
 
745
- // Compaction filters aplies to all records, regardless snapshots.
745
+ // Compaction filters applies to all records, regardless snapshots.
746
746
  TEST_F(DBTestCompactionFilter, CompactionFilterIgnoreSnapshot) {
747
747
  std::string five = std::to_string(5);
748
748
  Options options = CurrentOptions();
@@ -136,11 +136,12 @@ class DBCompactionTestWithParam
136
136
 
137
137
  class DBCompactionTestWithBottommostParam
138
138
  : public DBTestBase,
139
- public testing::WithParamInterface<BottommostLevelCompaction> {
139
+ public testing::WithParamInterface<
140
+ std::tuple<BottommostLevelCompaction, bool>> {
140
141
  public:
141
142
  DBCompactionTestWithBottommostParam()
142
143
  : DBTestBase("db_compaction_test", /*env_do_fsync=*/true) {
143
- bottommost_level_compaction_ = GetParam();
144
+ bottommost_level_compaction_ = std::get<0>(GetParam());
144
145
  }
145
146
 
146
147
  BottommostLevelCompaction bottommost_level_compaction_;
@@ -1104,7 +1105,7 @@ TEST_F(DBCompactionTest, CompactionSstPartitionerNonTrivial) {
1104
1105
  ASSERT_OK(Put("bbbb1", "B"));
1105
1106
  ASSERT_OK(Flush());
1106
1107
  ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
1107
- ASSERT_OK(dbfull()->TEST_WaitForCompact(true));
1108
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1108
1109
 
1109
1110
  std::vector<LiveFileMetaData> files;
1110
1111
  dbfull()->GetLiveFilesMetaData(&files);
@@ -3613,7 +3614,10 @@ TEST_F(DBCompactionTest, CancelCompactionWaitingOnConflict) {
3613
3614
  Random rnd(301);
3614
3615
  for (int i = 0; i < kNumSortedRuns; ++i) {
3615
3616
  int key_idx = 0;
3616
- GenerateNewFile(&rnd, &key_idx, true /* nowait */);
3617
+ // We hold the compaction from happening, so when generating the last SST
3618
+ // file, we cannot wait. Otherwise, we'll hit a deadlock.
3619
+ GenerateNewFile(&rnd, &key_idx,
3620
+ (i == kNumSortedRuns - 1) ? true : false /* nowait */);
3617
3621
  }
3618
3622
  auto_compaction_sleeping_task.WaitUntilSleeping();
3619
3623
 
@@ -5071,7 +5075,11 @@ TEST_F(DBCompactionTest, CompactRangeShutdownWhileDelayed) {
5071
5075
  manual_compaction_thread.join();
5072
5076
  TEST_SYNC_POINT(
5073
5077
  "DBCompactionTest::CompactRangeShutdownWhileDelayed:PostManual");
5074
- ASSERT_OK(dbfull()->TEST_WaitForCompact());
5078
+ if (i == 0) {
5079
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
5080
+ } else {
5081
+ ASSERT_NOK(dbfull()->TEST_WaitForCompact());
5082
+ }
5075
5083
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
5076
5084
  }
5077
5085
  }
@@ -5506,8 +5514,9 @@ TEST_F(DBCompactionTest, CompactionLimiter) {
5506
5514
 
5507
5515
  for (int n = 0; n < options.level0_file_num_compaction_trigger; n++) {
5508
5516
  for (unsigned int cf = 0; cf < cf_count; cf++) {
5517
+ // All L0s should overlap with each other
5509
5518
  for (int i = 0; i < kNumKeysPerFile; i++) {
5510
- ASSERT_OK(Put(cf, Key(keyIndex++), ""));
5519
+ ASSERT_OK(Put(cf, Key(i), ""));
5511
5520
  }
5512
5521
  // put extra key to trigger flush
5513
5522
  ASSERT_OK(Put(cf, "", ""));
@@ -6735,10 +6744,8 @@ class DBCompactionTestL0FilesMisorderCorruption : public DBCompactionTest {
6735
6744
  if (compaction_path_to_test == "FindIntraL0Compaction" ||
6736
6745
  compaction_path_to_test == "CompactRange") {
6737
6746
  fifo_options.allow_compaction = true;
6738
- fifo_options.age_for_warm = 0;
6739
6747
  } else if (compaction_path_to_test == "CompactFile") {
6740
6748
  fifo_options.allow_compaction = false;
6741
- fifo_options.age_for_warm = 0;
6742
6749
  }
6743
6750
  options_.compaction_options_fifo = fifo_options;
6744
6751
  }
@@ -7335,10 +7342,63 @@ TEST_P(DBCompactionTestL0FilesMisorderCorruptionWithParam,
7335
7342
  Destroy(options_);
7336
7343
  }
7337
7344
 
7345
+ TEST_F(DBCompactionTest, SingleLevelUniveresal) {
7346
+ // Tests that manual compaction works with single level universal compaction.
7347
+ Options options = CurrentOptions();
7348
+ options.compaction_style = kCompactionStyleUniversal;
7349
+ options.disable_auto_compactions = true;
7350
+ options.num_levels = 1;
7351
+ DestroyAndReopen(options);
7352
+
7353
+ Random rnd(31);
7354
+ for (int i = 0; i < 10; ++i) {
7355
+ for (int j = 0; j < 50; ++j) {
7356
+ ASSERT_OK(Put(Key(i * 100 + j), rnd.RandomString(50)));
7357
+ }
7358
+ ASSERT_OK(Flush());
7359
+ }
7360
+ ASSERT_EQ(NumTableFilesAtLevel(0), 10);
7361
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
7362
+ ASSERT_EQ(NumTableFilesAtLevel(0), 1);
7363
+ }
7364
+
7365
+ TEST_F(DBCompactionTest, SingleOverlappingNonL0BottommostManualCompaction) {
7366
+ // Tests that manual compact will rewrite bottommost level
7367
+ // when there is only a single non-L0 level that overlaps with
7368
+ // manual compaction range.
7369
+ constexpr int kSstNum = 10;
7370
+ Options options = CurrentOptions();
7371
+ options.disable_auto_compactions = true;
7372
+ options.num_levels = 7;
7373
+ for (auto b : {BottommostLevelCompaction::kForce,
7374
+ BottommostLevelCompaction::kForceOptimized}) {
7375
+ DestroyAndReopen(options);
7376
+
7377
+ // Generate some sst files on level 0 with sequence keys (no overlap)
7378
+ for (int i = 0; i < kSstNum; i++) {
7379
+ for (int j = 1; j < UCHAR_MAX; j++) {
7380
+ auto key = std::string(kSstNum, '\0');
7381
+ key[kSstNum - i] += static_cast<char>(j);
7382
+ ASSERT_OK(Put(key, std::string(i % 1000, 'A')));
7383
+ }
7384
+ ASSERT_OK(Flush());
7385
+ }
7386
+ MoveFilesToLevel(4);
7387
+ ASSERT_EQ(NumTableFilesAtLevel(4), kSstNum);
7388
+ CompactRangeOptions cro;
7389
+ cro.bottommost_level_compaction = b;
7390
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
7391
+ ASSERT_EQ(NumTableFilesAtLevel(4), 1);
7392
+ }
7393
+ }
7394
+
7338
7395
  TEST_P(DBCompactionTestWithBottommostParam, SequenceKeysManualCompaction) {
7339
7396
  constexpr int kSstNum = 10;
7340
7397
  Options options = CurrentOptions();
7341
7398
  options.disable_auto_compactions = true;
7399
+ options.num_levels = 7;
7400
+ const bool dynamic_level = std::get<1>(GetParam());
7401
+ options.level_compaction_dynamic_level_bytes = dynamic_level;
7342
7402
  DestroyAndReopen(options);
7343
7403
 
7344
7404
  // Generate some sst files on level 0 with sequence keys (no overlap)
@@ -7356,25 +7416,42 @@ TEST_P(DBCompactionTestWithBottommostParam, SequenceKeysManualCompaction) {
7356
7416
 
7357
7417
  auto cro = CompactRangeOptions();
7358
7418
  cro.bottommost_level_compaction = bottommost_level_compaction_;
7419
+ bool trivial_moved = false;
7420
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
7421
+ "DBImpl::BackgroundCompaction:TrivialMove",
7422
+ [&](void* /*arg*/) { trivial_moved = true; });
7423
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
7424
+ // All bottommost_level_compaction options should allow l0 -> l1 trivial move.
7359
7425
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
7426
+ ASSERT_TRUE(trivial_moved);
7360
7427
  if (bottommost_level_compaction_ == BottommostLevelCompaction::kForce ||
7361
7428
  bottommost_level_compaction_ ==
7362
7429
  BottommostLevelCompaction::kForceOptimized) {
7363
- // Real compaction to compact all sst files from level 0 to 1 file on level
7364
- // 1
7365
- ASSERT_EQ("0,1", FilesPerLevel(0));
7430
+ // bottommost level should go through intra-level compaction
7431
+ // and has only 1 file
7432
+ if (dynamic_level) {
7433
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel(0));
7434
+ } else {
7435
+ ASSERT_EQ("0,1", FilesPerLevel(0));
7436
+ }
7366
7437
  } else {
7367
- // Just trivial move from level 0 -> 1
7368
- ASSERT_EQ("0," + std::to_string(kSstNum), FilesPerLevel(0));
7438
+ // Just trivial move from level 0 -> 1/base
7439
+ if (dynamic_level) {
7440
+ ASSERT_EQ("0,0,0,0,0,0," + std::to_string(kSstNum), FilesPerLevel(0));
7441
+ } else {
7442
+ ASSERT_EQ("0," + std::to_string(kSstNum), FilesPerLevel(0));
7443
+ }
7369
7444
  }
7370
7445
  }
7371
7446
 
7372
7447
  INSTANTIATE_TEST_CASE_P(
7373
7448
  DBCompactionTestWithBottommostParam, DBCompactionTestWithBottommostParam,
7374
- ::testing::Values(BottommostLevelCompaction::kSkip,
7375
- BottommostLevelCompaction::kIfHaveCompactionFilter,
7376
- BottommostLevelCompaction::kForce,
7377
- BottommostLevelCompaction::kForceOptimized));
7449
+ ::testing::Combine(
7450
+ ::testing::Values(BottommostLevelCompaction::kSkip,
7451
+ BottommostLevelCompaction::kIfHaveCompactionFilter,
7452
+ BottommostLevelCompaction::kForce,
7453
+ BottommostLevelCompaction::kForceOptimized),
7454
+ ::testing::Bool()));
7378
7455
 
7379
7456
  TEST_F(DBCompactionTest, UpdateLevelSubCompactionTest) {
7380
7457
  Options options = CurrentOptions();
@@ -8518,7 +8595,7 @@ TEST_F(DBCompactionTest, CompactionWithChecksumHandoffManifest2) {
8518
8595
  Destroy(options);
8519
8596
  }
8520
8597
 
8521
- TEST_F(DBCompactionTest, FIFOWarm) {
8598
+ TEST_F(DBCompactionTest, FIFOChangeTemperature) {
8522
8599
  Options options = CurrentOptions();
8523
8600
  options.compaction_style = kCompactionStyleFIFO;
8524
8601
  options.num_levels = 1;
@@ -8526,18 +8603,18 @@ TEST_F(DBCompactionTest, FIFOWarm) {
8526
8603
  options.level0_file_num_compaction_trigger = 2;
8527
8604
  options.create_if_missing = true;
8528
8605
  CompactionOptionsFIFO fifo_options;
8529
- fifo_options.age_for_warm = 1000;
8606
+ fifo_options.file_temperature_age_thresholds = {{Temperature::kCold, 1000}};
8530
8607
  fifo_options.max_table_files_size = 100000000;
8531
8608
  options.compaction_options_fifo = fifo_options;
8532
8609
  env_->SetMockSleep();
8533
8610
  Reopen(options);
8534
8611
 
8535
- int total_warm = 0;
8612
+ int total_cold = 0;
8536
8613
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
8537
8614
  "NewWritableFile::FileOptions.temperature", [&](void* arg) {
8538
8615
  Temperature temperature = *(static_cast<Temperature*>(arg));
8539
- if (temperature == Temperature::kWarm) {
8540
- total_warm++;
8616
+ if (temperature == Temperature::kCold) {
8617
+ total_cold++;
8541
8618
  }
8542
8619
  });
8543
8620
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
@@ -8574,9 +8651,9 @@ TEST_F(DBCompactionTest, FIFOWarm) {
8574
8651
  ASSERT_EQ(4, metadata.file_count);
8575
8652
  ASSERT_EQ(Temperature::kUnknown, metadata.levels[0].files[0].temperature);
8576
8653
  ASSERT_EQ(Temperature::kUnknown, metadata.levels[0].files[1].temperature);
8577
- ASSERT_EQ(Temperature::kWarm, metadata.levels[0].files[2].temperature);
8578
- ASSERT_EQ(Temperature::kWarm, metadata.levels[0].files[3].temperature);
8579
- ASSERT_EQ(2, total_warm);
8654
+ ASSERT_EQ(Temperature::kCold, metadata.levels[0].files[2].temperature);
8655
+ ASSERT_EQ(Temperature::kCold, metadata.levels[0].files[3].temperature);
8656
+ ASSERT_EQ(2, total_cold);
8580
8657
 
8581
8658
  Destroy(options);
8582
8659
  }
@@ -8641,7 +8718,7 @@ TEST_F(DBCompactionTest, DisableMultiManualCompaction) {
8641
8718
 
8642
8719
  sleeping_task_low.WakeUp();
8643
8720
  sleeping_task_low.WaitUntilDone();
8644
- ASSERT_OK(dbfull()->TEST_WaitForCompact(true));
8721
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
8645
8722
  }
8646
8723
 
8647
8724
  TEST_F(DBCompactionTest, DisableJustStartedManualCompaction) {
@@ -8773,7 +8850,7 @@ TEST_F(DBCompactionTest, DisableManualCompactionThreadQueueFull) {
8773
8850
 
8774
8851
  sleeping_task_low.WakeUp();
8775
8852
  sleeping_task_low.WaitUntilDone();
8776
- ASSERT_OK(dbfull()->TEST_WaitForCompact(true));
8853
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
8777
8854
  ASSERT_EQ("0,1", FilesPerLevel(0));
8778
8855
  }
8779
8856
 
@@ -9108,6 +9185,235 @@ TEST_F(DBCompactionTest, BottommostFileCompactionAllowIngestBehind) {
9108
9185
  // ASSERT_OK(dbfull()->TEST_WaitForCompact(true /* wait_unscheduled */));
9109
9186
  }
9110
9187
 
9188
+ TEST_F(DBCompactionTest, TurnOnLevelCompactionDynamicLevelBytes) {
9189
+ Options options = CurrentOptions();
9190
+ options.compaction_style = kCompactionStyleLevel;
9191
+ options.allow_ingest_behind = false;
9192
+ options.level_compaction_dynamic_level_bytes = false;
9193
+ options.num_levels = 6;
9194
+ options.compression = kNoCompression;
9195
+ options.max_bytes_for_level_base = 1 << 20;
9196
+ options.max_bytes_for_level_multiplier = 10;
9197
+ DestroyAndReopen(options);
9198
+
9199
+ // put files in L0, L1 and L2
9200
+ WriteOptions write_opts;
9201
+ ASSERT_OK(db_->Put(write_opts, Key(1), "val1"));
9202
+ Random rnd(33);
9203
+ // Fill L2 with size larger than max_bytes_for_level_base,
9204
+ // so the level above it won't be drained.
9205
+ for (int i = 2; i <= (1 << 10); ++i) {
9206
+ ASSERT_OK(db_->Put(write_opts, Key(i), rnd.RandomString(2 << 10)));
9207
+ }
9208
+ ASSERT_OK(Flush());
9209
+ MoveFilesToLevel(2);
9210
+ ASSERT_OK(db_->Put(write_opts, Key(2), "val2"));
9211
+ ASSERT_OK(Flush());
9212
+ MoveFilesToLevel(2);
9213
+ ASSERT_OK(db_->Put(write_opts, Key(1), "new_val1"));
9214
+ ASSERT_OK(Flush());
9215
+ MoveFilesToLevel(1);
9216
+ ASSERT_OK(db_->Put(write_opts, Key(3), "val3"));
9217
+ ASSERT_OK(Flush());
9218
+ ASSERT_EQ("1,1,2", FilesPerLevel());
9219
+ auto verify_db = [&]() {
9220
+ ASSERT_EQ(Get(Key(1)), "new_val1");
9221
+ ASSERT_EQ(Get(Key(2)), "val2");
9222
+ ASSERT_EQ(Get(Key(3)), "val3");
9223
+ };
9224
+ verify_db();
9225
+
9226
+ options.level_compaction_dynamic_level_bytes = true;
9227
+ Reopen(options);
9228
+ // except for L0, files should be pushed down as much as possible
9229
+ ASSERT_EQ("1,0,0,0,1,2", FilesPerLevel());
9230
+ verify_db();
9231
+
9232
+ // turning the options on and off should be safe
9233
+ options.level_compaction_dynamic_level_bytes = false;
9234
+ Reopen(options);
9235
+ MoveFilesToLevel(1);
9236
+ ASSERT_EQ("0,1,0,0,1,2", FilesPerLevel());
9237
+ verify_db();
9238
+
9239
+ // newly flushed file is also pushed down
9240
+ options.level_compaction_dynamic_level_bytes = true;
9241
+ Reopen(options);
9242
+ // Files in L1 should be trivially moved down during DB opening.
9243
+ // The file should be moved to L3, and then may be drained and compacted to
9244
+ // L4. So we just check L1 and L2 here.
9245
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
9246
+ ASSERT_EQ(0, NumTableFilesAtLevel(2));
9247
+ verify_db();
9248
+ }
9249
+
9250
+ TEST_F(DBCompactionTest, TurnOnLevelCompactionDynamicLevelBytesUCToLC) {
9251
+ // Basic test for migrating from UC to LC.
9252
+ // DB has non-empty L1 that should be pushed down to last level (L49).
9253
+ Options options = CurrentOptions();
9254
+ options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
9255
+ options.allow_ingest_behind = false;
9256
+ options.level_compaction_dynamic_level_bytes = false;
9257
+ options.num_levels = 50;
9258
+ CreateAndReopenWithCF({"pikachu"}, options);
9259
+
9260
+ Random rnd(33);
9261
+ for (int f = 0; f < 10; ++f) {
9262
+ ASSERT_OK(Put(1, Key(f), rnd.RandomString(1000)));
9263
+ ASSERT_OK(Flush(1));
9264
+ }
9265
+ CompactRangeOptions compact_options;
9266
+ compact_options.change_level = true;
9267
+ compact_options.target_level = 1;
9268
+ ASSERT_OK(db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
9269
+ ASSERT_EQ("0,1", FilesPerLevel(1));
9270
+
9271
+ options.compaction_style = CompactionStyle::kCompactionStyleLevel;
9272
+ options.level_compaction_dynamic_level_bytes = true;
9273
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
9274
+ std::string expected_lsm = "";
9275
+ for (int i = 0; i < 49; ++i) {
9276
+ expected_lsm += "0,";
9277
+ }
9278
+ expected_lsm += "1";
9279
+ ASSERT_EQ(expected_lsm, FilesPerLevel(1));
9280
+
9281
+ // Tests that entries for trial move in MANIFEST should be valid
9282
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
9283
+ ASSERT_EQ(expected_lsm, FilesPerLevel(1));
9284
+ }
9285
+
9286
+ TEST_F(DBCompactionTest, DrainUnnecessaryLevelsAfterMultiplierChanged) {
9287
+ // When the level size multiplier increases such that fewer levels become
9288
+ // necessary, unnecessary levels should to be drained.
9289
+ const int kBaseLevelBytes = 256 << 10; // 256KB
9290
+ const int kFileBytes = 64 << 10; // 64KB
9291
+ const int kInitMultiplier = 2, kChangedMultiplier = 10;
9292
+ const int kNumFiles = 32;
9293
+ const int kNumLevels = 5;
9294
+ const int kValueBytes = 1 << 10; // 1KB
9295
+
9296
+ Options options = CurrentOptions();
9297
+ options.compression = kNoCompression;
9298
+ options.level_compaction_dynamic_level_bytes = true;
9299
+ options.max_bytes_for_level_base = kBaseLevelBytes;
9300
+ options.max_bytes_for_level_multiplier = kInitMultiplier;
9301
+ options.num_levels = kNumLevels;
9302
+ Reopen(options);
9303
+
9304
+ // Initially we setup the LSM to look roughly as follows:
9305
+ //
9306
+ // L0: empty
9307
+ // L1: 256KB
9308
+ // ...
9309
+ // L4: 1MB
9310
+ Random rnd(301);
9311
+ for (int file = 0; file < kNumFiles; ++file) {
9312
+ for (int i = 0; i < kFileBytes / kValueBytes; ++i) {
9313
+ ASSERT_OK(Put(Key(file * kFileBytes / kValueBytes + i),
9314
+ rnd.RandomString(kValueBytes)));
9315
+ }
9316
+ ASSERT_OK(Flush());
9317
+ }
9318
+
9319
+ int init_num_nonempty = 0;
9320
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
9321
+ for (int level = 1; level < kNumLevels; ++level) {
9322
+ if (NumTableFilesAtLevel(level) > 0) {
9323
+ ++init_num_nonempty;
9324
+ }
9325
+ }
9326
+
9327
+ // After increasing the multiplier and running compaction fewer levels are
9328
+ // needed to hold all the data. Unnecessary levels should be drained.
9329
+ ASSERT_OK(db_->SetOptions({{"max_bytes_for_level_multiplier",
9330
+ std::to_string(kChangedMultiplier)}}));
9331
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
9332
+ int final_num_nonempty = 0;
9333
+ for (int level = 1; level < kNumLevels; ++level) {
9334
+ if (NumTableFilesAtLevel(level) > 0) {
9335
+ ++final_num_nonempty;
9336
+ }
9337
+ }
9338
+ ASSERT_GT(init_num_nonempty, final_num_nonempty);
9339
+ }
9340
+
9341
+ TEST_F(DBCompactionTest, DrainUnnecessaryLevelsAfterDBBecomesSmall) {
9342
+ // When the DB size is smaller, e.g., large chunk of data deleted by
9343
+ // DeleteRange(), unnecessary levels should to be drained.
9344
+ const int kBaseLevelBytes = 256 << 10; // 256KB
9345
+ const int kFileBytes = 64 << 10; // 64KB
9346
+ const int kMultiplier = 2;
9347
+ const int kNumFiles = 32;
9348
+ const int kNumLevels = 5;
9349
+ const int kValueBytes = 1 << 10; // 1KB
9350
+ const int kDeleteFileNum = 8;
9351
+
9352
+ Options options = CurrentOptions();
9353
+ options.compression = kNoCompression;
9354
+ options.level_compaction_dynamic_level_bytes = true;
9355
+ options.max_bytes_for_level_base = kBaseLevelBytes;
9356
+ options.max_bytes_for_level_multiplier = kMultiplier;
9357
+ options.num_levels = kNumLevels;
9358
+ Reopen(options);
9359
+
9360
+ // Initially we setup the LSM to look roughly as follows:
9361
+ //
9362
+ // L0: empty
9363
+ // L1: 256KB
9364
+ // ...
9365
+ // L4: 1MB
9366
+ Random rnd(301);
9367
+ for (int file = 0; file < kNumFiles; ++file) {
9368
+ for (int i = 0; i < kFileBytes / kValueBytes; ++i) {
9369
+ ASSERT_OK(Put(Key(file * kFileBytes / kValueBytes + i),
9370
+ rnd.RandomString(kValueBytes)));
9371
+ }
9372
+ ASSERT_OK(Flush());
9373
+ if (file == kDeleteFileNum) {
9374
+ // Ensure the DeleteRange() call below only delete data from last level
9375
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
9376
+ ASSERT_EQ(NumTableFilesAtLevel(kNumLevels - 1), kDeleteFileNum + 1);
9377
+ }
9378
+ }
9379
+
9380
+ int init_num_nonempty = 0;
9381
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
9382
+ for (int level = 1; level < kNumLevels; ++level) {
9383
+ if (NumTableFilesAtLevel(level) > 0) {
9384
+ ++init_num_nonempty;
9385
+ }
9386
+ }
9387
+
9388
+ // Disable auto compaction CompactRange() below
9389
+ ASSERT_OK(dbfull()->SetOptions({{"disable_auto_compactions", "true"}}));
9390
+ // Delete keys within first (kDeleteFileNum + 1) files' key ranges.
9391
+ // This should reduce DB size enough such that there is now
9392
+ // an unneeded level.
9393
+ std::string begin = Key(0);
9394
+ std::string end = Key(kDeleteFileNum * kFileBytes / kValueBytes);
9395
+ ASSERT_OK(
9396
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), begin, end));
9397
+ Slice begin_slice = begin;
9398
+ Slice end_slice = end;
9399
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &begin_slice, &end_slice));
9400
+ int after_delete_range_nonempty = 0;
9401
+ for (int level = 1; level < kNumLevels; ++level) {
9402
+ if (NumTableFilesAtLevel(level) > 0) {
9403
+ ++after_delete_range_nonempty;
9404
+ }
9405
+ }
9406
+ ASSERT_OK(dbfull()->SetOptions({{"disable_auto_compactions", "false"}}));
9407
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
9408
+ int final_num_nonempty = 0;
9409
+ for (int level = 1; level < kNumLevels; ++level) {
9410
+ if (NumTableFilesAtLevel(level) > 0) {
9411
+ ++final_num_nonempty;
9412
+ }
9413
+ }
9414
+ ASSERT_GE(init_num_nonempty, after_delete_range_nonempty);
9415
+ ASSERT_GT(after_delete_range_nonempty, final_num_nonempty);
9416
+ }
9111
9417
 
9112
9418
  } // namespace ROCKSDB_NAMESPACE
9113
9419
 
@@ -46,6 +46,11 @@ Status CompactedDBImpl::Get(const ReadOptions& options, ColumnFamilyHandle*,
46
46
  Status CompactedDBImpl::Get(const ReadOptions& options, ColumnFamilyHandle*,
47
47
  const Slice& key, PinnableSlice* value,
48
48
  std::string* timestamp) {
49
+ if (options.io_activity != Env::IOActivity::kUnknown) {
50
+ return Status::InvalidArgument(
51
+ "Cannot call Get with `ReadOptions::io_activity` != "
52
+ "`Env::IOActivity::kUnknown`");
53
+ }
49
54
  assert(user_comparator_);
50
55
  if (options.timestamp) {
51
56
  const Status s = FailIfTsMismatchCf(
@@ -128,6 +128,13 @@ class CompactedDBImpl : public DBImpl {
128
128
  return Status::NotSupported("Not supported in compacted db mode.");
129
129
  }
130
130
 
131
+ using DB::ClipColumnFamily;
132
+ virtual Status ClipColumnFamily(ColumnFamilyHandle* /*column_family*/,
133
+ const Slice& /*begin*/,
134
+ const Slice& /*end*/) override {
135
+ return Status::NotSupported("Not supported in compacted db mode.");
136
+ }
137
+
131
138
  // FIXME: some missing overrides for more "write" functions
132
139
  // Share with DBImplReadOnly?
133
140