@nxtedition/rocksdb 7.1.20 → 7.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -6
  2. package/deps/rocksdb/rocksdb/Makefile +1 -1
  3. package/deps/rocksdb/rocksdb/TARGETS +2 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
  11. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
  13. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
  15. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
  19. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
  27. package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
  29. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
  46. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  47. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  48. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
  49. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
  50. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
  51. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
  60. package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
  61. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
  62. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
  64. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
  65. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
  67. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
  72. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
  73. package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
  74. package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
  75. package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
  76. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
  77. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
  78. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
  79. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
  80. package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
  82. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
  83. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
  84. package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
  85. package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
  86. package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
  87. package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
  88. package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
  89. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  91. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
  92. package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
  93. package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
  94. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
  95. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
  96. package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
  97. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
  98. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
  99. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  100. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  101. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
  102. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
  103. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
  104. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
  105. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
  106. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
  108. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
  109. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
  110. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
  111. package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
  112. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
  113. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
  114. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
  115. package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
  116. package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
  117. package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
  118. package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
  119. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
  120. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
  121. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
  122. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
  123. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
  124. package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
  125. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
  126. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
  127. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
  130. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
  140. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
  142. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
  143. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
  144. package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
  145. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
  146. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
  147. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
  148. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
  149. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
  150. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
  152. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
  153. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
  154. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
  155. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
  157. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
  160. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
  162. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  164. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
  165. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
  166. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  167. package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
  168. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
  169. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  170. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  171. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  172. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  174. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  175. package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
  176. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
  177. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  178. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  179. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
  180. package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
  181. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  182. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  183. package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
  184. package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
  185. package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
  186. package/deps/rocksdb/rocksdb/src.mk +1 -0
  187. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
  188. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
  189. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
  192. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
  195. package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
  196. package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
  197. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
  198. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
  199. package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
  200. package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
  201. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
  202. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
  203. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
  204. package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
  205. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
  206. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
  207. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  208. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
  209. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
  210. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  211. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
  212. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
  213. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
  214. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
  215. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
  216. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
  217. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
  218. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
  219. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
  220. package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
  221. package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
  222. package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
  223. package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
  224. package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
  225. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
  226. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
  227. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
  228. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
  229. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
  230. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
  231. package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
  232. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
  233. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
  234. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
  235. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
  236. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
  237. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
  239. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
  240. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
  241. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
  242. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
  243. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
  244. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
  245. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
  246. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
  247. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
  248. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
  249. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
  250. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
  251. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
  252. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
  253. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
  254. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
  255. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
  256. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
  257. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
  258. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
  259. package/index.js +12 -4
  260. package/package.json +1 -1
  261. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  262. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -25,22 +25,36 @@ class CfConsistencyStressTest : public StressTest {
25
25
  const std::vector<int>& rand_column_families,
26
26
  const std::vector<int64_t>& rand_keys,
27
27
  char (&value)[100]) override {
28
- std::string key_str = Key(rand_keys[0]);
29
- Slice key = key_str;
30
- uint64_t value_base = batch_id_.fetch_add(1);
31
- size_t sz =
32
- GenerateValue(static_cast<uint32_t>(value_base), value, sizeof(value));
33
- Slice v(value, sz);
28
+ assert(!rand_column_families.empty());
29
+ assert(!rand_keys.empty());
30
+
31
+ const std::string k = Key(rand_keys[0]);
32
+
33
+ const uint32_t value_base = batch_id_.fetch_add(1);
34
+ const size_t sz = GenerateValue(value_base, value, sizeof(value));
35
+ const Slice v(value, sz);
36
+
34
37
  WriteBatch batch;
38
+
39
+ const bool use_put_entity = !FLAGS_use_merge &&
40
+ FLAGS_use_put_entity_one_in > 0 &&
41
+ (value_base % FLAGS_use_put_entity_one_in) == 0;
42
+
35
43
  for (auto cf : rand_column_families) {
36
- ColumnFamilyHandle* cfh = column_families_[cf];
44
+ ColumnFamilyHandle* const cfh = column_families_[cf];
45
+ assert(cfh);
46
+
37
47
  if (FLAGS_use_merge) {
38
- batch.Merge(cfh, key, v);
39
- } else { /* !FLAGS_use_merge */
40
- batch.Put(cfh, key, v);
48
+ batch.Merge(cfh, k, v);
49
+ } else if (use_put_entity) {
50
+ batch.PutEntity(cfh, k, GenerateWideColumns(value_base, v));
51
+ } else {
52
+ batch.Put(cfh, k, v);
41
53
  }
42
54
  }
55
+
43
56
  Status s = db_->Write(write_opts, &batch);
57
+
44
58
  if (!s.ok()) {
45
59
  fprintf(stderr, "multi put or merge error: %s\n", s.ToString().c_str());
46
60
  thread->stats.AddErrors(1);
@@ -240,42 +254,69 @@ class CfConsistencyStressTest : public StressTest {
240
254
  Status TestPrefixScan(ThreadState* thread, const ReadOptions& readoptions,
241
255
  const std::vector<int>& rand_column_families,
242
256
  const std::vector<int64_t>& rand_keys) override {
243
- size_t prefix_to_use =
257
+ assert(!rand_column_families.empty());
258
+ assert(!rand_keys.empty());
259
+
260
+ const std::string key = Key(rand_keys[0]);
261
+
262
+ const size_t prefix_to_use =
244
263
  (FLAGS_prefix_size < 0) ? 7 : static_cast<size_t>(FLAGS_prefix_size);
245
264
 
246
- std::string key_str = Key(rand_keys[0]);
247
- Slice key = key_str;
248
- Slice prefix = Slice(key.data(), prefix_to_use);
265
+ const Slice prefix(key.data(), prefix_to_use);
249
266
 
250
267
  std::string upper_bound;
251
268
  Slice ub_slice;
269
+
252
270
  ReadOptions ro_copy = readoptions;
271
+
253
272
  // Get the next prefix first and then see if we want to set upper bound.
254
273
  // We'll use the next prefix in an assertion later on
255
274
  if (GetNextPrefix(prefix, &upper_bound) && thread->rand.OneIn(2)) {
256
275
  ub_slice = Slice(upper_bound);
257
276
  ro_copy.iterate_upper_bound = &ub_slice;
258
277
  }
259
- auto cfh =
260
- column_families_[rand_column_families[thread->rand.Next() %
261
- rand_column_families.size()]];
262
- Iterator* iter = db_->NewIterator(ro_copy, cfh);
263
- unsigned long count = 0;
278
+
279
+ ColumnFamilyHandle* const cfh =
280
+ column_families_[rand_column_families[thread->rand.Uniform(
281
+ static_cast<int>(rand_column_families.size()))]];
282
+ assert(cfh);
283
+
284
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ro_copy, cfh));
285
+
286
+ uint64_t count = 0;
287
+ Status s;
288
+
264
289
  for (iter->Seek(prefix); iter->Valid() && iter->key().starts_with(prefix);
265
290
  iter->Next()) {
266
291
  ++count;
292
+
293
+ const WideColumns expected_columns = GenerateExpectedWideColumns(
294
+ GetValueBase(iter->value()), iter->value());
295
+ if (iter->columns() != expected_columns) {
296
+ s = Status::Corruption(
297
+ "Value and columns inconsistent",
298
+ DebugString(iter->value(), iter->columns(), expected_columns));
299
+ break;
300
+ }
267
301
  }
302
+
268
303
  assert(prefix_to_use == 0 ||
269
304
  count <= GetPrefixKeyCount(prefix.ToString(), upper_bound));
270
- Status s = iter->status();
305
+
271
306
  if (s.ok()) {
272
- thread->stats.AddPrefixes(1, count);
273
- } else {
307
+ s = iter->status();
308
+ }
309
+
310
+ if (!s.ok()) {
274
311
  fprintf(stderr, "TestPrefixScan error: %s\n", s.ToString().c_str());
275
312
  thread->stats.AddErrors(1);
313
+
314
+ return s;
276
315
  }
277
- delete iter;
278
- return s;
316
+
317
+ thread->stats.AddPrefixes(1, count);
318
+
319
+ return Status::OK();
279
320
  }
280
321
 
281
322
  ColumnFamilyHandle* GetControlCfh(ThreadState* thread,
@@ -289,6 +330,7 @@ class CfConsistencyStressTest : public StressTest {
289
330
  // This `ReadOptions` is for validation purposes. Ignore
290
331
  // `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
291
332
  ReadOptions options(FLAGS_verify_checksum, true);
333
+
292
334
  // We must set total_order_seek to true because we are doing a SeekToFirst
293
335
  // on a column family whose memtables may support (by default) prefix-based
294
336
  // iterator. In this case, NewIterator with options.total_order_seek being
@@ -297,54 +339,73 @@ class CfConsistencyStressTest : public StressTest {
297
339
  // iterate the memtable using this iterator any more, although the memtable
298
340
  // contains the most up-to-date key-values.
299
341
  options.total_order_seek = true;
300
- const auto ss_deleter = [this](const Snapshot* ss) {
301
- db_->ReleaseSnapshot(ss);
302
- };
303
- std::unique_ptr<const Snapshot, decltype(ss_deleter)> snapshot_guard(
304
- db_->GetSnapshot(), ss_deleter);
305
- options.snapshot = snapshot_guard.get();
306
- assert(thread != nullptr);
307
- auto shared = thread->shared;
308
- std::vector<std::unique_ptr<Iterator>> iters(column_families_.size());
309
- for (size_t i = 0; i != column_families_.size(); ++i) {
310
- iters[i].reset(db_->NewIterator(options, column_families_[i]));
311
- }
312
- for (auto& iter : iters) {
313
- iter->SeekToFirst();
342
+
343
+ ManagedSnapshot snapshot_guard(db_);
344
+ options.snapshot = snapshot_guard.snapshot();
345
+
346
+ const size_t num = column_families_.size();
347
+
348
+ std::vector<std::unique_ptr<Iterator>> iters;
349
+ iters.reserve(num);
350
+
351
+ for (size_t i = 0; i < num; ++i) {
352
+ iters.emplace_back(db_->NewIterator(options, column_families_[i]));
353
+ iters.back()->SeekToFirst();
314
354
  }
315
- size_t num = column_families_.size();
316
- assert(num == iters.size());
355
+
317
356
  std::vector<Status> statuses(num, Status::OK());
357
+
358
+ assert(thread);
359
+
360
+ auto shared = thread->shared;
361
+ assert(shared);
362
+
318
363
  do {
319
364
  if (shared->HasVerificationFailedYet()) {
320
365
  break;
321
366
  }
367
+
322
368
  size_t valid_cnt = 0;
323
- size_t idx = 0;
324
- for (auto& iter : iters) {
369
+
370
+ for (size_t i = 0; i < num; ++i) {
371
+ const auto& iter = iters[i];
372
+ assert(iter);
373
+
325
374
  if (iter->Valid()) {
326
- ++valid_cnt;
375
+ const WideColumns expected_columns = GenerateExpectedWideColumns(
376
+ GetValueBase(iter->value()), iter->value());
377
+ if (iter->columns() != expected_columns) {
378
+ statuses[i] = Status::Corruption(
379
+ "Value and columns inconsistent",
380
+ DebugString(iter->value(), iter->columns(), expected_columns));
381
+ } else {
382
+ ++valid_cnt;
383
+ }
327
384
  } else {
328
- statuses[idx] = iter->status();
385
+ statuses[i] = iter->status();
329
386
  }
330
- ++idx;
331
387
  }
388
+
332
389
  if (valid_cnt == 0) {
333
- Status status;
334
- for (size_t i = 0; i != num; ++i) {
390
+ for (size_t i = 0; i < num; ++i) {
335
391
  const auto& s = statuses[i];
336
392
  if (!s.ok()) {
337
- status = s;
338
393
  fprintf(stderr, "Iterator on cf %s has error: %s\n",
339
394
  column_families_[i]->GetName().c_str(),
340
395
  s.ToString().c_str());
341
396
  shared->SetVerificationFailure();
342
397
  }
343
398
  }
399
+
344
400
  break;
345
- } else if (valid_cnt != iters.size()) {
401
+ }
402
+
403
+ if (valid_cnt < num) {
346
404
  shared->SetVerificationFailure();
347
- for (size_t i = 0; i != num; ++i) {
405
+
406
+ for (size_t i = 0; i < num; ++i) {
407
+ assert(iters[i]);
408
+
348
409
  if (!iters[i]->Valid()) {
349
410
  if (statuses[i].ok()) {
350
411
  fprintf(stderr, "Finished scanning cf %s\n",
@@ -359,83 +420,105 @@ class CfConsistencyStressTest : public StressTest {
359
420
  column_families_[i]->GetName().c_str());
360
421
  }
361
422
  }
423
+
362
424
  break;
363
425
  }
426
+
364
427
  if (shared->HasVerificationFailedYet()) {
365
428
  break;
366
429
  }
430
+
367
431
  // If the program reaches here, then all column families' iterators are
368
432
  // still valid.
433
+ assert(valid_cnt == num);
434
+
369
435
  if (shared->PrintingVerificationResults()) {
370
436
  continue;
371
437
  }
372
- Slice key;
373
- Slice value;
438
+
439
+ assert(iters[0]);
440
+
441
+ const Slice key = iters[0]->key();
442
+ const Slice value = iters[0]->value();
443
+
374
444
  int num_mismatched_cfs = 0;
375
- for (size_t i = 0; i != num; ++i) {
376
- if (i == 0) {
377
- key = iters[i]->key();
378
- value = iters[i]->value();
379
- } else {
380
- int cmp = key.compare(iters[i]->key());
381
- if (cmp != 0) {
382
- ++num_mismatched_cfs;
383
- if (1 == num_mismatched_cfs) {
384
- fprintf(stderr, "Verification failed\n");
385
- fprintf(stderr, "Latest Sequence Number: %" PRIu64 "\n",
386
- db_->GetLatestSequenceNumber());
387
- fprintf(stderr, "[%s] %s => %s\n",
388
- column_families_[0]->GetName().c_str(),
389
- key.ToString(true /* hex */).c_str(),
390
- value.ToString(true /* hex */).c_str());
391
- }
445
+
446
+ for (size_t i = 1; i < num; ++i) {
447
+ assert(iters[i]);
448
+
449
+ const int cmp = key.compare(iters[i]->key());
450
+
451
+ if (cmp != 0) {
452
+ ++num_mismatched_cfs;
453
+
454
+ if (1 == num_mismatched_cfs) {
455
+ fprintf(stderr, "Verification failed\n");
456
+ fprintf(stderr, "Latest Sequence Number: %" PRIu64 "\n",
457
+ db_->GetLatestSequenceNumber());
392
458
  fprintf(stderr, "[%s] %s => %s\n",
393
- column_families_[i]->GetName().c_str(),
394
- iters[i]->key().ToString(true /* hex */).c_str(),
395
- iters[i]->value().ToString(true /* hex */).c_str());
459
+ column_families_[0]->GetName().c_str(),
460
+ key.ToString(true /* hex */).c_str(),
461
+ value.ToString(true /* hex */).c_str());
462
+ }
463
+
464
+ fprintf(stderr, "[%s] %s => %s\n",
465
+ column_families_[i]->GetName().c_str(),
466
+ iters[i]->key().ToString(true /* hex */).c_str(),
467
+ iters[i]->value().ToString(true /* hex */).c_str());
468
+
396
469
  #ifndef ROCKSDB_LITE
397
- Slice begin_key;
398
- Slice end_key;
399
- if (cmp < 0) {
400
- begin_key = key;
401
- end_key = iters[i]->key();
402
- } else {
403
- begin_key = iters[i]->key();
404
- end_key = key;
405
- }
470
+ Slice begin_key;
471
+ Slice end_key;
472
+ if (cmp < 0) {
473
+ begin_key = key;
474
+ end_key = iters[i]->key();
475
+ } else {
476
+ begin_key = iters[i]->key();
477
+ end_key = key;
478
+ }
479
+
480
+ const auto print_key_versions = [&](ColumnFamilyHandle* cfh) {
481
+ constexpr size_t kMaxNumIKeys = 8;
482
+
406
483
  std::vector<KeyVersion> versions;
407
- const size_t kMaxNumIKeys = 8;
408
- const auto print_key_versions = [&](ColumnFamilyHandle* cfh) {
409
- Status s = GetAllKeyVersions(db_, cfh, begin_key, end_key,
410
- kMaxNumIKeys, &versions);
411
- if (!s.ok()) {
412
- fprintf(stderr, "%s\n", s.ToString().c_str());
413
- return;
414
- }
415
- assert(nullptr != cfh);
416
- fprintf(stderr,
417
- "Internal keys in CF '%s', [%s, %s] (max %" ROCKSDB_PRIszt
418
- ")\n",
419
- cfh->GetName().c_str(),
420
- begin_key.ToString(true /* hex */).c_str(),
421
- end_key.ToString(true /* hex */).c_str(), kMaxNumIKeys);
422
- for (const KeyVersion& kv : versions) {
423
- fprintf(stderr, " key %s seq %" PRIu64 " type %d\n",
424
- Slice(kv.user_key).ToString(true).c_str(), kv.sequence,
425
- kv.type);
426
- }
427
- };
428
- if (1 == num_mismatched_cfs) {
429
- print_key_versions(column_families_[0]);
484
+ const Status s = GetAllKeyVersions(db_, cfh, begin_key, end_key,
485
+ kMaxNumIKeys, &versions);
486
+ if (!s.ok()) {
487
+ fprintf(stderr, "%s\n", s.ToString().c_str());
488
+ return;
430
489
  }
431
- print_key_versions(column_families_[i]);
432
- #endif // ROCKSDB_LITE
433
- shared->SetVerificationFailure();
490
+
491
+ assert(cfh);
492
+
493
+ fprintf(stderr,
494
+ "Internal keys in CF '%s', [%s, %s] (max %" ROCKSDB_PRIszt
495
+ ")\n",
496
+ cfh->GetName().c_str(),
497
+ begin_key.ToString(true /* hex */).c_str(),
498
+ end_key.ToString(true /* hex */).c_str(), kMaxNumIKeys);
499
+
500
+ for (const KeyVersion& kv : versions) {
501
+ fprintf(stderr, " key %s seq %" PRIu64 " type %d\n",
502
+ Slice(kv.user_key).ToString(true).c_str(), kv.sequence,
503
+ kv.type);
504
+ }
505
+ };
506
+
507
+ if (1 == num_mismatched_cfs) {
508
+ print_key_versions(column_families_[0]);
434
509
  }
510
+
511
+ print_key_versions(column_families_[i]);
512
+ #endif // ROCKSDB_LITE
513
+
514
+ shared->SetVerificationFailure();
435
515
  }
436
516
  }
517
+
437
518
  shared->FinishPrintingVerificationResults();
519
+
438
520
  for (auto& iter : iters) {
521
+ assert(iter);
439
522
  iter->Next();
440
523
  }
441
524
  } while (true);
@@ -469,11 +552,19 @@ class CfConsistencyStressTest : public StressTest {
469
552
  const auto checksum_column_family = [](Iterator* iter,
470
553
  uint32_t* checksum) -> Status {
471
554
  assert(nullptr != checksum);
555
+
472
556
  uint32_t ret = 0;
473
557
  for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
474
558
  ret = crc32c::Extend(ret, iter->key().data(), iter->key().size());
475
559
  ret = crc32c::Extend(ret, iter->value().data(), iter->value().size());
560
+
561
+ for (const auto& column : iter->columns()) {
562
+ ret = crc32c::Extend(ret, column.name().data(), column.name().size());
563
+ ret =
564
+ crc32c::Extend(ret, column.value().data(), column.value().size());
565
+ }
476
566
  }
567
+
477
568
  *checksum = ret;
478
569
  return iter->status();
479
570
  };
@@ -538,7 +629,7 @@ class CfConsistencyStressTest : public StressTest {
538
629
  }
539
630
 
540
631
  private:
541
- std::atomic<int64_t> batch_id_;
632
+ std::atomic<uint32_t> batch_id_;
542
633
  };
543
634
 
544
635
  StressTest* CreateCfConsistencyStressTest() {
@@ -239,6 +239,45 @@ uint32_t GetValueBase(Slice s) {
239
239
  return res;
240
240
  }
241
241
 
242
+ WideColumns GenerateWideColumns(uint32_t value_base, const Slice& slice) {
243
+ WideColumns columns;
244
+
245
+ constexpr size_t max_columns = 4;
246
+ const size_t num_columns = (value_base % max_columns) + 1;
247
+
248
+ columns.reserve(num_columns);
249
+
250
+ assert(slice.size() >= num_columns);
251
+
252
+ columns.emplace_back(kDefaultWideColumnName, slice);
253
+
254
+ for (size_t i = 1; i < num_columns; ++i) {
255
+ const Slice name(slice.data(), i);
256
+ const Slice value(slice.data() + i, slice.size() - i);
257
+
258
+ columns.emplace_back(name, value);
259
+ }
260
+
261
+ return columns;
262
+ }
263
+
264
+ WideColumns GenerateExpectedWideColumns(uint32_t value_base,
265
+ const Slice& slice) {
266
+ if (FLAGS_use_put_entity_one_in == 0 ||
267
+ (value_base % FLAGS_use_put_entity_one_in) != 0) {
268
+ return WideColumns{{kDefaultWideColumnName, slice}};
269
+ }
270
+
271
+ WideColumns columns = GenerateWideColumns(value_base, slice);
272
+
273
+ std::sort(columns.begin(), columns.end(),
274
+ [](const WideColumn& lhs, const WideColumn& rhs) {
275
+ return lhs.name().compare(rhs.name()) < 0;
276
+ });
277
+
278
+ return columns;
279
+ }
280
+
242
281
  std::string GetNowNanos() {
243
282
  uint64_t t = db_stress_env->NowNanos();
244
283
  std::string ret;
@@ -86,6 +86,7 @@ DECLARE_string(options_file);
86
86
  DECLARE_int64(active_width);
87
87
  DECLARE_bool(test_batches_snapshots);
88
88
  DECLARE_bool(atomic_flush);
89
+ DECLARE_int32(manual_wal_flush_one_in);
89
90
  DECLARE_bool(test_cf_consistency);
90
91
  DECLARE_bool(test_multi_ops_txns);
91
92
  DECLARE_int32(threads);
@@ -173,6 +174,7 @@ DECLARE_bool(mock_direct_io);
173
174
  DECLARE_bool(statistics);
174
175
  DECLARE_bool(sync);
175
176
  DECLARE_bool(use_fsync);
177
+ DECLARE_uint64(stats_dump_period_sec);
176
178
  DECLARE_uint64(bytes_per_sync);
177
179
  DECLARE_uint64(wal_bytes_per_sync);
178
180
  DECLARE_int32(kill_random_test);
@@ -235,6 +237,7 @@ DECLARE_bool(in_place_update);
235
237
  DECLARE_string(memtablerep);
236
238
  DECLARE_int32(prefix_size);
237
239
  DECLARE_bool(use_merge);
240
+ DECLARE_uint32(use_put_entity_one_in);
238
241
  DECLARE_bool(use_full_merge_v1);
239
242
  DECLARE_int32(sync_wal_one_in);
240
243
  DECLARE_bool(avoid_unnecessary_blocking_io);
@@ -311,6 +314,7 @@ DECLARE_bool(allow_data_in_errors);
311
314
  // Tiered storage
312
315
  DECLARE_bool(enable_tiered_storage); // set last_level_temperature
313
316
  DECLARE_int64(preclude_last_level_data_seconds);
317
+ DECLARE_int64(preserve_internal_time_seconds);
314
318
 
315
319
  DECLARE_int32(verify_iterator_with_expected_state_one_in);
316
320
  DECLARE_bool(preserve_unverified_changes);
@@ -620,6 +624,10 @@ extern std::vector<int64_t> GenerateNKeys(ThreadState* thread, int num_keys,
620
624
  extern size_t GenerateValue(uint32_t rand, char* v, size_t max_sz);
621
625
  extern uint32_t GetValueBase(Slice s);
622
626
 
627
+ extern WideColumns GenerateWideColumns(uint32_t value_base, const Slice& slice);
628
+ extern WideColumns GenerateExpectedWideColumns(uint32_t value_base,
629
+ const Slice& slice);
630
+
623
631
  extern StressTest* CreateCfConsistencyStressTest();
624
632
  extern StressTest* CreateBatchedOpsStressTest();
625
633
  extern StressTest* CreateNonBatchedOpsStressTest();
@@ -143,7 +143,9 @@ bool RunStressTest(StressTest* stress) {
143
143
 
144
144
  // This is after the verification step to avoid making all those `Get()`s
145
145
  // and `MultiGet()`s contend on the DB-wide trace mutex.
146
- stress->TrackExpectedState(&shared);
146
+ if (!FLAGS_expected_values_dir.empty()) {
147
+ stress->TrackExpectedState(&shared);
148
+ }
147
149
 
148
150
  now = clock->NowMicros();
149
151
  fprintf(stdout, "%s Starting database operations\n",
@@ -85,6 +85,13 @@ DEFINE_bool(test_batches_snapshots, false,
85
85
  DEFINE_bool(atomic_flush, false,
86
86
  "If set, enables atomic flush in the options.\n");
87
87
 
88
+ DEFINE_int32(
89
+ manual_wal_flush_one_in, 0,
90
+ "If non-zero, then `FlushWAL(bool sync)`, where `bool sync` is randomly "
91
+ "decided, will be explictly called in db stress once for every N ops "
92
+ "on average. Setting `manual_wal_flush_one_in` to be greater than 0 "
93
+ "implies `Options::manual_wal_flush = true` is set.");
94
+
88
95
  DEFINE_bool(test_cf_consistency, false,
89
96
  "If set, runs the stress test dedicated to verifying writes to "
90
97
  "multiple column families are consistent. Setting this implies "
@@ -489,6 +496,10 @@ DEFINE_int64(preclude_last_level_data_seconds, 0,
489
496
  "Preclude data from the last level. Used with tiered storage "
490
497
  "feature to preclude new data from comacting to the last level.");
491
498
 
499
+ DEFINE_int64(
500
+ preserve_internal_time_seconds, 0,
501
+ "Preserve internal time information which is attached to each SST.");
502
+
492
503
  static const bool FLAGS_subcompactions_dummy __attribute__((__unused__)) =
493
504
  RegisterFlagValidator(&FLAGS_subcompactions, &ValidateUint32Range);
494
505
 
@@ -858,6 +869,10 @@ DEFINE_bool(use_merge, false,
858
869
  "On true, replaces all writes with a Merge "
859
870
  "that behaves like a Put");
860
871
 
872
+ DEFINE_uint32(use_put_entity_one_in, 0,
873
+ "If greater than zero, PutEntity will be used once per every N "
874
+ "write ops on average.");
875
+
861
876
  DEFINE_bool(use_full_merge_v1, false,
862
877
  "On true, use a merge operator that implement the deprecated "
863
878
  "version of FullMerge");
@@ -1052,4 +1067,8 @@ DEFINE_bool(
1052
1067
  "be preserved similarly under `FLAGS_expected_values_dir/unverified` when "
1053
1068
  "`--expected_values_dir` is nonempty.");
1054
1069
 
1070
+ DEFINE_uint64(stats_dump_period_sec,
1071
+ ROCKSDB_NAMESPACE::Options().stats_dump_period_sec,
1072
+ "Gap between printing stats to log in seconds");
1073
+
1055
1074
  #endif // GFLAGS
@@ -215,6 +215,32 @@ class SharedState {
215
215
  }
216
216
  }
217
217
 
218
+ // Returns a collection of mutex locks covering the key range [start, end) in
219
+ // `cf`.
220
+ std::vector<std::unique_ptr<MutexLock>> GetLocksForKeyRange(int cf,
221
+ int64_t start,
222
+ int64_t end) {
223
+ std::vector<std::unique_ptr<MutexLock>> range_locks;
224
+
225
+ if (start >= end) {
226
+ return range_locks;
227
+ }
228
+
229
+ const int64_t start_idx = start >> log2_keys_per_lock_;
230
+
231
+ int64_t end_idx = end >> log2_keys_per_lock_;
232
+ if ((end & ((1 << log2_keys_per_lock_) - 1)) == 0) {
233
+ --end_idx;
234
+ }
235
+
236
+ for (int64_t idx = start_idx; idx <= end_idx; ++idx) {
237
+ range_locks.emplace_back(
238
+ std::make_unique<MutexLock>(&key_locks_[cf][idx]));
239
+ }
240
+
241
+ return range_locks;
242
+ }
243
+
218
244
  Status SaveAtAndAfter(DB* db) {
219
245
  return expected_state_manager_->SaveAtAndAfter(db);
220
246
  }