@nxtedition/rocksdb 7.1.30 → 7.1.31

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 (380) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -2
  2. package/deps/rocksdb/rocksdb/cache/cache_test.cc +15 -23
  3. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -1
  4. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +4 -5
  5. package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -1
  6. package/deps/rocksdb/rocksdb/crash_test.mk +1 -1
  7. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +15 -0
  8. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +1 -1
  9. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -1
  10. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +78 -6
  11. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +32 -6
  12. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +8 -8
  13. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +47 -8
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +3 -3
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +105 -166
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +3 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +46 -15
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +47 -26
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +17 -10
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +11 -5
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +12 -6
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -2
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +337 -103
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -5
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -2
  27. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +524 -1
  28. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +164 -0
  29. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +6 -6
  30. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5 -7
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -1
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +4 -4
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +1 -0
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +2 -3
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +1 -1
  37. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  38. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -23
  39. package/deps/rocksdb/rocksdb/db/merge_helper.cc +30 -0
  40. package/deps/rocksdb/rocksdb/db/merge_helper.h +9 -0
  41. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +29 -9
  42. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +10 -7
  43. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +12 -8
  44. package/deps/rocksdb/rocksdb/db/version_set.cc +11 -6
  45. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +142 -0
  46. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +59 -53
  47. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -2
  48. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  49. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -3
  50. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +7 -4
  51. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +0 -2
  52. package/deps/rocksdb/rocksdb/env/env.cc +16 -19
  53. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -1
  54. package/deps/rocksdb/rocksdb/env/env_chroot.cc +20 -20
  55. package/deps/rocksdb/rocksdb/env/env_encryption.cc +62 -60
  56. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  57. package/deps/rocksdb/rocksdb/env/env_test.cc +179 -176
  58. package/deps/rocksdb/rocksdb/env/file_system.cc +3 -4
  59. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -2
  60. package/deps/rocksdb/rocksdb/env/io_posix.h +1 -2
  61. package/deps/rocksdb/rocksdb/env/mock_env.h +1 -0
  62. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +4 -4
  63. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +6 -5
  64. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +2 -5
  65. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +6 -7
  66. package/deps/rocksdb/rocksdb/file/file_util.cc +1 -1
  67. package/deps/rocksdb/rocksdb/file/filename.cc +16 -17
  68. package/deps/rocksdb/rocksdb/file/filename.h +4 -5
  69. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +492 -496
  70. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +1 -1
  71. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +1 -3
  72. package/deps/rocksdb/rocksdb/file/read_write_util.cc +1 -0
  73. package/deps/rocksdb/rocksdb/file/read_write_util.h +1 -0
  74. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +6 -8
  75. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +1 -2
  76. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -4
  77. package/deps/rocksdb/rocksdb/include/rocksdb/block_cache_trace_writer.h +4 -4
  78. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +166 -167
  79. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +1 -0
  80. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +0 -1
  81. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +12 -12
  82. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +2 -0
  83. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +1 -0
  84. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +1 -0
  85. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -1
  86. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +1 -0
  87. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +1 -0
  88. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +0 -4
  89. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -3
  90. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +1 -1
  91. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -0
  92. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
  93. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +1 -0
  94. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +1 -0
  95. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +1 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +4 -4
  97. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -0
  98. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -4
  99. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +1 -1
  100. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +2 -2
  101. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  102. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +3 -3
  103. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +3 -7
  104. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +20 -23
  105. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  106. package/deps/rocksdb/rocksdb/logging/event_logger.cc +1 -3
  107. package/deps/rocksdb/rocksdb/logging/event_logger.h +4 -5
  108. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +2 -1
  109. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +2 -3
  110. package/deps/rocksdb/rocksdb/logging/log_buffer.h +3 -2
  111. package/deps/rocksdb/rocksdb/logging/logging.h +3 -3
  112. package/deps/rocksdb/rocksdb/memory/allocator.h +1 -0
  113. package/deps/rocksdb/rocksdb/memory/arena_test.cc +1 -1
  114. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +2 -0
  115. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -0
  116. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +1 -0
  117. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +17 -20
  118. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +13 -15
  119. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +11 -10
  120. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +3 -3
  121. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +2 -2
  122. package/deps/rocksdb/rocksdb/memtable/skiplist.h +30 -28
  123. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +4 -6
  124. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +73 -70
  125. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +1 -1
  126. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +21 -23
  127. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +24 -38
  129. package/deps/rocksdb/rocksdb/monitoring/histogram.h +10 -17
  130. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +19 -19
  131. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +22 -30
  132. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +4 -6
  133. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +1 -0
  134. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +4 -12
  135. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -3
  136. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  137. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +12 -14
  138. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +2 -3
  139. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -1
  140. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -3
  141. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +1 -0
  142. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  143. package/deps/rocksdb/rocksdb/monitoring/statistics.h +7 -7
  144. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +12 -22
  145. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +7 -10
  146. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  147. package/deps/rocksdb/rocksdb/port/lang.h +3 -1
  148. package/deps/rocksdb/rocksdb/port/likely.h +2 -2
  149. package/deps/rocksdb/rocksdb/port/mmap.h +2 -2
  150. package/deps/rocksdb/rocksdb/port/port_dirent.h +2 -2
  151. package/deps/rocksdb/rocksdb/port/port_posix.cc +32 -27
  152. package/deps/rocksdb/rocksdb/port/port_posix.h +31 -30
  153. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -1
  154. package/deps/rocksdb/rocksdb/port/sys_time.h +1 -1
  155. package/deps/rocksdb/rocksdb/port/win/io_win.h +6 -7
  156. package/deps/rocksdb/rocksdb/port/win/port_win.h +12 -20
  157. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +5 -4
  158. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -5
  159. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -4
  160. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +30 -49
  161. package/deps/rocksdb/rocksdb/port/win/win_thread.h +5 -5
  162. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -62
  163. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +2 -2
  164. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +4 -3
  165. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -0
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +2 -1
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +0 -1
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -4
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +0 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +2 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -1
  174. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -30
  175. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +2 -1
  176. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  177. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +3 -3
  178. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -0
  179. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +4 -5
  180. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -3
  181. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +1 -2
  182. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +1 -0
  183. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +0 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +0 -1
  186. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -6
  187. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +0 -1
  188. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +1 -0
  189. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -6
  190. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -2
  191. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +90 -80
  192. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +5 -4
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +63 -69
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +2 -1
  195. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +58 -57
  196. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +3 -3
  197. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +35 -30
  198. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -10
  199. package/deps/rocksdb/rocksdb/table/iter_heap.h +2 -0
  200. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -1
  201. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -3
  202. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +31 -16
  203. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -6
  204. package/deps/rocksdb/rocksdb/table/multiget_context.h +5 -6
  205. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +1 -0
  206. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +1 -1
  207. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +7 -10
  208. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -1
  209. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +2 -2
  210. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +4 -3
  211. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +2 -2
  212. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -0
  213. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +10 -21
  214. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +14 -12
  215. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +2 -5
  216. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -3
  217. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +0 -6
  218. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +0 -33
  219. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -6
  220. package/deps/rocksdb/rocksdb/table/table_properties.cc +24 -37
  221. package/deps/rocksdb/rocksdb/table/table_reader.h +3 -2
  222. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +9 -8
  223. package/deps/rocksdb/rocksdb/table/table_test.cc +77 -82
  224. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +1 -0
  225. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +1 -1
  226. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +8 -18
  227. package/deps/rocksdb/rocksdb/test_util/sync_point.h +2 -2
  228. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +4 -3
  229. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +13 -18
  230. package/deps/rocksdb/rocksdb/test_util/testharness.cc +1 -2
  231. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -7
  232. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +3 -4
  233. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +1 -1
  234. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +1 -0
  235. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -7
  236. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +3 -2
  237. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +296 -314
  238. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +6 -6
  239. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +2 -1
  240. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +57 -64
  241. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +6 -5
  242. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +2 -2
  243. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
  244. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  245. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +1 -2
  246. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +10 -10
  247. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -1
  248. package/deps/rocksdb/rocksdb/tools/write_stress.cc +6 -3
  249. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +12 -31
  250. package/deps/rocksdb/rocksdb/util/autovector.h +3 -6
  251. package/deps/rocksdb/rocksdb/util/autovector_test.cc +12 -12
  252. package/deps/rocksdb/rocksdb/util/bloom_test.cc +8 -12
  253. package/deps/rocksdb/rocksdb/util/coding.cc +1 -0
  254. package/deps/rocksdb/rocksdb/util/coding.h +17 -15
  255. package/deps/rocksdb/rocksdb/util/coding_test.cc +14 -15
  256. package/deps/rocksdb/rocksdb/util/comparator.cc +4 -4
  257. package/deps/rocksdb/rocksdb/util/compression.h +6 -3
  258. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +2 -2
  259. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +5 -8
  260. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +1 -1
  261. package/deps/rocksdb/rocksdb/util/crc32c.cc +202 -297
  262. package/deps/rocksdb/rocksdb/util/crc32c.h +2 -3
  263. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +2 -0
  264. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +39 -54
  265. package/deps/rocksdb/rocksdb/util/defer.h +2 -1
  266. package/deps/rocksdb/rocksdb/util/defer_test.cc +2 -1
  267. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +2 -1
  268. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +1 -1
  269. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  270. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -1
  271. package/deps/rocksdb/rocksdb/util/filelock_test.cc +24 -29
  272. package/deps/rocksdb/rocksdb/util/filter_bench.cc +4 -4
  273. package/deps/rocksdb/rocksdb/util/hash_test.cc +2 -2
  274. package/deps/rocksdb/rocksdb/util/heap.h +5 -4
  275. package/deps/rocksdb/rocksdb/util/heap_test.cc +15 -25
  276. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  277. package/deps/rocksdb/rocksdb/util/murmurhash.cc +7 -2
  278. package/deps/rocksdb/rocksdb/util/murmurhash.h +4 -3
  279. package/deps/rocksdb/rocksdb/util/mutexlock.h +5 -11
  280. package/deps/rocksdb/rocksdb/util/random.cc +1 -0
  281. package/deps/rocksdb/rocksdb/util/random.h +2 -4
  282. package/deps/rocksdb/rocksdb/util/random_test.cc +2 -1
  283. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +4 -3
  284. package/deps/rocksdb/rocksdb/util/slice.cc +1 -1
  285. package/deps/rocksdb/rocksdb/util/slice_test.cc +1 -2
  286. package/deps/rocksdb/rocksdb/util/status.cc +2 -0
  287. package/deps/rocksdb/rocksdb/util/string_util.cc +2 -0
  288. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +64 -76
  289. package/deps/rocksdb/rocksdb/util/thread_local.cc +18 -32
  290. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -3
  291. package/deps/rocksdb/rocksdb/util/thread_operation.h +34 -43
  292. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +54 -73
  293. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +18 -18
  294. package/deps/rocksdb/rocksdb/util/timer.h +4 -9
  295. package/deps/rocksdb/rocksdb/util/timer_queue.h +1 -0
  296. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +1 -0
  297. package/deps/rocksdb/rocksdb/util/xxhash.cc +1 -2
  298. package/deps/rocksdb/rocksdb/util/xxhash.h +7 -4
  299. package/deps/rocksdb/rocksdb/util/xxph3.h +3 -1
  300. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +16 -24
  301. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +1 -1
  302. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +106 -104
  303. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +3 -4
  304. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +6 -6
  305. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +1 -2
  306. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +3 -4
  307. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -1
  308. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +11 -15
  309. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -2
  310. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +3 -3
  311. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +12 -12
  312. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +56 -55
  313. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +91 -74
  314. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +17 -34
  315. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +21 -45
  316. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +74 -97
  317. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +17 -18
  318. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +3 -4
  319. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +19 -19
  320. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +19 -18
  321. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +7 -10
  322. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +3 -4
  323. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +2 -2
  324. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +10 -15
  325. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +2 -1
  326. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +1 -0
  327. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +5 -3
  328. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -2
  329. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +4 -5
  330. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -7
  331. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -13
  332. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +1 -0
  333. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +7 -9
  334. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +4 -5
  335. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +4 -3
  336. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +1 -1
  337. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +3 -3
  338. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +2 -4
  339. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +2 -2
  340. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +39 -50
  341. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +2 -2
  342. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +4 -3
  343. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +2 -2
  344. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +5 -7
  345. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +5 -4
  346. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  347. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +3 -6
  348. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +1 -1
  349. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +2 -2
  350. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -1
  351. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +1 -0
  352. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +3 -1
  353. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +1 -1
  354. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +18 -13
  355. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +1 -3
  356. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +15 -14
  357. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +14 -12
  358. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -2
  359. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +4 -7
  360. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1 -2
  361. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  362. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +1 -1
  363. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -1
  364. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +3 -2
  365. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +1 -2
  366. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +3 -2
  367. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +5 -5
  368. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -4
  369. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -2
  370. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +5 -4
  371. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -1
  372. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +1 -0
  373. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +3 -4
  374. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +2 -6
  375. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +80 -79
  376. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -3
  377. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +9 -17
  378. package/package.json +1 -1
  379. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  380. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -186,6 +186,13 @@ class RoundRobinSubcompactionsAgainstResources
186
186
  int max_compaction_limits_;
187
187
  };
188
188
 
189
+ class DBCompactionTestFIFOCheckConsistencyWithParam
190
+ : public DBCompactionTest,
191
+ public testing::WithParamInterface<std::string> {
192
+ public:
193
+ DBCompactionTestFIFOCheckConsistencyWithParam() : DBCompactionTest() {}
194
+ };
195
+
189
196
  namespace {
190
197
  class FlushedFileCollector : public EventListener {
191
198
  public:
@@ -6457,6 +6464,163 @@ TEST_P(DBCompactionTestWithParam,
6457
6464
  }
6458
6465
  }
6459
6466
 
6467
+ INSTANTIATE_TEST_CASE_P(DBCompactionTestFIFOCheckConsistencyWithParam,
6468
+ DBCompactionTestFIFOCheckConsistencyWithParam,
6469
+ ::testing::Values("FindIntraL0Compaction",
6470
+ "PickCompactionToWarm",
6471
+ "CompactRange", "CompactFile"));
6472
+
6473
+ TEST_P(DBCompactionTestFIFOCheckConsistencyWithParam,
6474
+ FlushAfterIntraL0CompactionWithIngestedFile) {
6475
+ Options options = CurrentOptions();
6476
+ options.create_if_missing = true;
6477
+ options.compression = kNoCompression;
6478
+
6479
+ options.force_consistency_checks = true;
6480
+ options.compaction_style = kCompactionStyleFIFO;
6481
+ options.max_open_files = -1;
6482
+ options.num_levels = 1;
6483
+ options.level0_file_num_compaction_trigger = 3;
6484
+
6485
+ CompactionOptionsFIFO fifo_options;
6486
+ const std::string compaction_path_to_test = GetParam();
6487
+ if (compaction_path_to_test == "FindIntraL0Compaction") {
6488
+ fifo_options.allow_compaction = true;
6489
+ fifo_options.age_for_warm = 0;
6490
+ } else if (compaction_path_to_test == "PickCompactionToWarm") {
6491
+ fifo_options.allow_compaction = false;
6492
+ fifo_options.age_for_warm = 2;
6493
+ } else if (compaction_path_to_test == "CompactRange") {
6494
+ // FIFOCompactionPicker::CompactRange() implementes
6495
+ // on top of regular compaction paths. Here we choose
6496
+ // to trigger FIFOCompactionPicker::PickCompactionToWarm()
6497
+ // for simplicity
6498
+ fifo_options.allow_compaction = false;
6499
+ fifo_options.age_for_warm = 2;
6500
+ options.disable_auto_compactions = true;
6501
+ } else if (compaction_path_to_test == "CompactFile") {
6502
+ fifo_options.allow_compaction = false;
6503
+ fifo_options.age_for_warm = 0;
6504
+ options.disable_auto_compactions = true;
6505
+ } else {
6506
+ assert(false);
6507
+ }
6508
+ options.compaction_options_fifo = fifo_options;
6509
+
6510
+ DestroyAndReopen(options);
6511
+
6512
+ // To force assigning the global seqno to ingested file
6513
+ // for our test purpose
6514
+ const Snapshot* snapshot = db_->GetSnapshot();
6515
+
6516
+ std::atomic<bool> compaction_path_sync_point_called(false);
6517
+ if (compaction_path_to_test == "FindIntraL0Compaction") {
6518
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6519
+ "FindIntraL0Compaction",
6520
+ [&](void* /*arg*/) { compaction_path_sync_point_called.store(true); });
6521
+ } else if (compaction_path_to_test == "PickCompactionToWarm" ||
6522
+ compaction_path_to_test == "CompactRange") {
6523
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6524
+ "PickCompactionToWarm",
6525
+ [&](void* /*arg*/) { compaction_path_sync_point_called.store(true); });
6526
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6527
+ "PickCompactionToWarm::BeforeGetCurrentTime",
6528
+ [&fifo_options](void* current_time_arg) -> void {
6529
+ // The unit test goes so quickly that there is almost no time
6530
+ // elapsed after we ingest a file and before we check whether ingested
6531
+ // files can compact to warm.
6532
+ // Therefore we need this trick to simulate elapsed
6533
+ // time in reality.
6534
+ int64_t* current_time = (int64_t*)current_time_arg;
6535
+ *current_time = *current_time + fifo_options.age_for_warm + 1;
6536
+ });
6537
+ } else if (compaction_path_to_test == "CompactFile") {
6538
+ // Sync point is not needed in this case
6539
+ compaction_path_sync_point_called.store(true);
6540
+ }
6541
+
6542
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6543
+
6544
+ // Create an existing SST file s0 of key range [key1,key4] and seqno range
6545
+ // [1,2]
6546
+ ASSERT_OK(Put("key1", "seq1"));
6547
+ ASSERT_OK(Put("key4", "seq2"));
6548
+ ASSERT_OK(Flush());
6549
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
6550
+
6551
+ // Accumulate entries in a memtable m1 of key range [key1,key2] and seqno
6552
+ // range [3,4] Noted that it contains a overlaped key with s0
6553
+ ASSERT_OK(Put("key1", "seq3")); // overlapped key
6554
+ ASSERT_OK(Put("key2", "seq4"));
6555
+
6556
+ ASSERT_TRUE(compaction_path_to_test == "CompactFile" ||
6557
+ !compaction_path_sync_point_called.load());
6558
+
6559
+ // Stop background compaction job to obtain accurate
6560
+ // `NumTableFilesAtLevel(0)` after file ingestion
6561
+ test::SleepingBackgroundTask sleeping_tasks;
6562
+ if (!options.disable_auto_compactions) {
6563
+ env_->SetBackgroundThreads(1, Env::LOW);
6564
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_tasks,
6565
+ Env::Priority::LOW);
6566
+ sleeping_tasks.WaitUntilSleeping();
6567
+ }
6568
+
6569
+ // Ingested two SST files, s1 of key range [key5,key5] and seqno range [5,5]
6570
+ // and s2 of key range [key6,key6] and seqno range [6,6]
6571
+ IngestOneKeyValue(dbfull(), "key5", "seq5", options);
6572
+ IngestOneKeyValue(dbfull(), "key6", "seq6", options);
6573
+ // Up to now, L0 contains s0, s1, s2
6574
+ ASSERT_EQ(3, NumTableFilesAtLevel(0));
6575
+
6576
+ // Resume background compaction job so that Intra level0 compaction can be
6577
+ // triggered
6578
+ if (!options.disable_auto_compactions) {
6579
+ sleeping_tasks.WakeUp();
6580
+ sleeping_tasks.WaitUntilDone();
6581
+ }
6582
+
6583
+ if (compaction_path_to_test == "CompactRange") {
6584
+ // `start` and `end` is carefully chosen so that compact range:
6585
+ // (1) doesn't overlap with memtable therefore the memtable won't be flushed
6586
+ // (2) should target at compacting s0 with s1 and s2
6587
+ Slice start("key4"), end("key6");
6588
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &start, &end));
6589
+ } else if (compaction_path_to_test == "CompactFile") {
6590
+ ColumnFamilyMetaData cf_meta_data;
6591
+ db_->GetColumnFamilyMetaData(&cf_meta_data);
6592
+ assert(cf_meta_data.levels[0].files.size() == 3);
6593
+ std::vector<std::string> input_files;
6594
+ for (const auto& file : cf_meta_data.levels[0].files) {
6595
+ input_files.push_back(file.name);
6596
+ }
6597
+ Status s = db_->CompactFiles(CompactionOptions(), input_files, 0);
6598
+ EXPECT_TRUE(s.IsAborted());
6599
+ EXPECT_TRUE(s.ToString().find(
6600
+ "has overlapping seqnos with earliest memtable seqnos") !=
6601
+ std::string::npos);
6602
+ } else {
6603
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
6604
+ }
6605
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
6606
+
6607
+ ASSERT_TRUE(compaction_path_to_test == "CompactFile" ||
6608
+ compaction_path_sync_point_called.load());
6609
+
6610
+ // To verify compaction of s0, s1 and s2 (leading to new SST s4) didn't
6611
+ // happen.
6612
+ //
6613
+ // Otherwise, when m1 flushes in the next step and become s3,
6614
+ // we will have s3 of seqnos [3, 4], s4 of seqnos [1, 6], which is a
6615
+ // corruption because s3 is older than s4 based on largest seqno while s2
6616
+ // contains a value of Key(1) newer than the value of Key(1) contained in s4.
6617
+ // And in this case, Flush() will return Status::Corruption() caught by
6618
+ // `force_consistency_checks=1`
6619
+ EXPECT_EQ(3, NumTableFilesAtLevel(0));
6620
+ EXPECT_OK(Flush());
6621
+ db_->ReleaseSnapshot(snapshot);
6622
+ }
6623
+
6460
6624
  TEST_P(DBCompactionTestWithBottommostParam, SequenceKeysManualCompaction) {
6461
6625
  constexpr int kSstNum = 10;
6462
6626
  Options options = CurrentOptions();
@@ -26,16 +26,16 @@ CompactedDBImpl::CompactedDBImpl(const DBOptions& options,
26
26
  version_(nullptr),
27
27
  user_comparator_(nullptr) {}
28
28
 
29
- CompactedDBImpl::~CompactedDBImpl() {
30
- }
29
+ CompactedDBImpl::~CompactedDBImpl() {}
31
30
 
32
31
  size_t CompactedDBImpl::FindFile(const Slice& key) {
33
32
  size_t right = files_.num_files - 1;
34
33
  auto cmp = [&](const FdWithKeyRange& f, const Slice& k) -> bool {
35
34
  return user_comparator_->Compare(ExtractUserKey(f.largest_key), k) < 0;
36
35
  };
37
- return static_cast<size_t>(std::lower_bound(files_.files,
38
- files_.files + right, key, cmp) - files_.files);
36
+ return static_cast<size_t>(
37
+ std::lower_bound(files_.files, files_.files + right, key, cmp) -
38
+ files_.files);
39
39
  }
40
40
 
41
41
  Status CompactedDBImpl::Get(const ReadOptions& options, ColumnFamilyHandle*,
@@ -228,8 +228,8 @@ Status CompactedDBImpl::Init(const Options& options) {
228
228
  return Status::NotSupported("no file exists");
229
229
  }
230
230
 
231
- Status CompactedDBImpl::Open(const Options& options,
232
- const std::string& dbname, DB** dbptr) {
231
+ Status CompactedDBImpl::Open(const Options& options, const std::string& dbname,
232
+ DB** dbptr) {
233
233
  *dbptr = nullptr;
234
234
 
235
235
  if (options.max_open_files != -1) {
@@ -7,6 +7,7 @@
7
7
  #ifndef ROCKSDB_LITE
8
8
  #include <string>
9
9
  #include <vector>
10
+
10
11
  #include "db/db_impl/db_impl.h"
11
12
 
12
13
  namespace ROCKSDB_NAMESPACE {
@@ -1357,7 +1357,7 @@ Status DBImpl::SetDBOptions(
1357
1357
  file_options_for_compaction_ = fs_->OptimizeForCompactionTableWrite(
1358
1358
  file_options_for_compaction_, immutable_db_options_);
1359
1359
  versions_->ChangeFileOptions(mutable_db_options_);
1360
- //TODO(xiez): clarify why apply optimize for read to write options
1360
+ // TODO(xiez): clarify why apply optimize for read to write options
1361
1361
  file_options_for_compaction_ = fs_->OptimizeForCompactionTableRead(
1362
1362
  file_options_for_compaction_, immutable_db_options_);
1363
1363
  file_options_for_compaction_.compaction_readahead_size =
@@ -2357,8 +2357,8 @@ std::vector<Status> DBImpl::MultiGet(
2357
2357
  std::string* timestamp = timestamps ? &(*timestamps)[keys_read] : nullptr;
2358
2358
 
2359
2359
  LookupKey lkey(keys[keys_read], consistent_seqnum, read_options.timestamp);
2360
- auto cfh =
2361
- static_cast_with_check<ColumnFamilyHandleImpl>(column_family[keys_read]);
2360
+ auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(
2361
+ column_family[keys_read]);
2362
2362
  SequenceNumber max_covering_tombstone_seq = 0;
2363
2363
  auto mgd_iter = multiget_cf_data.find(cfh->cfd()->GetID());
2364
2364
  assert(mgd_iter != multiget_cf_data.end());
@@ -3983,8 +3983,7 @@ SuperVersion* DBImpl::GetAndRefSuperVersion(uint32_t column_family_id) {
3983
3983
  void DBImpl::CleanupSuperVersion(SuperVersion* sv) {
3984
3984
  // Release SuperVersion
3985
3985
  if (sv->Unref()) {
3986
- bool defer_purge =
3987
- immutable_db_options().avoid_unnecessary_blocking_io;
3986
+ bool defer_purge = immutable_db_options().avoid_unnecessary_blocking_io;
3988
3987
  {
3989
3988
  InstrumentedMutexLock l(&mutex_);
3990
3989
  sv->Cleanup();
@@ -5668,8 +5667,7 @@ Status DBImpl::VerifyChecksumInternal(const ReadOptions& read_options,
5668
5667
  }
5669
5668
  }
5670
5669
 
5671
- bool defer_purge =
5672
- immutable_db_options().avoid_unnecessary_blocking_io;
5670
+ bool defer_purge = immutable_db_options().avoid_unnecessary_blocking_io;
5673
5671
  {
5674
5672
  InstrumentedMutexLock l(&mutex_);
5675
5673
  for (auto sv : sv_list) {
@@ -1344,8 +1344,18 @@ Status DBImpl::CompactFilesImpl(
1344
1344
  }
1345
1345
  }
1346
1346
 
1347
+ SequenceNumber earliest_mem_seqno = kMaxSequenceNumber;
1348
+ if (cfd->mem() != nullptr) {
1349
+ earliest_mem_seqno =
1350
+ std::min(cfd->mem()->GetEarliestSequenceNumber(), earliest_mem_seqno);
1351
+ }
1352
+ if (cfd->imm() != nullptr && cfd->imm()->current() != nullptr) {
1353
+ earliest_mem_seqno =
1354
+ std::min(cfd->imm()->current()->GetEarliestSequenceNumber(false),
1355
+ earliest_mem_seqno);
1356
+ }
1347
1357
  Status s = cfd->compaction_picker()->SanitizeCompactionInputFiles(
1348
- &input_set, cf_meta, output_level);
1358
+ &input_set, cf_meta, output_level, earliest_mem_seqno);
1349
1359
  if (!s.ok()) {
1350
1360
  return s;
1351
1361
  }
@@ -270,7 +270,8 @@ Status DBImpl::ValidateOptions(const DBOptions& db_options) {
270
270
  if (db_options.unordered_write &&
271
271
  !db_options.allow_concurrent_memtable_write) {
272
272
  return Status::InvalidArgument(
273
- "unordered_write is incompatible with !allow_concurrent_memtable_write");
273
+ "unordered_write is incompatible with "
274
+ "!allow_concurrent_memtable_write");
274
275
  }
275
276
 
276
277
  if (db_options.unordered_write && db_options.enable_pipelined_write) {
@@ -1058,9 +1059,8 @@ Status DBImpl::RecoverLogFiles(const std::vector<uint64_t>& wal_numbers,
1058
1059
  std::unique_ptr<SequentialFileReader> file_reader;
1059
1060
  {
1060
1061
  std::unique_ptr<FSSequentialFile> file;
1061
- status = fs_->NewSequentialFile(fname,
1062
- fs_->OptimizeForLogRead(file_options_),
1063
- &file, nullptr);
1062
+ status = fs_->NewSequentialFile(
1063
+ fname, fs_->OptimizeForLogRead(file_options_), &file, nullptr);
1064
1064
  if (!status.ok()) {
1065
1065
  MaybeIgnoreError(&status);
1066
1066
  if (!status.ok()) {
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include <string>
11
11
  #include <vector>
12
+
12
13
  #include "db/db_impl/db_impl.h"
13
14
 
14
15
  namespace ROCKSDB_NAMESPACE {
@@ -157,8 +157,7 @@ Status DBImplSecondary::MaybeInitLogReader(
157
157
  {
158
158
  std::unique_ptr<FSSequentialFile> file;
159
159
  Status status = fs_->NewSequentialFile(
160
- fname, fs_->OptimizeForLogRead(file_options_), &file,
161
- nullptr);
160
+ fname, fs_->OptimizeForLogRead(file_options_), &file, nullptr);
162
161
  if (!status.ok()) {
163
162
  *log_reader = nullptr;
164
163
  return status;
@@ -200,7 +199,7 @@ Status DBImplSecondary::RecoverLogFiles(
200
199
  assert(reader != nullptr);
201
200
  }
202
201
  for (auto log_number : log_numbers) {
203
- auto it = log_readers_.find(log_number);
202
+ auto it = log_readers_.find(log_number);
204
203
  assert(it != log_readers_.end());
205
204
  log::FragmentBufferedReader* reader = it->second->reader_;
206
205
  Status* wal_read_status = it->second->status_;
@@ -47,6 +47,7 @@ class LogReaderContainer {
47
47
  delete reporter_;
48
48
  delete status_;
49
49
  }
50
+
50
51
  private:
51
52
  struct LogReporter : public log::Reader::Reporter {
52
53
  Env* env;
@@ -247,7 +248,6 @@ class DBImplSecondary : public DBImpl {
247
248
  // method can take long time due to all the I/O and CPU costs.
248
249
  Status TryCatchUpWithPrimary() override;
249
250
 
250
-
251
251
  // Try to find log reader using log_number from log_readers_ map, initialize
252
252
  // if it doesn't exist
253
253
  Status MaybeInitLogReader(uint64_t log_number,
@@ -6923,7 +6923,7 @@ TEST_F(DBTest2, LastLevelTemperatureUniversal) {
6923
6923
  ASSERT_EQ(size, 0);
6924
6924
  ASSERT_EQ(iostats->file_io_stats_by_temperature.hot_file_read_count, 0);
6925
6925
  ASSERT_EQ(iostats->file_io_stats_by_temperature.warm_file_read_count, 0);
6926
- ASSERT_EQ(iostats->file_io_stats_by_temperature.hot_file_read_count, 0);
6926
+ ASSERT_EQ(iostats->file_io_stats_by_temperature.cold_file_read_count, 0);
6927
6927
  ASSERT_EQ(options.statistics->getTickerCount(HOT_FILE_READ_BYTES), 0);
6928
6928
  ASSERT_EQ(options.statistics->getTickerCount(WARM_FILE_READ_BYTES), 0);
6929
6929
  ASSERT_EQ(options.statistics->getTickerCount(COLD_FILE_READ_BYTES), 0);
@@ -587,10 +587,9 @@ FragmentedRangeTombstoneIterator* MemTable::NewRangeTombstoneIteratorInternal(
587
587
  auto* unfragmented_iter =
588
588
  new MemTableIterator(*this, read_options, nullptr /* arena */,
589
589
  true /* use_range_del_table */);
590
- cache->tombstones = std::make_unique<FragmentedRangeTombstoneList>(
591
- FragmentedRangeTombstoneList(
592
- std::unique_ptr<InternalIterator>(unfragmented_iter),
593
- comparator_.comparator));
590
+ cache->tombstones.reset(new FragmentedRangeTombstoneList(
591
+ std::unique_ptr<InternalIterator>(unfragmented_iter),
592
+ comparator_.comparator));
594
593
  cache->initialized.store(true, std::memory_order_release);
595
594
  }
596
595
  cache->reader_mutex.unlock();
@@ -785,7 +784,8 @@ Status MemTable::Add(SequenceNumber s, ValueType type,
785
784
  std::memory_order_relaxed);
786
785
  data_size_.store(data_size_.load(std::memory_order_relaxed) + encoded_len,
787
786
  std::memory_order_relaxed);
788
- if (type == kTypeDeletion) {
787
+ if (type == kTypeDeletion || type == kTypeSingleDeletion ||
788
+ type == kTypeDeletionWithTimestamp) {
789
789
  num_deletes_.store(num_deletes_.load(std::memory_order_relaxed) + 1,
790
790
  std::memory_order_relaxed);
791
791
  }
@@ -1065,20 +1065,10 @@ static bool SaveValue(void* arg, const char* entry) {
1065
1065
  assert(s->do_merge);
1066
1066
 
1067
1067
  if (s->value || s->columns) {
1068
- std::string result;
1069
1068
  *(s->status) = MergeHelper::TimedFullMerge(
1070
1069
  merge_operator, s->key->user_key(), &v,
1071
- merge_context->GetOperands(), &result, s->logger, s->statistics,
1072
- s->clock, nullptr /* result_operand */, true);
1073
-
1074
- if (s->status->ok()) {
1075
- if (s->value) {
1076
- *(s->value) = std::move(result);
1077
- } else {
1078
- assert(s->columns);
1079
- s->columns->SetPlainValue(result);
1080
- }
1081
- }
1070
+ merge_context->GetOperands(), s->value, s->columns, s->logger,
1071
+ s->statistics, s->clock, nullptr /* result_operand */, true);
1082
1072
  }
1083
1073
  } else if (s->value) {
1084
1074
  s->value->assign(v.data(), v.size());
@@ -1149,10 +1139,10 @@ static bool SaveValue(void* arg, const char* entry) {
1149
1139
  case kTypeSingleDeletion:
1150
1140
  case kTypeRangeDeletion: {
1151
1141
  if (*(s->merge_in_progress)) {
1152
- if (s->value != nullptr) {
1142
+ if (s->value || s->columns) {
1153
1143
  *(s->status) = MergeHelper::TimedFullMerge(
1154
1144
  merge_operator, s->key->user_key(), nullptr,
1155
- merge_context->GetOperands(), s->value, s->logger,
1145
+ merge_context->GetOperands(), s->value, s->columns, s->logger,
1156
1146
  s->statistics, s->clock, nullptr /* result_operand */, true);
1157
1147
  }
1158
1148
  } else {
@@ -1178,10 +1168,13 @@ static bool SaveValue(void* arg, const char* entry) {
1178
1168
  v, s->inplace_update_support == false /* operand_pinned */);
1179
1169
  if (s->do_merge && merge_operator->ShouldMerge(
1180
1170
  merge_context->GetOperandsDirectionBackward())) {
1181
- *(s->status) = MergeHelper::TimedFullMerge(
1182
- merge_operator, s->key->user_key(), nullptr,
1183
- merge_context->GetOperands(), s->value, s->logger, s->statistics,
1184
- s->clock, nullptr /* result_operand */, true);
1171
+ if (s->value || s->columns) {
1172
+ *(s->status) = MergeHelper::TimedFullMerge(
1173
+ merge_operator, s->key->user_key(), nullptr,
1174
+ merge_context->GetOperands(), s->value, s->columns, s->logger,
1175
+ s->statistics, s->clock, nullptr /* result_operand */, true);
1176
+ }
1177
+
1185
1178
  *(s->found_final_value) = true;
1186
1179
  return false;
1187
1180
  }
@@ -110,6 +110,36 @@ Status MergeHelper::TimedFullMerge(const MergeOperator* merge_operator,
110
110
  return Status::OK();
111
111
  }
112
112
 
113
+ Status MergeHelper::TimedFullMerge(const MergeOperator* merge_operator,
114
+ const Slice& key, const Slice* base_value,
115
+ const std::vector<Slice>& operands,
116
+ std::string* value,
117
+ PinnableWideColumns* columns, Logger* logger,
118
+ Statistics* statistics, SystemClock* clock,
119
+ Slice* result_operand,
120
+ bool update_num_ops_stats) {
121
+ assert(value || columns);
122
+ assert(!value || !columns);
123
+
124
+ std::string result;
125
+ const Status s =
126
+ TimedFullMerge(merge_operator, key, base_value, operands, &result, logger,
127
+ statistics, clock, result_operand, update_num_ops_stats);
128
+ if (!s.ok()) {
129
+ return s;
130
+ }
131
+
132
+ if (value) {
133
+ *value = std::move(result);
134
+ return Status::OK();
135
+ }
136
+
137
+ assert(columns);
138
+ columns->SetPlainValue(result);
139
+
140
+ return Status::OK();
141
+ }
142
+
113
143
  // PRE: iter points to the first merge type entry
114
144
  // POST: iter points to the first entry beyond the merge process (or the end)
115
145
  // keys_, operands_ are updated to reflect the merge result.
@@ -56,6 +56,15 @@ class MergeHelper {
56
56
  Slice* result_operand = nullptr,
57
57
  bool update_num_ops_stats = false);
58
58
 
59
+ static Status TimedFullMerge(const MergeOperator* merge_operator,
60
+ const Slice& key, const Slice* base_value,
61
+ const std::vector<Slice>& operands,
62
+ std::string* value, PinnableWideColumns* columns,
63
+ Logger* logger, Statistics* statistics,
64
+ SystemClock* clock,
65
+ Slice* result_operand = nullptr,
66
+ bool update_num_ops_stats = false);
67
+
59
68
  // Merge entries until we hit
60
69
  // - a corrupted key
61
70
  // - a Put/Delete,
@@ -54,12 +54,17 @@ DEFINE_int32(should_deletes_per_run, 1, "number of ShouldDelete calls per run");
54
54
  DEFINE_int32(add_tombstones_per_run, 1,
55
55
  "number of AddTombstones calls per run");
56
56
 
57
+ DEFINE_bool(use_compaction_range_del_aggregator, false,
58
+ "Whether to use CompactionRangeDelAggregator. Default is to use "
59
+ "ReadRangeDelAggregator.");
60
+
57
61
  namespace {
58
62
 
59
63
  struct Stats {
60
64
  uint64_t time_add_tombstones = 0;
61
65
  uint64_t time_first_should_delete = 0;
62
66
  uint64_t time_rest_should_delete = 0;
67
+ uint64_t time_fragment_tombstones = 0;
63
68
  };
64
69
 
65
70
  std::ostream& operator<<(std::ostream& os, const Stats& s) {
@@ -67,6 +72,10 @@ std::ostream& operator<<(std::ostream& os, const Stats& s) {
67
72
  fmt_holder.copyfmt(os);
68
73
 
69
74
  os << std::left;
75
+ os << std::setw(25) << "Fragment Tombstones: "
76
+ << s.time_fragment_tombstones /
77
+ (FLAGS_add_tombstones_per_run * FLAGS_num_runs * 1.0e3)
78
+ << " us\n";
70
79
  os << std::setw(25) << "AddTombstones: "
71
80
  << s.time_add_tombstones /
72
81
  (FLAGS_add_tombstones_per_run * FLAGS_num_runs * 1.0e3)
@@ -186,10 +195,17 @@ int main(int argc, char** argv) {
186
195
  FLAGS_num_range_tombstones);
187
196
  }
188
197
  auto mode = ROCKSDB_NAMESPACE::RangeDelPositioningMode::kForwardTraversal;
189
-
198
+ std::vector<ROCKSDB_NAMESPACE::SequenceNumber> snapshots{0};
190
199
  for (int i = 0; i < FLAGS_num_runs; i++) {
191
- ROCKSDB_NAMESPACE::ReadRangeDelAggregator range_del_agg(
192
- &icmp, ROCKSDB_NAMESPACE::kMaxSequenceNumber /* upper_bound */);
200
+ std::unique_ptr<ROCKSDB_NAMESPACE::RangeDelAggregator> range_del_agg =
201
+ nullptr;
202
+ if (FLAGS_use_compaction_range_del_aggregator) {
203
+ range_del_agg.reset(new ROCKSDB_NAMESPACE::CompactionRangeDelAggregator(
204
+ &icmp, snapshots));
205
+ } else {
206
+ range_del_agg.reset(new ROCKSDB_NAMESPACE::ReadRangeDelAggregator(
207
+ &icmp, ROCKSDB_NAMESPACE::kMaxSequenceNumber /* upper_bound */));
208
+ }
193
209
 
194
210
  std::vector<
195
211
  std::unique_ptr<ROCKSDB_NAMESPACE::FragmentedRangeTombstoneList> >
@@ -207,12 +223,16 @@ int main(int argc, char** argv) {
207
223
  ROCKSDB_NAMESPACE::PersistentRangeTombstone(
208
224
  ROCKSDB_NAMESPACE::Key(start), ROCKSDB_NAMESPACE::Key(end), j);
209
225
  }
210
-
226
+ auto iter =
227
+ ROCKSDB_NAMESPACE::MakeRangeDelIterator(persistent_range_tombstones);
228
+ ROCKSDB_NAMESPACE::StopWatchNano stop_watch_fragment_tombstones(
229
+ clock, true /* auto_start */);
211
230
  fragmented_range_tombstone_lists.emplace_back(
212
231
  new ROCKSDB_NAMESPACE::FragmentedRangeTombstoneList(
213
- ROCKSDB_NAMESPACE::MakeRangeDelIterator(
214
- persistent_range_tombstones),
215
- icmp));
232
+ std::move(iter), icmp, FLAGS_use_compaction_range_del_aggregator,
233
+ snapshots));
234
+ stats.time_fragment_tombstones +=
235
+ stop_watch_fragment_tombstones.ElapsedNanos();
216
236
  std::unique_ptr<ROCKSDB_NAMESPACE::FragmentedRangeTombstoneIterator>
217
237
  fragmented_range_del_iter(
218
238
  new ROCKSDB_NAMESPACE::FragmentedRangeTombstoneIterator(
@@ -221,7 +241,7 @@ int main(int argc, char** argv) {
221
241
 
222
242
  ROCKSDB_NAMESPACE::StopWatchNano stop_watch_add_tombstones(
223
243
  clock, true /* auto_start */);
224
- range_del_agg.AddTombstones(std::move(fragmented_range_del_iter));
244
+ range_del_agg->AddTombstones(std::move(fragmented_range_del_iter));
225
245
  stats.time_add_tombstones += stop_watch_add_tombstones.ElapsedNanos();
226
246
  }
227
247
 
@@ -238,7 +258,7 @@ int main(int argc, char** argv) {
238
258
 
239
259
  ROCKSDB_NAMESPACE::StopWatchNano stop_watch_should_delete(
240
260
  clock, true /* auto_start */);
241
- range_del_agg.ShouldDelete(parsed_key, mode);
261
+ range_del_agg->ShouldDelete(parsed_key, mode);
242
262
  uint64_t call_time = stop_watch_should_delete.ElapsedNanos();
243
263
 
244
264
  if (j == 0) {
@@ -156,7 +156,6 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
156
156
  if (seq <= next_snapshot) {
157
157
  // This seqnum is visible by a lower snapshot.
158
158
  tombstone_seqs_.push_back(seq);
159
- seq_set_.insert(seq);
160
159
  auto upper_bound_it =
161
160
  std::lower_bound(snapshots.begin(), snapshots.end(), seq);
162
161
  if (upper_bound_it == snapshots.begin()) {
@@ -173,7 +172,6 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
173
172
  // The fragmentation is being done for reads, so preserve all seqnums.
174
173
  tombstone_seqs_.insert(tombstone_seqs_.end(), seqnums_to_flush.begin(),
175
174
  seqnums_to_flush.end());
176
- seq_set_.insert(seqnums_to_flush.begin(), seqnums_to_flush.end());
177
175
  if (ts_sz) {
178
176
  tombstone_timestamps_.insert(tombstone_timestamps_.end(),
179
177
  timestamps_to_flush.begin(),
@@ -258,15 +256,20 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
258
256
  }
259
257
 
260
258
  bool FragmentedRangeTombstoneList::ContainsRange(SequenceNumber lower,
261
- SequenceNumber upper) const {
259
+ SequenceNumber upper) {
260
+ std::call_once(seq_set_init_once_flag_, [this]() {
261
+ for (auto s : tombstone_seqs_) {
262
+ seq_set_.insert(s);
263
+ }
264
+ });
262
265
  auto seq_it = seq_set_.lower_bound(lower);
263
266
  return seq_it != seq_set_.end() && *seq_it <= upper;
264
267
  }
265
268
 
266
269
  FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
267
- const FragmentedRangeTombstoneList* tombstones,
268
- const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
269
- const Slice* ts_upper_bound, SequenceNumber _lower_bound)
270
+ FragmentedRangeTombstoneList* tombstones, const InternalKeyComparator& icmp,
271
+ SequenceNumber _upper_bound, const Slice* ts_upper_bound,
272
+ SequenceNumber _lower_bound)
270
273
  : tombstone_start_cmp_(icmp.user_comparator()),
271
274
  tombstone_end_cmp_(icmp.user_comparator()),
272
275
  icmp_(&icmp),
@@ -280,7 +283,7 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
280
283
  }
281
284
 
282
285
  FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
283
- const std::shared_ptr<const FragmentedRangeTombstoneList>& tombstones,
286
+ const std::shared_ptr<FragmentedRangeTombstoneList>& tombstones,
284
287
  const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
285
288
  const Slice* ts_upper_bound, SequenceNumber _lower_bound)
286
289
  : tombstone_start_cmp_(icmp.user_comparator()),