@nxtedition/rocksdb 8.2.0 → 8.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/binding.cc +3 -3
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -52
  3. package/deps/rocksdb/rocksdb/Makefile +10 -5
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -345
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +92 -0
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +32 -32
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +12 -9
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +6 -43
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +3 -13
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +8 -5
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +21 -47
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -8
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +1 -2
  15. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +44 -7
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +13 -14
  17. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +1 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -0
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +2 -1
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +17 -8
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +40 -21
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +41 -42
  25. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +1 -1
  26. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +1 -1
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +5 -4
  28. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -2
  29. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +5 -3
  30. package/deps/rocksdb/rocksdb/db/builder.cc +7 -6
  31. package/deps/rocksdb/rocksdb/db/builder.h +2 -2
  32. package/deps/rocksdb/rocksdb/db/c.cc +76 -5
  33. package/deps/rocksdb/rocksdb/db/c_test.c +141 -0
  34. package/deps/rocksdb/rocksdb/db/column_family.cc +32 -0
  35. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +3 -2
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +5 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +8 -5
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +12 -10
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +21 -17
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -7
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +3 -1
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +77 -50
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +4 -5
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +55 -8
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +142 -56
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +1 -2
  50. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +21 -20
  51. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  52. package/deps/rocksdb/rocksdb/db/corruption_test.cc +5 -4
  53. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +6 -3
  54. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +260 -220
  55. package/deps/rocksdb/rocksdb/db/db_clip_test.cc +142 -0
  56. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +1 -1
  57. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +333 -27
  58. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +5 -0
  59. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +7 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +189 -27
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +23 -10
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +134 -90
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -2
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -3
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -1
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +124 -16
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +10 -0
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +7 -0
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +15 -0
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -5
  71. package/deps/rocksdb/rocksdb/db/db_iter.cc +7 -8
  72. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +54 -3
  73. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +42 -0
  74. package/deps/rocksdb/rocksdb/db/db_options_test.cc +116 -1
  75. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -2
  76. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +3 -2
  77. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +9 -8
  78. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +142 -63
  79. package/deps/rocksdb/rocksdb/db/db_test.cc +28 -7
  80. package/deps/rocksdb/rocksdb/db/db_test2.cc +71 -131
  81. package/deps/rocksdb/rocksdb/db/db_test_util.cc +18 -0
  82. package/deps/rocksdb/rocksdb/db/db_test_util.h +6 -0
  83. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +10 -10
  84. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +25 -0
  85. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +88 -0
  86. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +67 -0
  87. package/deps/rocksdb/rocksdb/db/db_write_test.cc +5 -0
  88. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  89. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -2
  90. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +86 -1
  91. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +15 -2
  92. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -2
  93. package/deps/rocksdb/rocksdb/db/flush_job.cc +21 -14
  94. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +14 -7
  95. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +31 -8
  96. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +21 -19
  97. package/deps/rocksdb/rocksdb/db/internal_stats.cc +42 -12
  98. package/deps/rocksdb/rocksdb/db/internal_stats.h +1 -0
  99. package/deps/rocksdb/rocksdb/db/kv_checksum.h +92 -6
  100. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -2
  101. package/deps/rocksdb/rocksdb/db/log_format.h +8 -4
  102. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -51
  103. package/deps/rocksdb/rocksdb/db/log_reader.h +16 -0
  104. package/deps/rocksdb/rocksdb/db/log_test.cc +125 -4
  105. package/deps/rocksdb/rocksdb/db/log_writer.cc +32 -2
  106. package/deps/rocksdb/rocksdb/db/log_writer.h +16 -0
  107. package/deps/rocksdb/rocksdb/db/memtable.cc +17 -46
  108. package/deps/rocksdb/rocksdb/db/memtable.h +1 -1
  109. package/deps/rocksdb/rocksdb/db/memtable_list.cc +8 -4
  110. package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -1
  111. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +5 -4
  113. package/deps/rocksdb/rocksdb/db/repair.cc +38 -11
  114. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -3
  115. package/deps/rocksdb/rocksdb/db/table_cache.cc +68 -51
  116. package/deps/rocksdb/rocksdb/db/table_cache.h +20 -10
  117. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -1
  118. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +6 -3
  119. package/deps/rocksdb/rocksdb/db/version_builder.cc +9 -5
  120. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  121. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +140 -120
  122. package/deps/rocksdb/rocksdb/db/version_edit.cc +14 -0
  123. package/deps/rocksdb/rocksdb/db/version_edit.h +12 -4
  124. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +21 -13
  125. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +26 -16
  126. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +9 -9
  127. package/deps/rocksdb/rocksdb/db/version_set.cc +292 -96
  128. package/deps/rocksdb/rocksdb/db/version_set.h +53 -28
  129. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -0
  130. package/deps/rocksdb/rocksdb/db/version_set_test.cc +62 -22
  131. package/deps/rocksdb/rocksdb/db/version_util.h +5 -4
  132. package/deps/rocksdb/rocksdb/db/write_batch.cc +3 -1
  133. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  134. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +119 -27
  135. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +123 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +7 -2
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +34 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -0
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +43 -33
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +29 -17
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -1
  144. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +85 -50
  145. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +96 -54
  146. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.cc +122 -0
  147. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +206 -0
  148. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +9 -1
  149. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +9 -3
  150. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +322 -92
  151. package/deps/rocksdb/rocksdb/env/env_posix.cc +12 -8
  152. package/deps/rocksdb/rocksdb/env/env_test.cc +31 -0
  153. package/deps/rocksdb/rocksdb/env/mock_env.cc +1 -1
  154. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +14 -0
  155. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -1
  156. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +5 -1
  157. package/deps/rocksdb/rocksdb/file/file_util.cc +3 -3
  158. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  159. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +89 -0
  160. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +22 -7
  161. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -2
  162. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +1 -1
  163. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +1 -1
  164. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +1 -1
  165. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +3 -0
  166. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +154 -74
  167. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +27 -7
  168. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +107 -28
  169. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +19 -0
  170. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +8 -0
  171. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
  172. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +7 -1
  173. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +137 -152
  174. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +61 -26
  175. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +30 -26
  176. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +33 -16
  177. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +87 -8
  178. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +1 -1
  179. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +5 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  181. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +1 -0
  182. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -1
  184. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  185. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +9 -2
  186. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -0
  187. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +78 -42
  188. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +14 -9
  189. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +4 -9
  192. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +19 -11
  193. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  194. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +211 -555
  195. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -1
  196. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +36 -2
  197. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +17 -7
  198. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +10 -7
  199. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +19 -18
  200. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +10 -2
  201. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
  202. package/deps/rocksdb/rocksdb/options/cf_options.cc +35 -2
  203. package/deps/rocksdb/rocksdb/options/cf_options.h +5 -0
  204. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1 -1
  205. package/deps/rocksdb/rocksdb/options/options.cc +12 -53
  206. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -0
  207. package/deps/rocksdb/rocksdb/options/options_parser.cc +11 -0
  208. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +32 -4
  209. package/deps/rocksdb/rocksdb/options/options_test.cc +89 -5
  210. package/deps/rocksdb/rocksdb/port/lang.h +27 -0
  211. package/deps/rocksdb/rocksdb/port/stack_trace.cc +67 -24
  212. package/deps/rocksdb/rocksdb/src.mk +2 -0
  213. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -3
  214. package/deps/rocksdb/rocksdb/table/block_based/block.cc +195 -35
  215. package/deps/rocksdb/rocksdb/table/block_based/block.h +197 -24
  216. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +71 -51
  217. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +7 -1
  218. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +4 -6
  219. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +3 -0
  220. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +43 -2
  221. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +36 -6
  222. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +266 -166
  223. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +44 -14
  224. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -1
  225. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +63 -56
  226. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +8 -2
  227. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +4 -2
  228. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +10 -0
  229. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +14 -2
  230. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +918 -2
  231. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -2
  232. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -9
  233. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -8
  234. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +2 -2
  235. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -1
  236. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +18 -23
  237. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +8 -8
  238. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -32
  239. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +7 -8
  240. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +4 -5
  241. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +3 -3
  242. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +46 -53
  243. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +12 -12
  244. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -9
  245. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +26 -23
  246. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -1
  247. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +3 -0
  248. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -2
  249. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +3 -2
  250. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +7 -1
  251. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  252. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  253. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +3 -2
  254. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +5 -2
  255. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +4 -2
  256. package/deps/rocksdb/rocksdb/table/format.cc +4 -4
  257. package/deps/rocksdb/rocksdb/table/format.h +1 -1
  258. package/deps/rocksdb/rocksdb/table/get_context.cc +1 -1
  259. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +33 -22
  260. package/deps/rocksdb/rocksdb/table/meta_blocks.h +4 -0
  261. package/deps/rocksdb/rocksdb/table/mock_table.cc +4 -2
  262. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +1 -1
  263. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +1 -1
  264. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +18 -10
  265. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -3
  266. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +10 -7
  267. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +4 -2
  268. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +11 -0
  269. package/deps/rocksdb/rocksdb/table/table_builder.h +14 -5
  270. package/deps/rocksdb/rocksdb/table/table_properties.cc +2 -0
  271. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -3
  272. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +1 -1
  273. package/deps/rocksdb/rocksdb/table/table_test.cc +291 -34
  274. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +3 -1
  275. package/deps/rocksdb/rocksdb/test_util/testharness.h +5 -0
  276. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -2
  277. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +33 -17
  278. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -1
  279. package/deps/rocksdb/rocksdb/util/bloom_impl.h +2 -2
  280. package/deps/rocksdb/rocksdb/util/compression.h +1 -1
  281. package/deps/rocksdb/rocksdb/util/crc32c.cc +24 -83
  282. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +7 -9
  283. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +4 -1
  284. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  285. package/deps/rocksdb/rocksdb/util/gflags_compat.h +9 -10
  286. package/deps/rocksdb/rocksdb/util/math.h +12 -7
  287. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +16 -18
  288. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +46 -2
  289. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +6 -6
  290. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +12 -7
  291. package/deps/rocksdb/rocksdb/util/stop_watch.h +31 -13
  292. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +2 -0
  293. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  294. package/deps/rocksdb/rocksdb/util/udt_util.h +77 -0
  295. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +2 -2
  296. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -1
  297. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +1 -1
  298. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +1 -1
  299. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
  300. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -1
  301. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +11 -1
  302. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +34 -1
  303. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +15 -0
  304. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +1 -1
  305. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +5 -1
  306. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +29 -1
  307. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +0 -1
  308. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +0 -1
  309. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +6 -1
  310. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +10 -0
  311. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +6 -1
  312. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +5 -0
  313. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +5 -0
  314. package/package.json +1 -1
  315. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  316. package/prebuilds/linux-x64/node.napi.node +0 -0
  317. /package/deps/rocksdb/rocksdb/memory/{memory_allocator.h → memory_allocator_impl.h} +0 -0
  318. /package/deps/rocksdb/rocksdb/monitoring/{statistics.h → statistics_impl.h} +0 -0
  319. /package/deps/rocksdb/rocksdb/table/block_based/{flush_block_policy.h → flush_block_policy_impl.h} +0 -0
  320. /package/deps/rocksdb/rocksdb/util/{rate_limiter.h → rate_limiter_impl.h} +0 -0
  321. /package/deps/rocksdb/rocksdb/utilities/agg_merge/{agg_merge.h → agg_merge_impl.h} +0 -0
@@ -31,8 +31,7 @@ class BatchedOpsStressTest : public StressTest {
31
31
 
32
32
  const std::string key_body = Key(rand_keys[0]);
33
33
 
34
- const uint32_t value_base =
35
- thread->rand.Next() % thread->shared->UNKNOWN_SENTINEL;
34
+ const uint32_t value_base = thread->rand.Next();
36
35
  const size_t sz = GenerateValue(value_base, value, sizeof(value));
37
36
  const std::string value_body = Slice(value, sz).ToString();
38
37
 
@@ -308,34 +307,10 @@ class BatchedOpsStressTest : public StressTest {
308
307
  }
309
308
  }
310
309
 
311
- // Compare columns ignoring the last character of column values
312
- auto compare = [](const WideColumns& lhs, const WideColumns& rhs) {
313
- if (lhs.size() != rhs.size()) {
314
- return false;
315
- }
316
-
317
- for (size_t i = 0; i < lhs.size(); ++i) {
318
- if (lhs[i].name() != rhs[i].name()) {
319
- return false;
320
- }
321
-
322
- if (lhs[i].value().size() != rhs[i].value().size()) {
323
- return false;
324
- }
325
-
326
- if (lhs[i].value().difference_offset(rhs[i].value()) <
327
- lhs[i].value().size() - 1) {
328
- return false;
329
- }
330
- }
331
-
332
- return true;
333
- };
334
-
335
310
  for (size_t i = 0; i < num_keys; ++i) {
336
311
  const WideColumns& columns = results[i].columns();
337
312
 
338
- if (!compare(results[0].columns(), columns)) {
313
+ if (!CompareColumns(results[0].columns(), columns)) {
339
314
  fprintf(stderr,
340
315
  "GetEntity error: inconsistent entities for key %s: %s, %s\n",
341
316
  StringToHex(key_suffix).c_str(),
@@ -372,6 +347,99 @@ class BatchedOpsStressTest : public StressTest {
372
347
  }
373
348
  }
374
349
 
350
+ void TestMultiGetEntity(ThreadState* thread, const ReadOptions& read_opts,
351
+ const std::vector<int>& rand_column_families,
352
+ const std::vector<int64_t>& rand_keys) override {
353
+ assert(thread);
354
+
355
+ assert(!rand_column_families.empty());
356
+ assert(rand_column_families[0] >= 0);
357
+ assert(rand_column_families[0] < static_cast<int>(column_families_.size()));
358
+
359
+ ColumnFamilyHandle* const cfh = column_families_[rand_column_families[0]];
360
+ assert(cfh);
361
+
362
+ assert(!rand_keys.empty());
363
+
364
+ ManagedSnapshot snapshot_guard(db_);
365
+
366
+ ReadOptions read_opts_copy(read_opts);
367
+ read_opts_copy.snapshot = snapshot_guard.snapshot();
368
+
369
+ const size_t num_keys = rand_keys.size();
370
+
371
+ for (size_t i = 0; i < num_keys; ++i) {
372
+ const std::string key_suffix = Key(rand_keys[i]);
373
+
374
+ constexpr size_t num_prefixes = 10;
375
+
376
+ std::array<std::string, num_prefixes> keys;
377
+ std::array<Slice, num_prefixes> key_slices;
378
+ std::array<PinnableWideColumns, num_prefixes> results;
379
+ std::array<Status, num_prefixes> statuses;
380
+
381
+ for (size_t j = 0; j < num_prefixes; ++j) {
382
+ keys[j] = std::to_string(j) + key_suffix;
383
+ key_slices[j] = keys[j];
384
+ }
385
+
386
+ db_->MultiGetEntity(read_opts_copy, cfh, num_prefixes, key_slices.data(),
387
+ results.data(), statuses.data());
388
+
389
+ for (size_t j = 0; j < num_prefixes; ++j) {
390
+ const Status& s = statuses[j];
391
+
392
+ if (!s.ok() && !s.IsNotFound()) {
393
+ fprintf(stderr, "MultiGetEntity error: %s\n", s.ToString().c_str());
394
+ thread->stats.AddErrors(1);
395
+ } else if (s.IsNotFound()) {
396
+ thread->stats.AddGets(1, 0);
397
+ } else {
398
+ thread->stats.AddGets(1, 1);
399
+ }
400
+
401
+ const WideColumns& cmp_columns = results[0].columns();
402
+ const WideColumns& columns = results[j].columns();
403
+
404
+ if (!CompareColumns(cmp_columns, columns)) {
405
+ fprintf(stderr,
406
+ "MultiGetEntity error: inconsistent entities for key %s: %s, "
407
+ "%s\n",
408
+ StringToHex(key_suffix).c_str(),
409
+ WideColumnsToHex(cmp_columns).c_str(),
410
+ WideColumnsToHex(columns).c_str());
411
+ }
412
+
413
+ if (!columns.empty()) {
414
+ // The last character of each column value should be 'j' as a decimal
415
+ // digit
416
+ const char expected = static_cast<char>('0' + j);
417
+
418
+ for (const auto& column : columns) {
419
+ const Slice& value = column.value();
420
+
421
+ if (value.empty() || value[value.size() - 1] != expected) {
422
+ fprintf(stderr,
423
+ "MultiGetEntity error: incorrect column value for key "
424
+ "%s, entity %s, column value %s, expected %c\n",
425
+ StringToHex(key_suffix).c_str(),
426
+ WideColumnsToHex(columns).c_str(),
427
+ value.ToString(/* hex */ true).c_str(), expected);
428
+ }
429
+ }
430
+
431
+ if (!VerifyWideColumns(columns)) {
432
+ fprintf(stderr,
433
+ "MultiGetEntity error: inconsistent columns for key %s, "
434
+ "entity %s\n",
435
+ StringToHex(key_suffix).c_str(),
436
+ WideColumnsToHex(columns).c_str());
437
+ }
438
+ }
439
+ }
440
+ }
441
+ }
442
+
375
443
  // Given a key, this does prefix scans for "0"+P, "1"+P, ..., "9"+P
376
444
  // in the same snapshot where P is the first FLAGS_prefix_size - 1 bytes
377
445
  // of the key. Each of these 10 scans returns a series of values;
@@ -493,6 +561,30 @@ class BatchedOpsStressTest : public StressTest {
493
561
  void VerifyDb(ThreadState* /* thread */) const override {}
494
562
 
495
563
  void ContinuouslyVerifyDb(ThreadState* /* thread */) const override {}
564
+
565
+ // Compare columns ignoring the last character of column values
566
+ bool CompareColumns(const WideColumns& lhs, const WideColumns& rhs) {
567
+ if (lhs.size() != rhs.size()) {
568
+ return false;
569
+ }
570
+
571
+ for (size_t i = 0; i < lhs.size(); ++i) {
572
+ if (lhs[i].name() != rhs[i].name()) {
573
+ return false;
574
+ }
575
+
576
+ if (lhs[i].value().size() != rhs[i].value().size()) {
577
+ return false;
578
+ }
579
+
580
+ if (lhs[i].value().difference_offset(rhs[i].value()) <
581
+ lhs[i].value().size() - 1) {
582
+ return false;
583
+ }
584
+ }
585
+
586
+ return true;
587
+ }
496
588
  };
497
589
 
498
590
  StressTest* CreateBatchedOpsStressTest() { return new BatchedOpsStressTest(); }
@@ -391,6 +391,129 @@ class CfConsistencyStressTest : public StressTest {
391
391
  }
392
392
  }
393
393
 
394
+ void TestMultiGetEntity(ThreadState* thread, const ReadOptions& read_opts,
395
+ const std::vector<int>& rand_column_families,
396
+ const std::vector<int64_t>& rand_keys) override {
397
+ assert(thread);
398
+ assert(thread->shared);
399
+ assert(!rand_column_families.empty());
400
+ assert(!rand_keys.empty());
401
+
402
+ ManagedSnapshot snapshot_guard(db_);
403
+
404
+ ReadOptions read_opts_copy = read_opts;
405
+ read_opts_copy.snapshot = snapshot_guard.snapshot();
406
+
407
+ const size_t num_cfs = rand_column_families.size();
408
+
409
+ std::vector<ColumnFamilyHandle*> cfhs;
410
+ cfhs.reserve(num_cfs);
411
+
412
+ for (size_t j = 0; j < num_cfs; ++j) {
413
+ assert(rand_column_families[j] >= 0);
414
+ assert(rand_column_families[j] <
415
+ static_cast<int>(column_families_.size()));
416
+
417
+ ColumnFamilyHandle* const cfh = column_families_[rand_column_families[j]];
418
+ assert(cfh);
419
+
420
+ cfhs.emplace_back(cfh);
421
+ }
422
+
423
+ const size_t num_keys = rand_keys.size();
424
+
425
+ for (size_t i = 0; i < num_keys; ++i) {
426
+ const std::string key = Key(rand_keys[i]);
427
+
428
+ std::vector<Slice> key_slices(num_cfs, key);
429
+ std::vector<PinnableWideColumns> results(num_cfs);
430
+ std::vector<Status> statuses(num_cfs);
431
+
432
+ db_->MultiGetEntity(read_opts_copy, num_cfs, cfhs.data(),
433
+ key_slices.data(), results.data(), statuses.data());
434
+
435
+ bool is_consistent = true;
436
+
437
+ for (size_t j = 0; j < num_cfs; ++j) {
438
+ const Status& s = statuses[j];
439
+ const Status& cmp_s = statuses[0];
440
+ const WideColumns& columns = results[j].columns();
441
+ const WideColumns& cmp_columns = results[0].columns();
442
+
443
+ if (!s.ok() && !s.IsNotFound()) {
444
+ fprintf(stderr, "TestMultiGetEntity error: %s\n",
445
+ s.ToString().c_str());
446
+ thread->stats.AddErrors(1);
447
+ break;
448
+ }
449
+
450
+ assert(cmp_s.ok() || cmp_s.IsNotFound());
451
+
452
+ if (s.IsNotFound()) {
453
+ if (cmp_s.ok()) {
454
+ fprintf(
455
+ stderr,
456
+ "MultiGetEntity returns different results for key %s: CF %s "
457
+ "returns entity %s, CF %s returns not found\n",
458
+ StringToHex(key).c_str(), column_family_names_[0].c_str(),
459
+ WideColumnsToHex(cmp_columns).c_str(),
460
+ column_family_names_[j].c_str());
461
+ is_consistent = false;
462
+ break;
463
+ }
464
+
465
+ continue;
466
+ }
467
+
468
+ assert(s.ok());
469
+ if (cmp_s.IsNotFound()) {
470
+ fprintf(stderr,
471
+ "MultiGetEntity returns different results for key %s: CF %s "
472
+ "returns not found, CF %s returns entity %s\n",
473
+ StringToHex(key).c_str(), column_family_names_[0].c_str(),
474
+ column_family_names_[j].c_str(),
475
+ WideColumnsToHex(columns).c_str());
476
+ is_consistent = false;
477
+ break;
478
+ }
479
+
480
+ if (columns != cmp_columns) {
481
+ fprintf(stderr,
482
+ "MultiGetEntity returns different results for key %s: CF %s "
483
+ "returns entity %s, CF %s returns entity %s\n",
484
+ StringToHex(key).c_str(), column_family_names_[0].c_str(),
485
+ WideColumnsToHex(cmp_columns).c_str(),
486
+ column_family_names_[j].c_str(),
487
+ WideColumnsToHex(columns).c_str());
488
+ is_consistent = false;
489
+ break;
490
+ }
491
+
492
+ if (!VerifyWideColumns(columns)) {
493
+ fprintf(stderr,
494
+ "MultiGetEntity error: inconsistent columns for key %s, "
495
+ "entity %s\n",
496
+ StringToHex(key).c_str(), WideColumnsToHex(columns).c_str());
497
+ is_consistent = false;
498
+ break;
499
+ }
500
+ }
501
+
502
+ if (!is_consistent) {
503
+ fprintf(stderr,
504
+ "TestMultiGetEntity error: results are not consistent\n");
505
+ thread->stats.AddErrors(1);
506
+ // Fail fast to preserve the DB state.
507
+ thread->shared->SetVerificationFailure();
508
+ break;
509
+ } else if (statuses[0].ok()) {
510
+ thread->stats.AddGets(1, 1);
511
+ } else if (statuses[0].IsNotFound()) {
512
+ thread->stats.AddGets(1, 0);
513
+ }
514
+ }
515
+ }
516
+
394
517
  Status TestPrefixScan(ThreadState* thread, const ReadOptions& readoptions,
395
518
  const std::vector<int>& rand_column_families,
396
519
  const std::vector<int64_t>& rand_keys) override {
@@ -214,6 +214,7 @@ DECLARE_uint64(snapshot_hold_ops);
214
214
  DECLARE_bool(long_running_snapshots);
215
215
  DECLARE_bool(use_multiget);
216
216
  DECLARE_bool(use_get_entity);
217
+ DECLARE_bool(use_multi_get_entity);
217
218
  DECLARE_int32(readpercent);
218
219
  DECLARE_int32(prefixpercent);
219
220
  DECLARE_int32(writepercent);
@@ -289,6 +290,7 @@ DECLARE_bool(paranoid_file_checks);
289
290
  DECLARE_bool(fail_if_options_file_error);
290
291
  DECLARE_uint64(batch_protection_bytes_per_key);
291
292
  DECLARE_uint32(memtable_protection_bytes_per_key);
293
+ DECLARE_uint32(block_protection_bytes_per_key);
292
294
 
293
295
  DECLARE_uint64(user_timestamp_size);
294
296
  DECLARE_string(secondary_cache_uri);
@@ -310,6 +312,8 @@ DECLARE_int32(create_timestamped_snapshot_one_in);
310
312
 
311
313
  DECLARE_bool(allow_data_in_errors);
312
314
 
315
+ DECLARE_bool(enable_thread_tracking);
316
+
313
317
  // Tiered storage
314
318
  DECLARE_bool(enable_tiered_storage); // set last_level_temperature
315
319
  DECLARE_int64(preclude_last_level_data_seconds);
@@ -55,8 +55,7 @@ void ThreadBody(void* v) {
55
55
  }
56
56
  }
57
57
  }
58
-
59
- bool RunStressTest(SharedState* shared) {
58
+ bool RunStressTestImpl(SharedState* shared) {
60
59
  SystemClock* clock = db_stress_env->GetSystemClock().get();
61
60
  StressTest* stress = shared->GetStressTest();
62
61
 
@@ -207,5 +206,11 @@ bool RunStressTest(SharedState* shared) {
207
206
  }
208
207
  return true;
209
208
  }
209
+ bool RunStressTest(SharedState* shared) {
210
+ ThreadStatusUtil::RegisterThread(db_stress_env, ThreadStatus::USER);
211
+ bool result = RunStressTestImpl(shared);
212
+ ThreadStatusUtil::UnregisterThread();
213
+ return result;
214
+ }
210
215
  } // namespace ROCKSDB_NAMESPACE
211
216
  #endif // GFLAGS
@@ -10,8 +10,30 @@
10
10
  #ifdef GFLAGS
11
11
  #pragma once
12
12
  #include "db_stress_tool/db_stress_common.h"
13
+ #include "monitoring/thread_status_util.h"
13
14
 
14
15
  namespace ROCKSDB_NAMESPACE {
16
+ class DbStressRandomAccessFileWrapper : public FSRandomAccessFileOwnerWrapper {
17
+ public:
18
+ explicit DbStressRandomAccessFileWrapper(
19
+ std::unique_ptr<FSRandomAccessFile>&& target)
20
+ : FSRandomAccessFileOwnerWrapper(std::move(target)) {}
21
+
22
+ IOStatus Read(uint64_t offset, size_t n, const IOOptions& options,
23
+ Slice* result, char* scratch,
24
+ IODebugContext* dbg) const override {
25
+ #ifndef NDEBUG
26
+ const ThreadStatus::OperationType thread_op =
27
+ ThreadStatusUtil::GetThreadOperation();
28
+ Env::IOActivity io_activity =
29
+ ThreadStatusUtil::TEST_GetExpectedIOActivity(thread_op);
30
+ assert(io_activity == Env::IOActivity::kUnknown ||
31
+ io_activity == options.io_activity);
32
+ #endif
33
+ return target()->Read(offset, n, options, result, scratch, dbg);
34
+ }
35
+ };
36
+
15
37
  class DbStressFSWrapper : public FileSystemWrapper {
16
38
  public:
17
39
  explicit DbStressFSWrapper(const std::shared_ptr<FileSystem>& t)
@@ -19,6 +41,18 @@ class DbStressFSWrapper : public FileSystemWrapper {
19
41
  static const char* kClassName() { return "DbStressFS"; }
20
42
  const char* Name() const override { return kClassName(); }
21
43
 
44
+ IOStatus NewRandomAccessFile(const std::string& f,
45
+ const FileOptions& file_opts,
46
+ std::unique_ptr<FSRandomAccessFile>* r,
47
+ IODebugContext* dbg) override {
48
+ std::unique_ptr<FSRandomAccessFile> file;
49
+ IOStatus s = target()->NewRandomAccessFile(f, file_opts, &file, dbg);
50
+ if (s.ok()) {
51
+ r->reset(new DbStressRandomAccessFileWrapper(std::move(file)));
52
+ }
53
+ return s;
54
+ }
55
+
22
56
  IOStatus DeleteFile(const std::string& f, const IOOptions& opts,
23
57
  IODebugContext* dbg) override {
24
58
  // We determine whether it is a manifest file by searching a strong,
@@ -749,6 +749,9 @@ DEFINE_bool(use_multiget, false,
749
749
 
750
750
  DEFINE_bool(use_get_entity, false, "If set, use the GetEntity API for reads");
751
751
 
752
+ DEFINE_bool(use_multi_get_entity, false,
753
+ "If set, use the MultiGetEntity API for reads");
754
+
752
755
  static bool ValidateInt32Percent(const char* flagname, int32_t value) {
753
756
  if (value < 0 || value > 100) {
754
757
  fprintf(stderr, "Invalid value for --%s: %d, 0<= pct <=100 \n", flagname,
@@ -972,6 +975,11 @@ DEFINE_uint32(
972
975
  "specified number of bytes per key. Currently the supported "
973
976
  "nonzero values are 1, 2, 4 and 8.");
974
977
 
978
+ DEFINE_uint32(block_protection_bytes_per_key, 0,
979
+ "If nonzero, enables integrity protection in blocks at the "
980
+ "specified number of bytes per key. Currently the supported "
981
+ "nonzero values are 1, 2, 4 and 8.");
982
+
975
983
  DEFINE_string(file_checksum_impl, "none",
976
984
  "Name of an implementation for file_checksum_gen_factory, or "
977
985
  "\"none\" for null.");
@@ -1048,6 +1056,11 @@ DEFINE_bool(allow_data_in_errors,
1048
1056
  ROCKSDB_NAMESPACE::Options().allow_data_in_errors,
1049
1057
  "If true, allow logging data, e.g. key, value in LOG files.");
1050
1058
 
1059
+ DEFINE_bool(enable_thread_tracking,
1060
+ ROCKSDB_NAMESPACE::Options().enable_thread_tracking,
1061
+ "If true, the status of the threads involved in this DB will be "
1062
+ "tracked and available via GetThreadList() API.");
1063
+
1051
1064
  DEFINE_int32(verify_iterator_with_expected_state_one_in, 0,
1052
1065
  "If non-zero, when TestIterate() is to be called, there is a "
1053
1066
  "1/verify_iterator_with_expected_state_one_in "
@@ -43,12 +43,6 @@ class StressTest;
43
43
  // State shared by all concurrent executions of the same benchmark.
44
44
  class SharedState {
45
45
  public:
46
- // indicates a key may have any value (or not be present) as an operation on
47
- // it is incomplete.
48
- static constexpr uint32_t UNKNOWN_SENTINEL = 0xfffffffe;
49
- // indicates a key should definitely be deleted
50
- static constexpr uint32_t DELETION_SENTINEL = 0xffffffff;
51
-
52
46
  // Errors when reading filter blocks are ignored, so we use a thread
53
47
  // local variable updated via sync points to keep track of errors injected
54
48
  // while reading filter blocks in order to ignore the Get/MultiGet result
@@ -254,54 +248,70 @@ class SharedState {
254
248
  return expected_state_manager_->ClearColumnFamily(cf);
255
249
  }
256
250
 
257
- // @param pending True if the update may have started but is not yet
258
- // guaranteed finished. This is useful for crash-recovery testing when the
259
- // process may crash before updating the expected values array.
251
+ // Prepare a Put that will be started but not finish yet
252
+ // This is useful for crash-recovery testing when the process may crash
253
+ // before updating the corresponding expected value
260
254
  //
261
- // Requires external locking covering `key` in `cf`.
262
- void Put(int cf, int64_t key, uint32_t value_base, bool pending) {
263
- return expected_state_manager_->Put(cf, key, value_base, pending);
255
+ // Requires external locking covering `key` in `cf` to prevent concurrent
256
+ // write or delete to the same `key`.
257
+ PendingExpectedValue PreparePut(int cf, int64_t key) {
258
+ return expected_state_manager_->PreparePut(cf, key);
264
259
  }
265
260
 
266
- // Requires external locking covering `key` in `cf`.
267
- uint32_t Get(int cf, int64_t key) const {
261
+ // Does not requires external locking.
262
+ ExpectedValue Get(int cf, int64_t key) {
268
263
  return expected_state_manager_->Get(cf, key);
269
264
  }
270
265
 
271
- // @param pending See comment above Put()
272
- // Returns true if the key was not yet deleted.
266
+ // Prepare a Delete that will be started but not finish yet
267
+ // This is useful for crash-recovery testing when the process may crash
268
+ // before updating the corresponding expected value
273
269
  //
274
- // Requires external locking covering `key` in `cf`.
275
- bool Delete(int cf, int64_t key, bool pending) {
276
- return expected_state_manager_->Delete(cf, key, pending);
270
+ // Requires external locking covering `key` in `cf` to prevent concurrent
271
+ // write or delete to the same `key`.
272
+ PendingExpectedValue PrepareDelete(int cf, int64_t key) {
273
+ return expected_state_manager_->PrepareDelete(cf, key);
277
274
  }
278
275
 
279
- // @param pending See comment above Put()
280
- // Returns true if the key was not yet deleted.
281
- //
282
- // Requires external locking covering `key` in `cf`.
283
- bool SingleDelete(int cf, int64_t key, bool pending) {
284
- return expected_state_manager_->Delete(cf, key, pending);
276
+ // Requires external locking covering `key` in `cf` to prevent concurrent
277
+ // write or delete to the same `key`.
278
+ PendingExpectedValue PrepareSingleDelete(int cf, int64_t key) {
279
+ return expected_state_manager_->PrepareSingleDelete(cf, key);
285
280
  }
286
281
 
287
- // @param pending See comment above Put()
288
- // Returns number of keys deleted by the call.
289
- //
290
- // Requires external locking covering keys in `[begin_key, end_key)` in `cf`.
291
- int DeleteRange(int cf, int64_t begin_key, int64_t end_key, bool pending) {
292
- return expected_state_manager_->DeleteRange(cf, begin_key, end_key,
293
- pending);
282
+ // Requires external locking covering keys in `[begin_key, end_key)` in `cf`
283
+ // to prevent concurrent write or delete to the same `key`.
284
+ std::vector<PendingExpectedValue> PrepareDeleteRange(int cf,
285
+ int64_t begin_key,
286
+ int64_t end_key) {
287
+ return expected_state_manager_->PrepareDeleteRange(cf, begin_key, end_key);
294
288
  }
295
289
 
296
290
  bool AllowsOverwrite(int64_t key) const {
297
291
  return no_overwrite_ids_.find(key) == no_overwrite_ids_.end();
298
292
  }
299
293
 
300
- // Requires external locking covering `key` in `cf`.
294
+ // Requires external locking covering `key` in `cf` to prevent concurrent
295
+ // delete to the same `key`.
301
296
  bool Exists(int cf, int64_t key) {
302
297
  return expected_state_manager_->Exists(cf, key);
303
298
  }
304
299
 
300
+ // Sync the `value_base` to the corresponding expected value
301
+ void SyncPut(int cf, int64_t key, uint32_t value_base) {
302
+ return expected_state_manager_->SyncPut(cf, key, value_base);
303
+ }
304
+
305
+ // Sync the corresponding expected value to be pending Put
306
+ void SyncPendingPut(int cf, int64_t key) {
307
+ return expected_state_manager_->SyncPendingPut(cf, key);
308
+ }
309
+
310
+ // Sync the corresponding expected value to be deleted
311
+ void SyncDelete(int cf, int64_t key) {
312
+ return expected_state_manager_->SyncDelete(cf, key);
313
+ }
314
+
305
315
  uint32_t GetSeed() const { return seed_; }
306
316
 
307
317
  void SetShouldStopBgThread() { should_stop_bg_thread_ = true; }
@@ -483,12 +483,13 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
483
483
  for (int64_t k = 0; k != number_of_keys; ++k) {
484
484
  const std::string key = Key(k);
485
485
 
486
- constexpr uint32_t value_base = 0;
486
+ PendingExpectedValue pending_expected_value =
487
+ shared->PreparePut(cf_idx, k);
488
+ const uint32_t value_base = pending_expected_value.GetFinalValueBase();
487
489
  const size_t sz = GenerateValue(value_base, value, sizeof(value));
488
490
 
489
491
  const Slice v(value, sz);
490
492
 
491
- shared->Put(cf_idx, k, value_base, true /* pending */);
492
493
 
493
494
  std::string ts;
494
495
  if (FLAGS_user_timestamp_size > 0) {
@@ -534,7 +535,7 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
534
535
  }
535
536
  }
536
537
 
537
- shared->Put(cf_idx, k, value_base, false /* pending */);
538
+ pending_expected_value.Commit();
538
539
  if (!s.ok()) {
539
540
  break;
540
541
  }
@@ -614,8 +615,7 @@ void StressTest::ProcessRecoveredPreparedTxnsHelper(Transaction* txn,
614
615
  for (wbwi_iter->SeekToFirst(); wbwi_iter->Valid(); wbwi_iter->Next()) {
615
616
  uint64_t key_val;
616
617
  if (GetIntVal(wbwi_iter->Entry().key.ToString(), &key_val)) {
617
- shared->Put(static_cast<int>(i) /* cf_idx */, key_val,
618
- 0 /* value_base */, true /* pending */);
618
+ shared->SyncPendingPut(static_cast<int>(i) /* cf_idx */, key_val);
619
619
  }
620
620
  }
621
621
  }
@@ -985,7 +985,22 @@ void StressTest::OperateDb(ThreadState* thread) {
985
985
  if (prob_op >= 0 && prob_op < static_cast<int>(FLAGS_readpercent)) {
986
986
  assert(0 <= prob_op);
987
987
  // OPERATION read
988
- if (FLAGS_use_get_entity) {
988
+ if (FLAGS_use_multi_get_entity) {
989
+ constexpr uint64_t max_batch_size = 64;
990
+ const uint64_t batch_size = std::min(
991
+ static_cast<uint64_t>(thread->rand.Uniform(max_batch_size)) + 1,
992
+ ops_per_open - i);
993
+ assert(batch_size >= 1);
994
+ assert(batch_size <= max_batch_size);
995
+ assert(i + batch_size <= ops_per_open);
996
+
997
+ rand_keys = GenerateNKeys(thread, static_cast<int>(batch_size), i);
998
+
999
+ TestMultiGetEntity(thread, read_opts, rand_column_families,
1000
+ rand_keys);
1001
+
1002
+ i += batch_size - 1;
1003
+ } else if (FLAGS_use_get_entity) {
989
1004
  TestGetEntity(thread, read_opts, rand_column_families, rand_keys);
990
1005
  } else if (FLAGS_use_multiget) {
991
1006
  // Leave room for one more iteration of the loop with a single key
@@ -1820,19 +1835,11 @@ Status StressTest::TestCheckpoint(ThreadState* thread,
1820
1835
  Options tmp_opts(options_);
1821
1836
  tmp_opts.listeners.clear();
1822
1837
  tmp_opts.env = db_stress_env;
1838
+ // Avoid delayed deletion so whole directory can be deleted
1839
+ tmp_opts.sst_file_manager.reset();
1823
1840
 
1824
1841
  DestroyDB(checkpoint_dir, tmp_opts);
1825
1842
 
1826
- if (db_stress_env->FileExists(checkpoint_dir).ok()) {
1827
- // If the directory might still exist, try to delete the files one by one.
1828
- // Likely a trash file is still there.
1829
- Status my_s = DestroyDir(db_stress_env, checkpoint_dir);
1830
- if (!my_s.ok()) {
1831
- fprintf(stderr, "Fail to destory directory before checkpoint: %s",
1832
- my_s.ToString().c_str());
1833
- }
1834
- }
1835
-
1836
1843
  Checkpoint* checkpoint = nullptr;
1837
1844
  Status s = Checkpoint::Create(db_, &checkpoint);
1838
1845
  if (s.ok()) {
@@ -2387,6 +2394,8 @@ void StressTest::PrintEnv() const {
2387
2394
  FLAGS_use_multiget ? "true" : "false");
2388
2395
  fprintf(stdout, "Use GetEntity : %s\n",
2389
2396
  FLAGS_use_get_entity ? "true" : "false");
2397
+ fprintf(stdout, "Use MultiGetEntity : %s\n",
2398
+ FLAGS_use_multi_get_entity ? "true" : "false");
2390
2399
 
2391
2400
  const char* memtablerep = "";
2392
2401
  switch (FLAGS_rep_factory) {
@@ -2662,7 +2671,7 @@ void StressTest::Open(SharedState* shared) {
2662
2671
  // wait for all compactions to finish to make sure DB is in
2663
2672
  // clean state before executing queries.
2664
2673
  s = static_cast_with_check<DBImpl>(db_->GetRootDB())
2665
- ->WaitForCompact(true /* wait_unscheduled */);
2674
+ ->WaitForCompact();
2666
2675
  if (!s.ok()) {
2667
2676
  for (auto cf : column_families_) {
2668
2677
  delete cf;
@@ -3113,6 +3122,7 @@ void InitializeOptionsFromFlags(
3113
3122
  FLAGS_verify_sst_unique_id_in_manifest;
3114
3123
  options.memtable_protection_bytes_per_key =
3115
3124
  FLAGS_memtable_protection_bytes_per_key;
3125
+ options.block_protection_bytes_per_key = FLAGS_block_protection_bytes_per_key;
3116
3126
 
3117
3127
  // Integrated BlobDB
3118
3128
  options.enable_blob_files = FLAGS_enable_blob_files;
@@ -3198,6 +3208,8 @@ void InitializeOptionsFromFlags(
3198
3208
  }
3199
3209
 
3200
3210
  options.allow_data_in_errors = FLAGS_allow_data_in_errors;
3211
+
3212
+ options.enable_thread_tracking = FLAGS_enable_thread_tracking;
3201
3213
  }
3202
3214
 
3203
3215
  void InitializeOptionsGeneral(
@@ -98,6 +98,11 @@ class StressTest {
98
98
  const std::vector<int>& rand_column_families,
99
99
  const std::vector<int64_t>& rand_keys) = 0;
100
100
 
101
+ virtual void TestMultiGetEntity(ThreadState* thread,
102
+ const ReadOptions& read_opts,
103
+ const std::vector<int>& rand_column_families,
104
+ const std::vector<int64_t>& rand_keys) = 0;
105
+
101
106
  virtual Status TestPrefixScan(ThreadState* thread,
102
107
  const ReadOptions& read_opts,
103
108
  const std::vector<int>& rand_column_families,