@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
@@ -7,6 +7,7 @@
7
7
  // Use of this source code is governed by a BSD-style license that can be
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
 
10
+ #include "db_stress_tool/expected_state.h"
10
11
  #ifdef GFLAGS
11
12
  #include "db_stress_tool/db_stress_common.h"
12
13
  #include "rocksdb/utilities/transaction_db.h"
@@ -121,8 +122,7 @@ class NonBatchedOpsStressTest : public StressTest {
121
122
  }
122
123
 
123
124
  VerifyOrSyncValue(static_cast<int>(cf), i, options, shared, from_db,
124
- /* msg_prefix */ "Iterator verification", s,
125
- /* strict */ true);
125
+ /* msg_prefix */ "Iterator verification", s);
126
126
 
127
127
  if (!from_db.empty()) {
128
128
  PrintKeyValue(static_cast<int>(cf), static_cast<uint32_t>(i),
@@ -141,8 +141,7 @@ class NonBatchedOpsStressTest : public StressTest {
141
141
  Status s = db_->Get(options, column_families_[cf], key, &from_db);
142
142
 
143
143
  VerifyOrSyncValue(static_cast<int>(cf), i, options, shared, from_db,
144
- /* msg_prefix */ "Get verification", s,
145
- /* strict */ true);
144
+ /* msg_prefix */ "Get verification", s);
146
145
 
147
146
  if (!from_db.empty()) {
148
147
  PrintKeyValue(static_cast<int>(cf), static_cast<uint32_t>(i),
@@ -178,8 +177,7 @@ class NonBatchedOpsStressTest : public StressTest {
178
177
  }
179
178
 
180
179
  VerifyOrSyncValue(static_cast<int>(cf), i, options, shared, from_db,
181
- /* msg_prefix */ "GetEntity verification", s,
182
- /* strict */ true);
180
+ /* msg_prefix */ "GetEntity verification", s);
183
181
 
184
182
  if (!from_db.empty()) {
185
183
  PrintKeyValue(static_cast<int>(cf), static_cast<uint32_t>(i),
@@ -214,7 +212,7 @@ class NonBatchedOpsStressTest : public StressTest {
214
212
 
215
213
  VerifyOrSyncValue(static_cast<int>(cf), i + j, options, shared,
216
214
  from_db, /* msg_prefix */ "MultiGet verification",
217
- statuses[j], /* strict */ true);
215
+ statuses[j]);
218
216
 
219
217
  if (!from_db.empty()) {
220
218
  PrintKeyValue(static_cast<int>(cf), static_cast<uint32_t>(i + j),
@@ -264,10 +262,9 @@ class NonBatchedOpsStressTest : public StressTest {
264
262
  }
265
263
  }
266
264
 
267
- VerifyOrSyncValue(static_cast<int>(cf), i + j, options, shared,
268
- from_db,
269
- /* msg_prefix */ "MultiGetEntity verification",
270
- statuses[j], /* strict */ true);
265
+ VerifyOrSyncValue(
266
+ static_cast<int>(cf), i + j, options, shared, from_db,
267
+ /* msg_prefix */ "MultiGetEntity verification", statuses[j]);
271
268
 
272
269
  if (!from_db.empty()) {
273
270
  PrintKeyValue(static_cast<int>(cf), static_cast<uint32_t>(i + j),
@@ -319,8 +316,8 @@ class NonBatchedOpsStressTest : public StressTest {
319
316
  }
320
317
 
321
318
  VerifyOrSyncValue(static_cast<int>(cf), i, options, shared, from_db,
322
- /* msg_prefix */ "GetMergeOperands verification", s,
323
- /* strict */ true);
319
+ /* msg_prefix */ "GetMergeOperands verification",
320
+ s);
324
321
 
325
322
  if (!from_db.empty()) {
326
323
  PrintKeyValue(static_cast<int>(cf), static_cast<uint32_t>(i),
@@ -479,9 +476,6 @@ class NonBatchedOpsStressTest : public StressTest {
479
476
  SharedState::ignore_read_error = false;
480
477
  }
481
478
 
482
- std::unique_ptr<MutexLock> lock(new MutexLock(
483
- thread->shared->GetMutexForKey(rand_column_families[0], rand_keys[0])));
484
-
485
479
  ReadOptions read_opts_copy = read_opts;
486
480
  std::string read_ts_str;
487
481
  Slice read_ts_slice;
@@ -493,7 +487,11 @@ class NonBatchedOpsStressTest : public StressTest {
493
487
  bool read_older_ts = MaybeUseOlderTimestampForPointLookup(
494
488
  thread, read_ts_str, read_ts_slice, read_opts_copy);
495
489
 
490
+ const ExpectedValue pre_read_expected_value =
491
+ thread->shared->Get(rand_column_families[0], rand_keys[0]);
496
492
  Status s = db_->Get(read_opts_copy, cfh, key, &from_db);
493
+ const ExpectedValue post_read_expected_value =
494
+ thread->shared->Get(rand_column_families[0], rand_keys[0]);
497
495
  if (fault_fs_guard) {
498
496
  error_count = fault_fs_guard->GetAndResetErrorCount();
499
497
  }
@@ -512,23 +510,35 @@ class NonBatchedOpsStressTest : public StressTest {
512
510
  // found case
513
511
  thread->stats.AddGets(1, 1);
514
512
  // we only have the latest expected state
515
- if (!FLAGS_skip_verifydb && !read_older_ts &&
516
- thread->shared->Get(rand_column_families[0], rand_keys[0]) ==
517
- SharedState::DELETION_SENTINEL) {
518
- thread->shared->SetVerificationFailure();
519
- fprintf(stderr,
520
- "error : inconsistent values for key %s: Get returns %s, "
521
- "expected state does not have the key.\n",
522
- key.ToString(true).c_str(), StringToHex(from_db).c_str());
513
+ if (!FLAGS_skip_verifydb && !read_older_ts) {
514
+ if (ExpectedValueHelper::MustHaveNotExisted(pre_read_expected_value,
515
+ post_read_expected_value)) {
516
+ thread->shared->SetVerificationFailure();
517
+ fprintf(stderr,
518
+ "error : inconsistent values for key %s: Get returns %s, "
519
+ "but expected state is \"deleted\".\n",
520
+ key.ToString(true).c_str(), StringToHex(from_db).c_str());
521
+ }
522
+ Slice from_db_slice(from_db);
523
+ uint32_t value_base_from_db = GetValueBase(from_db_slice);
524
+ if (!ExpectedValueHelper::InExpectedValueBaseRange(
525
+ value_base_from_db, pre_read_expected_value,
526
+ post_read_expected_value)) {
527
+ thread->shared->SetVerificationFailure();
528
+ fprintf(stderr,
529
+ "error : inconsistent values for key %s: Get returns %s with "
530
+ "value base %d that falls out of expected state's value base "
531
+ "range.\n",
532
+ key.ToString(true).c_str(), StringToHex(from_db).c_str(),
533
+ value_base_from_db);
534
+ }
523
535
  }
524
536
  } else if (s.IsNotFound()) {
525
537
  // not found case
526
538
  thread->stats.AddGets(1, 0);
527
539
  if (!FLAGS_skip_verifydb && !read_older_ts) {
528
- auto expected =
529
- thread->shared->Get(rand_column_families[0], rand_keys[0]);
530
- if (expected != SharedState::DELETION_SENTINEL &&
531
- expected != SharedState::UNKNOWN_SENTINEL) {
540
+ if (ExpectedValueHelper::MustHaveExisted(pre_read_expected_value,
541
+ post_read_expected_value)) {
532
542
  thread->shared->SetVerificationFailure();
533
543
  fprintf(stderr,
534
544
  "error : inconsistent values for key %s: expected state has "
@@ -611,8 +621,7 @@ class NonBatchedOpsStressTest : public StressTest {
611
621
  switch (op) {
612
622
  case 0:
613
623
  case 1: {
614
- uint32_t value_base =
615
- thread->rand.Next() % thread->shared->UNKNOWN_SENTINEL;
624
+ const uint32_t value_base = 0;
616
625
  char value[100];
617
626
  size_t sz = GenerateValue(value_base, value, sizeof(value));
618
627
  Slice v(value, sz);
@@ -803,15 +812,16 @@ class NonBatchedOpsStressTest : public StressTest {
803
812
 
804
813
  if (!FLAGS_skip_verifydb) {
805
814
  const WideColumns& columns = from_db.columns();
806
-
815
+ ExpectedValue expected =
816
+ shared->Get(rand_column_families[0], rand_keys[0]);
807
817
  if (!VerifyWideColumns(columns)) {
808
818
  shared->SetVerificationFailure();
809
819
  fprintf(stderr,
810
820
  "error : inconsistent columns returned by GetEntity for key "
811
821
  "%s: %s\n",
812
822
  StringToHex(key).c_str(), WideColumnsToHex(columns).c_str());
813
- } else if (shared->Get(rand_column_families[0], rand_keys[0]) ==
814
- SharedState::DELETION_SENTINEL) {
823
+ } else if (ExpectedValueHelper::MustHaveNotExisted(expected,
824
+ expected)) {
815
825
  shared->SetVerificationFailure();
816
826
  fprintf(
817
827
  stderr,
@@ -824,9 +834,9 @@ class NonBatchedOpsStressTest : public StressTest {
824
834
  thread->stats.AddGets(1, 0);
825
835
 
826
836
  if (!FLAGS_skip_verifydb) {
827
- auto expected = shared->Get(rand_column_families[0], rand_keys[0]);
828
- if (expected != SharedState::DELETION_SENTINEL &&
829
- expected != SharedState::UNKNOWN_SENTINEL) {
837
+ ExpectedValue expected =
838
+ shared->Get(rand_column_families[0], rand_keys[0]);
839
+ if (ExpectedValueHelper::MustHaveExisted(expected, expected)) {
830
840
  shared->SetVerificationFailure();
831
841
  fprintf(stderr,
832
842
  "error : inconsistent values for key %s: expected state has "
@@ -847,6 +857,157 @@ class NonBatchedOpsStressTest : public StressTest {
847
857
  }
848
858
  }
849
859
 
860
+ void TestMultiGetEntity(ThreadState* thread, const ReadOptions& read_opts,
861
+ const std::vector<int>& rand_column_families,
862
+ const std::vector<int64_t>& rand_keys) override {
863
+ assert(thread);
864
+
865
+ ManagedSnapshot snapshot_guard(db_);
866
+
867
+ ReadOptions read_opts_copy(read_opts);
868
+ read_opts_copy.snapshot = snapshot_guard.snapshot();
869
+
870
+ assert(!rand_column_families.empty());
871
+ assert(rand_column_families[0] >= 0);
872
+ assert(rand_column_families[0] < static_cast<int>(column_families_.size()));
873
+
874
+ ColumnFamilyHandle* const cfh = column_families_[rand_column_families[0]];
875
+ assert(cfh);
876
+
877
+ assert(!rand_keys.empty());
878
+
879
+ const size_t num_keys = rand_keys.size();
880
+
881
+ std::vector<std::string> keys(num_keys);
882
+ std::vector<Slice> key_slices(num_keys);
883
+
884
+ for (size_t i = 0; i < num_keys; ++i) {
885
+ keys[i] = Key(rand_keys[i]);
886
+ key_slices[i] = keys[i];
887
+ }
888
+
889
+ std::vector<PinnableWideColumns> results(num_keys);
890
+ std::vector<Status> statuses(num_keys);
891
+
892
+ if (fault_fs_guard) {
893
+ fault_fs_guard->EnableErrorInjection();
894
+ SharedState::ignore_read_error = false;
895
+ }
896
+
897
+ db_->MultiGetEntity(read_opts_copy, cfh, num_keys, key_slices.data(),
898
+ results.data(), statuses.data());
899
+
900
+ int error_count = 0;
901
+
902
+ if (fault_fs_guard) {
903
+ error_count = fault_fs_guard->GetAndResetErrorCount();
904
+
905
+ if (error_count && !SharedState::ignore_read_error) {
906
+ int stat_nok = 0;
907
+ for (const auto& s : statuses) {
908
+ if (!s.ok() && !s.IsNotFound()) {
909
+ stat_nok++;
910
+ }
911
+ }
912
+
913
+ if (stat_nok < error_count) {
914
+ // Grab mutex so multiple threads don't try to print the
915
+ // stack trace at the same time
916
+ assert(thread->shared);
917
+ MutexLock l(thread->shared->GetMutex());
918
+
919
+ fprintf(stderr, "Didn't get expected error from MultiGetEntity\n");
920
+ fprintf(stderr, "num_keys %zu Expected %d errors, seen %d\n",
921
+ num_keys, error_count, stat_nok);
922
+ fprintf(stderr, "Call stack that injected the fault\n");
923
+ fault_fs_guard->PrintFaultBacktrace();
924
+ std::terminate();
925
+ }
926
+ }
927
+
928
+ fault_fs_guard->DisableErrorInjection();
929
+ }
930
+
931
+ const bool check_get_entity = !error_count && thread->rand.OneIn(4);
932
+
933
+ for (size_t i = 0; i < num_keys; ++i) {
934
+ const Status& s = statuses[i];
935
+
936
+ bool is_consistent = true;
937
+
938
+ if (s.ok() && !VerifyWideColumns(results[i].columns())) {
939
+ fprintf(
940
+ stderr,
941
+ "error : inconsistent columns returned by MultiGetEntity for key "
942
+ "%s: %s\n",
943
+ StringToHex(keys[i]).c_str(),
944
+ WideColumnsToHex(results[i].columns()).c_str());
945
+ is_consistent = false;
946
+ } else if (check_get_entity && (s.ok() || s.IsNotFound())) {
947
+ PinnableWideColumns cmp_result;
948
+
949
+ const Status cmp_s =
950
+ db_->GetEntity(read_opts_copy, cfh, key_slices[i], &cmp_result);
951
+
952
+ if (!cmp_s.ok() && !cmp_s.IsNotFound()) {
953
+ fprintf(stderr, "GetEntity error: %s\n", cmp_s.ToString().c_str());
954
+ is_consistent = false;
955
+ } else if (cmp_s.IsNotFound()) {
956
+ if (s.ok()) {
957
+ fprintf(stderr,
958
+ "Inconsistent results for key %s: MultiGetEntity returned "
959
+ "ok, GetEntity returned not found\n",
960
+ StringToHex(keys[i]).c_str());
961
+ is_consistent = false;
962
+ }
963
+ } else {
964
+ assert(cmp_s.ok());
965
+
966
+ if (s.IsNotFound()) {
967
+ fprintf(stderr,
968
+ "Inconsistent results for key %s: MultiGetEntity returned "
969
+ "not found, GetEntity returned ok\n",
970
+ StringToHex(keys[i]).c_str());
971
+ is_consistent = false;
972
+ } else {
973
+ assert(s.ok());
974
+
975
+ if (results[i] != cmp_result) {
976
+ fprintf(
977
+ stderr,
978
+ "Inconsistent results for key %s: MultiGetEntity returned "
979
+ "%s, GetEntity returned %s\n",
980
+ StringToHex(keys[i]).c_str(),
981
+ WideColumnsToHex(results[i].columns()).c_str(),
982
+ WideColumnsToHex(cmp_result.columns()).c_str());
983
+ is_consistent = false;
984
+ }
985
+ }
986
+ }
987
+ }
988
+
989
+ if (!is_consistent) {
990
+ fprintf(stderr,
991
+ "TestMultiGetEntity error: results are not consistent\n");
992
+ thread->stats.AddErrors(1);
993
+ // Fail fast to preserve the DB state
994
+ thread->shared->SetVerificationFailure();
995
+ break;
996
+ } else if (s.ok()) {
997
+ thread->stats.AddGets(1, 1);
998
+ } else if (s.IsNotFound()) {
999
+ thread->stats.AddGets(1, 0);
1000
+ } else {
1001
+ if (error_count == 0) {
1002
+ fprintf(stderr, "MultiGetEntity error: %s\n", s.ToString().c_str());
1003
+ thread->stats.AddErrors(1);
1004
+ } else {
1005
+ thread->stats.AddVerifiedErrors(1);
1006
+ }
1007
+ }
1008
+ }
1009
+ }
1010
+
850
1011
  Status TestPrefixScan(ThreadState* thread, const ReadOptions& read_opts,
851
1012
  const std::vector<int>& rand_column_families,
852
1013
  const std::vector<int64_t>& rand_keys) override {
@@ -982,16 +1143,17 @@ class NonBatchedOpsStressTest : public StressTest {
982
1143
  Status s = db_->Get(read_opts, cfh, k, &from_db);
983
1144
  if (!VerifyOrSyncValue(rand_column_family, rand_key, read_opts, shared,
984
1145
  /* msg_prefix */ "Pre-Put Get verification",
985
- from_db, s, /* strict */ true)) {
1146
+ from_db, s)) {
986
1147
  return s;
987
1148
  }
988
1149
  }
989
1150
 
990
- const uint32_t value_base = thread->rand.Next() % shared->UNKNOWN_SENTINEL;
1151
+ PendingExpectedValue pending_expected_value =
1152
+ shared->PreparePut(rand_column_family, rand_key);
1153
+ const uint32_t value_base = pending_expected_value.GetFinalValueBase();
991
1154
  const size_t sz = GenerateValue(value_base, value, sizeof(value));
992
1155
  const Slice v(value, sz);
993
1156
 
994
- shared->Put(rand_column_family, rand_key, value_base, true /* pending */);
995
1157
 
996
1158
  Status s;
997
1159
 
@@ -1035,7 +1197,7 @@ class NonBatchedOpsStressTest : public StressTest {
1035
1197
  }
1036
1198
  }
1037
1199
 
1038
- shared->Put(rand_column_family, rand_key, value_base, false /* pending */);
1200
+ pending_expected_value.Commit();
1039
1201
 
1040
1202
  if (!s.ok()) {
1041
1203
  if (FLAGS_injest_error_severity >= 2) {
@@ -1080,7 +1242,8 @@ class NonBatchedOpsStressTest : public StressTest {
1080
1242
  // otherwise.
1081
1243
  Status s;
1082
1244
  if (shared->AllowsOverwrite(rand_key)) {
1083
- shared->Delete(rand_column_family, rand_key, true /* pending */);
1245
+ PendingExpectedValue pending_expected_value =
1246
+ shared->PrepareDelete(rand_column_family, rand_key);
1084
1247
  if (!FLAGS_use_txn) {
1085
1248
  if (FLAGS_user_timestamp_size == 0) {
1086
1249
  s = db_->Delete(write_opts, cfh, key);
@@ -1097,7 +1260,8 @@ class NonBatchedOpsStressTest : public StressTest {
1097
1260
  }
1098
1261
  }
1099
1262
  }
1100
- shared->Delete(rand_column_family, rand_key, false /* pending */);
1263
+ pending_expected_value.Commit();
1264
+
1101
1265
  thread->stats.AddDeletes(1);
1102
1266
  if (!s.ok()) {
1103
1267
  if (FLAGS_injest_error_severity >= 2) {
@@ -1115,7 +1279,8 @@ class NonBatchedOpsStressTest : public StressTest {
1115
1279
  }
1116
1280
  }
1117
1281
  } else {
1118
- shared->SingleDelete(rand_column_family, rand_key, true /* pending */);
1282
+ PendingExpectedValue pending_expected_value =
1283
+ shared->PrepareSingleDelete(rand_column_family, rand_key);
1119
1284
  if (!FLAGS_use_txn) {
1120
1285
  if (FLAGS_user_timestamp_size == 0) {
1121
1286
  s = db_->SingleDelete(write_opts, cfh, key);
@@ -1132,7 +1297,7 @@ class NonBatchedOpsStressTest : public StressTest {
1132
1297
  }
1133
1298
  }
1134
1299
  }
1135
- shared->SingleDelete(rand_column_family, rand_key, false /* pending */);
1300
+ pending_expected_value.Commit();
1136
1301
  thread->stats.AddSingleDeletes(1);
1137
1302
  if (!s.ok()) {
1138
1303
  if (FLAGS_injest_error_severity >= 2) {
@@ -1177,10 +1342,10 @@ class NonBatchedOpsStressTest : public StressTest {
1177
1342
  shared->GetMutexForKey(rand_column_family, rand_key + j)));
1178
1343
  }
1179
1344
  }
1180
- shared->DeleteRange(rand_column_family, rand_key,
1181
- rand_key + FLAGS_range_deletion_width,
1182
- true /* pending */);
1183
-
1345
+ std::vector<PendingExpectedValue> pending_expected_values =
1346
+ shared->PrepareDeleteRange(rand_column_family, rand_key,
1347
+ rand_key + FLAGS_range_deletion_width);
1348
+ const int covered = static_cast<int>(pending_expected_values.size());
1184
1349
  std::string keystr = Key(rand_key);
1185
1350
  Slice key = keystr;
1186
1351
  auto cfh = column_families_[rand_column_family];
@@ -1210,9 +1375,10 @@ class NonBatchedOpsStressTest : public StressTest {
1210
1375
  std::terminate();
1211
1376
  }
1212
1377
  }
1213
- int covered = shared->DeleteRange(rand_column_family, rand_key,
1214
- rand_key + FLAGS_range_deletion_width,
1215
- false /* pending */);
1378
+ for (PendingExpectedValue& pending_expected_value :
1379
+ pending_expected_values) {
1380
+ pending_expected_value.Commit();
1381
+ }
1216
1382
  thread->stats.AddRangeDeletions(1);
1217
1383
  thread->stats.AddCoveredByRangeDeletions(covered);
1218
1384
  return s;
@@ -1242,6 +1408,8 @@ class NonBatchedOpsStressTest : public StressTest {
1242
1408
  keys.reserve(FLAGS_ingest_external_file_width);
1243
1409
  std::vector<uint32_t> values;
1244
1410
  values.reserve(FLAGS_ingest_external_file_width);
1411
+ std::vector<PendingExpectedValue> pending_expected_values;
1412
+ pending_expected_values.reserve(FLAGS_ingest_external_file_width);
1245
1413
  SharedState* shared = thread->shared;
1246
1414
 
1247
1415
  assert(FLAGS_nooverwritepercent < 100);
@@ -1256,15 +1424,16 @@ class NonBatchedOpsStressTest : public StressTest {
1256
1424
  new MutexLock(shared->GetMutexForKey(column_family, key)));
1257
1425
  }
1258
1426
  if (!shared->AllowsOverwrite(key)) {
1259
- // We could alternatively include `key` on the condition its current
1260
- // value is `DELETION_SENTINEL`.
1427
+ // We could alternatively include `key` that is deleted.
1261
1428
  continue;
1262
1429
  }
1263
1430
  keys.push_back(key);
1264
1431
 
1265
- uint32_t value_base = thread->rand.Next() % shared->UNKNOWN_SENTINEL;
1432
+ PendingExpectedValue pending_expected_value =
1433
+ shared->PreparePut(column_family, key);
1434
+ const uint32_t value_base = pending_expected_value.GetFinalValueBase();
1266
1435
  values.push_back(value_base);
1267
- shared->Put(column_family, key, value_base, true /* pending */);
1436
+ pending_expected_values.push_back(pending_expected_value);
1268
1437
 
1269
1438
  char value[100];
1270
1439
  size_t value_len = GenerateValue(value_base, value, sizeof(value));
@@ -1287,8 +1456,9 @@ class NonBatchedOpsStressTest : public StressTest {
1287
1456
  fprintf(stderr, "file ingestion error: %s\n", s.ToString().c_str());
1288
1457
  std::terminate();
1289
1458
  }
1290
- for (size_t i = 0; i < keys.size(); ++i) {
1291
- shared->Put(column_family, keys[i], values[i], false /* pending */);
1459
+
1460
+ for (size_t i = 0; i < pending_expected_values.size(); ++i) {
1461
+ pending_expected_values[i].Commit();
1292
1462
  }
1293
1463
  }
1294
1464
 
@@ -1320,8 +1490,13 @@ class NonBatchedOpsStressTest : public StressTest {
1320
1490
  // Lock the whole range over which we might iterate to ensure it doesn't
1321
1491
  // change under us.
1322
1492
  const int rand_column_family = rand_column_families[0];
1323
- std::vector<std::unique_ptr<MutexLock>> range_locks =
1324
- shared->GetLocksForKeyRange(rand_column_family, lb, ub);
1493
+
1494
+ // Testing parallel read and write to the same key with user timestamp
1495
+ // is not currently supported
1496
+ std::vector<std::unique_ptr<MutexLock>> range_locks;
1497
+ if (FLAGS_user_timestamp_size > 0) {
1498
+ range_locks = shared->GetLocksForKeyRange(rand_column_family, lb, ub);
1499
+ }
1325
1500
 
1326
1501
  ReadOptions ro(read_opts);
1327
1502
  ro.total_order_seek = true;
@@ -1348,7 +1523,22 @@ class NonBatchedOpsStressTest : public StressTest {
1348
1523
  ColumnFamilyHandle* const cfh = column_families_[rand_column_family];
1349
1524
  assert(cfh);
1350
1525
 
1526
+ const std::size_t expected_values_size = static_cast<std::size_t>(ub - lb);
1527
+ std::vector<ExpectedValue> pre_read_expected_values;
1528
+ std::vector<ExpectedValue> post_read_expected_values;
1529
+
1530
+ for (int64_t i = 0; i < static_cast<int64_t>(expected_values_size); ++i) {
1531
+ pre_read_expected_values.push_back(
1532
+ shared->Get(rand_column_family, i + lb));
1533
+ }
1351
1534
  std::unique_ptr<Iterator> iter(db_->NewIterator(ro, cfh));
1535
+ for (int64_t i = 0; i < static_cast<int64_t>(expected_values_size); ++i) {
1536
+ post_read_expected_values.push_back(
1537
+ shared->Get(rand_column_family, i + lb));
1538
+ }
1539
+
1540
+ assert(pre_read_expected_values.size() == expected_values_size &&
1541
+ pre_read_expected_values.size() == post_read_expected_values.size());
1352
1542
 
1353
1543
  std::string op_logs;
1354
1544
 
@@ -1378,10 +1568,15 @@ class NonBatchedOpsStressTest : public StressTest {
1378
1568
 
1379
1569
  auto check_no_key_in_range = [&](int64_t start, int64_t end) {
1380
1570
  for (auto j = std::max(start, lb); j < std::min(end, ub); ++j) {
1381
- auto expected_value =
1382
- shared->Get(rand_column_family, static_cast<int64_t>(j));
1383
- if (expected_value != shared->DELETION_SENTINEL &&
1384
- expected_value != shared->UNKNOWN_SENTINEL) {
1571
+ std::size_t index = static_cast<std::size_t>(j - lb);
1572
+ assert(index < pre_read_expected_values.size() &&
1573
+ index < post_read_expected_values.size());
1574
+ const ExpectedValue pre_read_expected_value =
1575
+ pre_read_expected_values[index];
1576
+ const ExpectedValue post_read_expected_value =
1577
+ post_read_expected_values[index];
1578
+ if (ExpectedValueHelper::MustHaveExisted(pre_read_expected_value,
1579
+ post_read_expected_value)) {
1385
1580
  // Fail fast to preserve the DB state.
1386
1581
  thread->shared->SetVerificationFailure();
1387
1582
  if (iter->Valid()) {
@@ -1495,9 +1690,23 @@ class NonBatchedOpsStressTest : public StressTest {
1495
1690
  }
1496
1691
 
1497
1692
  if (thread->rand.OneIn(2)) {
1693
+ pre_read_expected_values.clear();
1694
+ post_read_expected_values.clear();
1498
1695
  // Refresh after forward/backward scan to allow higher chance of SV
1499
- // change. It is safe to refresh since the testing key range is locked.
1696
+ // change.
1697
+ for (int64_t i = 0; i < static_cast<int64_t>(expected_values_size); ++i) {
1698
+ pre_read_expected_values.push_back(
1699
+ shared->Get(rand_column_family, i + lb));
1700
+ }
1500
1701
  iter->Refresh();
1702
+ for (int64_t i = 0; i < static_cast<int64_t>(expected_values_size); ++i) {
1703
+ post_read_expected_values.push_back(
1704
+ shared->Get(rand_column_family, i + lb));
1705
+ }
1706
+
1707
+ assert(pre_read_expected_values.size() == expected_values_size &&
1708
+ pre_read_expected_values.size() ==
1709
+ post_read_expected_values.size());
1501
1710
  }
1502
1711
 
1503
1712
  // start from middle of [lb, ub) otherwise it is easy to iterate out of
@@ -1539,9 +1748,19 @@ class NonBatchedOpsStressTest : public StressTest {
1539
1748
  iter->Prev();
1540
1749
  op_logs += "P";
1541
1750
  } else {
1542
- const uint32_t expected_value =
1543
- shared->Get(rand_column_family, static_cast<int64_t>(curr));
1544
- if (expected_value == shared->DELETION_SENTINEL) {
1751
+ const uint32_t value_base_from_db = GetValueBase(iter->value());
1752
+ std::size_t index = static_cast<std::size_t>(curr - lb);
1753
+ assert(index < pre_read_expected_values.size() &&
1754
+ index < post_read_expected_values.size());
1755
+ const ExpectedValue pre_read_expected_value =
1756
+ pre_read_expected_values[index];
1757
+ const ExpectedValue post_read_expected_value =
1758
+ post_read_expected_values[index];
1759
+ if (ExpectedValueHelper::MustHaveNotExisted(pre_read_expected_value,
1760
+ post_read_expected_value) ||
1761
+ !ExpectedValueHelper::InExpectedValueBaseRange(
1762
+ value_base_from_db, pre_read_expected_value,
1763
+ post_read_expected_value)) {
1545
1764
  // Fail fast to preserve the DB state.
1546
1765
  thread->shared->SetVerificationFailure();
1547
1766
  fprintf(stderr, "Iterator has key %s, but expected state does not.\n",
@@ -1597,59 +1816,70 @@ class NonBatchedOpsStressTest : public StressTest {
1597
1816
 
1598
1817
  bool VerifyOrSyncValue(int cf, int64_t key, const ReadOptions& /*opts*/,
1599
1818
  SharedState* shared, const std::string& value_from_db,
1600
- std::string msg_prefix, const Status& s,
1601
- bool strict = false) const {
1819
+ std::string msg_prefix, const Status& s) const {
1602
1820
  if (shared->HasVerificationFailedYet()) {
1603
1821
  return false;
1604
1822
  }
1823
+ const ExpectedValue expected_value = shared->Get(cf, key);
1605
1824
 
1606
- // compare value_from_db with the value in the shared state
1607
- uint32_t value_base = shared->Get(cf, key);
1608
- if (value_base == SharedState::UNKNOWN_SENTINEL) {
1825
+ if (expected_value.PendingWrite() || expected_value.PendingDelete()) {
1609
1826
  if (s.ok()) {
1610
1827
  // Value exists in db, update state to reflect that
1611
1828
  Slice slice(value_from_db);
1612
- value_base = GetValueBase(slice);
1613
- shared->Put(cf, key, value_base, false);
1829
+ uint32_t value_base = GetValueBase(slice);
1830
+ shared->SyncPut(cf, key, value_base);
1614
1831
  } else if (s.IsNotFound()) {
1615
1832
  // Value doesn't exist in db, update state to reflect that
1616
- shared->SingleDelete(cf, key, false);
1833
+ shared->SyncDelete(cf, key);
1617
1834
  }
1618
1835
  return true;
1619
1836
  }
1620
- if (value_base == SharedState::DELETION_SENTINEL && !strict) {
1621
- return true;
1622
- }
1623
1837
 
1838
+ // compare value_from_db with the value in the shared state
1624
1839
  if (s.ok()) {
1625
- char value[kValueMaxLen];
1626
- if (value_base == SharedState::DELETION_SENTINEL) {
1840
+ const Slice slice(value_from_db);
1841
+ const uint32_t value_base_from_db = GetValueBase(slice);
1842
+ if (ExpectedValueHelper::MustHaveNotExisted(expected_value,
1843
+ expected_value) ||
1844
+ !ExpectedValueHelper::InExpectedValueBaseRange(
1845
+ value_base_from_db, expected_value, expected_value)) {
1627
1846
  VerificationAbort(shared, msg_prefix + ": Unexpected value found", cf,
1628
1847
  key, value_from_db, "");
1629
1848
  return false;
1630
1849
  }
1631
- size_t sz = GenerateValue(value_base, value, sizeof(value));
1632
- if (value_from_db.length() != sz) {
1850
+ char expected_value_data[kValueMaxLen];
1851
+ size_t expected_value_data_size =
1852
+ GenerateValue(expected_value.GetValueBase(), expected_value_data,
1853
+ sizeof(expected_value_data));
1854
+ if (value_from_db.length() != expected_value_data_size) {
1633
1855
  VerificationAbort(shared,
1634
1856
  msg_prefix + ": Length of value read is not equal",
1635
- cf, key, value_from_db, Slice(value, sz));
1857
+ cf, key, value_from_db,
1858
+ Slice(expected_value_data, expected_value_data_size));
1636
1859
  return false;
1637
1860
  }
1638
- if (memcmp(value_from_db.data(), value, sz) != 0) {
1861
+ if (memcmp(value_from_db.data(), expected_value_data,
1862
+ expected_value_data_size) != 0) {
1639
1863
  VerificationAbort(shared,
1640
1864
  msg_prefix + ": Contents of value read don't match",
1641
- cf, key, value_from_db, Slice(value, sz));
1865
+ cf, key, value_from_db,
1866
+ Slice(expected_value_data, expected_value_data_size));
1642
1867
  return false;
1643
1868
  }
1644
- } else {
1645
- if (value_base != SharedState::DELETION_SENTINEL) {
1646
- char value[kValueMaxLen];
1647
- size_t sz = GenerateValue(value_base, value, sizeof(value));
1648
- VerificationAbort(shared,
1649
- msg_prefix + ": Value not found: " + s.ToString(), cf,
1650
- key, "", Slice(value, sz));
1869
+ } else if (s.IsNotFound()) {
1870
+ if (ExpectedValueHelper::MustHaveExisted(expected_value,
1871
+ expected_value)) {
1872
+ char expected_value_data[kValueMaxLen];
1873
+ size_t expected_value_data_size =
1874
+ GenerateValue(expected_value.GetValueBase(), expected_value_data,
1875
+ sizeof(expected_value_data));
1876
+ VerificationAbort(
1877
+ shared, msg_prefix + ": Value not found: " + s.ToString(), cf, key,
1878
+ "", Slice(expected_value_data, expected_value_data_size));
1651
1879
  return false;
1652
1880
  }
1881
+ } else {
1882
+ assert(false);
1653
1883
  }
1654
1884
  return true;
1655
1885
  }