@nxtedition/rocksdb 8.2.8 → 9.0.1

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 (483) hide show
  1. package/binding.cc +0 -21
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +20 -10
  3. package/deps/rocksdb/rocksdb/Makefile +37 -25
  4. package/deps/rocksdb/rocksdb/README.md +29 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +25 -2
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +229 -74
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
  9. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
  10. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -95
  11. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
  12. package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2683 -496
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.h +580 -159
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +145 -42
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +20 -1
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +391 -17
  18. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
  19. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +309 -212
  20. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -32
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +439 -12
  22. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +44 -2
  23. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +11 -1
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -3
  25. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
  26. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
  27. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
  28. package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
  29. package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
  30. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +28 -12
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
  32. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
  33. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
  34. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
  35. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  36. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +20 -22
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
  41. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
  42. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
  43. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
  44. package/deps/rocksdb/rocksdb/db/builder.cc +35 -10
  45. package/deps/rocksdb/rocksdb/db/c.cc +233 -6
  46. package/deps/rocksdb/rocksdb/db/c_test.c +140 -6
  47. package/deps/rocksdb/rocksdb/db/column_family.cc +110 -51
  48. package/deps/rocksdb/rocksdb/db/column_family.h +34 -2
  49. package/deps/rocksdb/rocksdb/db/column_family_test.cc +314 -7
  50. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +106 -23
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +47 -9
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +10 -11
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +148 -60
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +22 -7
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -4
  60. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +33 -23
  61. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +14 -5
  62. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
  63. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
  64. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +90 -4
  65. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +170 -95
  66. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
  67. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +32 -58
  68. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +3 -1
  69. package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
  70. package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
  71. package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
  72. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  73. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +46 -10
  74. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -3
  75. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -15
  76. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
  77. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +850 -44
  78. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
  79. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +275 -1
  80. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +52 -19
  81. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +733 -320
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +155 -66
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +516 -155
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -4
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
  87. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -4
  88. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +100 -35
  89. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +95 -50
  90. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -9
  91. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +136 -79
  92. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +6 -95
  93. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +31 -22
  94. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
  95. package/deps/rocksdb/rocksdb/db/db_iter.cc +85 -57
  96. package/deps/rocksdb/rocksdb/db/db_iter.h +11 -2
  97. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
  98. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
  99. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
  100. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
  101. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +193 -7
  102. package/deps/rocksdb/rocksdb/db/db_options_test.cc +294 -26
  103. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
  104. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +364 -0
  105. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +13 -3
  106. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
  107. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
  108. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
  109. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
  110. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
  111. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +282 -167
  112. package/deps/rocksdb/rocksdb/db/db_test.cc +180 -49
  113. package/deps/rocksdb/rocksdb/db/db_test2.cc +84 -12
  114. package/deps/rocksdb/rocksdb/db/db_test_util.cc +25 -12
  115. package/deps/rocksdb/rocksdb/db/db_test_util.h +45 -2
  116. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +14 -1
  117. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +245 -0
  118. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +480 -1
  119. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
  120. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
  121. package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
  122. package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
  123. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
  124. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
  125. package/deps/rocksdb/rocksdb/db/error_handler.cc +67 -34
  126. package/deps/rocksdb/rocksdb/db/error_handler.h +13 -9
  127. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  128. package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
  129. package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
  130. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
  131. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
  132. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +144 -4
  133. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
  134. package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
  135. package/deps/rocksdb/rocksdb/db/flush_job.cc +105 -17
  136. package/deps/rocksdb/rocksdb/db/flush_job.h +27 -4
  137. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -12
  138. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
  139. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
  140. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
  141. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
  142. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
  143. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  144. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
  145. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
  146. package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
  147. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
  149. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -3
  150. package/deps/rocksdb/rocksdb/db/memtable.cc +70 -83
  151. package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
  152. package/deps/rocksdb/rocksdb/db/memtable_list.cc +45 -11
  153. package/deps/rocksdb/rocksdb/db/memtable_list.h +43 -2
  154. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +91 -5
  155. package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
  156. package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
  157. package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
  158. package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
  159. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -2
  160. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
  161. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -0
  162. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
  164. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
  165. package/deps/rocksdb/rocksdb/db/repair.cc +25 -7
  166. package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
  167. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +459 -74
  168. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
  169. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
  170. package/deps/rocksdb/rocksdb/db/table_cache.cc +76 -54
  171. package/deps/rocksdb/rocksdb/db/table_cache.h +18 -12
  172. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  173. package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
  174. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
  175. package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
  176. package/deps/rocksdb/rocksdb/db/version_edit.h +58 -10
  177. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
  178. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
  179. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
  180. package/deps/rocksdb/rocksdb/db/version_set.cc +207 -110
  181. package/deps/rocksdb/rocksdb/db/version_set.h +36 -15
  182. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
  183. package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -26
  184. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
  185. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
  186. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
  187. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
  188. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
  189. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
  190. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
  191. package/deps/rocksdb/rocksdb/db/write_batch.cc +55 -20
  192. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
  193. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
  194. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  195. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
  196. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
  197. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
  198. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +37 -13
  199. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +110 -58
  200. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
  201. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +68 -17
  202. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
  203. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -1
  204. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +429 -237
  205. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +13 -6
  206. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +21 -14
  207. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
  208. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
  209. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
  210. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
  211. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +29 -38
  212. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +302 -101
  213. package/deps/rocksdb/rocksdb/env/env.cc +6 -2
  214. package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
  215. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
  216. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
  217. package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
  218. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  219. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +79 -0
  220. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
  221. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
  222. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
  223. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +100 -70
  224. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +64 -18
  225. package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
  226. package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
  227. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1225 -97
  228. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +72 -33
  229. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
  230. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
  231. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
  232. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +40 -14
  233. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +163 -91
  234. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +112 -2
  235. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +108 -16
  236. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
  238. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +42 -2
  239. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
  240. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +92 -12
  241. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +34 -4
  242. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
  243. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +91 -13
  244. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
  245. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
  246. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  248. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
  249. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +130 -22
  250. package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
  251. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
  252. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +92 -9
  253. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
  254. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
  255. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +37 -2
  256. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
  257. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
  258. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
  259. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +20 -3
  260. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +7 -0
  261. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +42 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
  268. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  269. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
  270. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -2
  271. package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
  272. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +4 -3
  273. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
  274. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  275. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
  276. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  277. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +22 -1
  278. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
  279. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
  280. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  281. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
  282. package/deps/rocksdb/rocksdb/options/customizable_test.cc +6 -1
  283. package/deps/rocksdb/rocksdb/options/db_options.cc +54 -2
  284. package/deps/rocksdb/rocksdb/options/db_options.h +4 -0
  285. package/deps/rocksdb/rocksdb/options/options.cc +15 -1
  286. package/deps/rocksdb/rocksdb/options/options_helper.cc +18 -0
  287. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +14 -4
  288. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -1
  289. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  290. package/deps/rocksdb/rocksdb/port/README +10 -0
  291. package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
  292. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  293. package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
  294. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
  295. package/deps/rocksdb/rocksdb/port/stack_trace.cc +32 -12
  296. package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
  297. package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
  298. package/deps/rocksdb/rocksdb/src.mk +10 -1
  299. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  300. package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
  301. package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
  302. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +116 -43
  303. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +9 -6
  304. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +321 -49
  305. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +98 -4
  306. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +233 -98
  307. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +58 -23
  308. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
  309. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +52 -24
  310. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
  311. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
  312. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
  313. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
  314. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
  315. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -18
  316. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +20 -8
  317. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +232 -71
  318. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
  319. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
  320. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
  321. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  322. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
  323. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
  324. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -2
  325. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
  326. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +36 -19
  327. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
  328. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
  329. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
  330. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +11 -7
  331. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
  332. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
  333. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
  334. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +14 -13
  335. package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
  336. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +9 -2
  337. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
  338. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
  339. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
  340. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
  341. package/deps/rocksdb/rocksdb/table/format.cc +175 -33
  342. package/deps/rocksdb/rocksdb/table/format.h +63 -10
  343. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
  344. package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
  345. package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
  346. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
  347. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +22 -2
  348. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
  349. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
  350. package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
  351. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
  352. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
  353. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
  354. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
  355. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +45 -9
  356. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
  357. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +24 -1
  358. package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
  359. package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
  360. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
  361. package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
  362. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
  363. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
  364. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
  365. package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
  366. package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
  367. package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
  368. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
  369. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +87 -65
  370. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +221 -33
  371. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
  372. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  373. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  374. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -11
  375. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
  376. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
  377. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
  378. package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
  379. package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
  380. package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
  381. package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
  382. package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
  383. package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
  384. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
  385. package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
  386. package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
  387. package/deps/rocksdb/rocksdb/util/cast_util.h +24 -0
  388. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
  389. package/deps/rocksdb/rocksdb/util/comparator.cc +55 -8
  390. package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
  391. package/deps/rocksdb/rocksdb/util/compression.h +119 -35
  392. package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
  393. package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
  394. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
  395. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
  396. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
  397. package/deps/rocksdb/rocksdb/util/hash.h +7 -3
  398. package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
  399. package/deps/rocksdb/rocksdb/util/math.h +58 -6
  400. package/deps/rocksdb/rocksdb/util/math128.h +29 -7
  401. package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
  402. package/deps/rocksdb/rocksdb/util/overload.h +23 -0
  403. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
  404. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
  405. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
  406. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
  407. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
  408. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  409. package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +10 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +385 -0
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +192 -1
  415. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +461 -0
  416. package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
  417. package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
  418. package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
  419. package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
  420. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +71 -26
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
  426. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
  427. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
  428. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  429. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +20 -16
  430. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
  431. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
  432. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +7 -1
  433. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
  434. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +12 -3
  435. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  436. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
  437. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
  438. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
  439. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  440. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  441. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
  442. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
  443. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
  444. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +272 -33
  445. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
  446. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -1
  447. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
  448. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
  449. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +195 -23
  450. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +19 -12
  451. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +88 -1
  452. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
  453. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +43 -17
  454. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
  455. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +73 -24
  456. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
  457. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
  458. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +41 -12
  459. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
  460. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +15 -8
  461. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
  462. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
  463. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  464. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
  465. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +59 -28
  466. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
  467. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
  468. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +111 -14
  469. package/deps/rocksdb/rocksdb.gyp +6 -2
  470. package/index.js +0 -8
  471. package/package.json +1 -1
  472. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  473. package/prebuilds/linux-x64/node.napi.node +0 -0
  474. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  475. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  476. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  477. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  478. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  479. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  480. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  481. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  482. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  483. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
@@ -17,6 +17,7 @@
17
17
  #include "db_stress_tool/db_stress_compaction_filter.h"
18
18
  #include "db_stress_tool/db_stress_driver.h"
19
19
  #include "db_stress_tool/db_stress_table_properties_collector.h"
20
+ #include "db_stress_tool/db_stress_wide_merge_operator.h"
20
21
  #include "rocksdb/convenience.h"
21
22
  #include "rocksdb/filter_policy.h"
22
23
  #include "rocksdb/secondary_cache.h"
@@ -39,12 +40,12 @@ std::shared_ptr<const FilterPolicy> CreateFilterPolicy() {
39
40
  return BlockBasedTableOptions().filter_policy;
40
41
  }
41
42
  const FilterPolicy* new_policy;
42
- if (FLAGS_ribbon_starting_level >= 999) {
43
+ if (FLAGS_bloom_before_level == INT_MAX) {
43
44
  // Use Bloom API
44
45
  new_policy = NewBloomFilterPolicy(FLAGS_bloom_bits, false);
45
46
  } else {
46
- new_policy = NewRibbonFilterPolicy(
47
- FLAGS_bloom_bits, /* bloom_before_level */ FLAGS_ribbon_starting_level);
47
+ new_policy =
48
+ NewRibbonFilterPolicy(FLAGS_bloom_bits, FLAGS_bloom_before_level);
48
49
  }
49
50
  return std::shared_ptr<const FilterPolicy>(new_policy);
50
51
  }
@@ -56,7 +57,7 @@ StressTest::StressTest()
56
57
  filter_policy_(CreateFilterPolicy()),
57
58
  db_(nullptr),
58
59
  txn_db_(nullptr),
59
-
60
+ optimistic_txn_db_(nullptr),
60
61
  db_aptr_(nullptr),
61
62
  clock_(db_stress_env->GetSystemClock().get()),
62
63
  new_column_family_name_(1),
@@ -111,6 +112,11 @@ std::shared_ptr<Cache> StressTest::NewCache(size_t capacity,
111
112
 
112
113
  std::shared_ptr<SecondaryCache> secondary_cache;
113
114
  if (!FLAGS_secondary_cache_uri.empty()) {
115
+ assert(!strstr(FLAGS_secondary_cache_uri.c_str(),
116
+ "compressed_secondary_cache") ||
117
+ (FLAGS_compressed_secondary_cache_size == 0 &&
118
+ FLAGS_compressed_secondary_cache_ratio == 0.0 &&
119
+ !StartsWith(FLAGS_cache_type, "tiered_")));
114
120
  Status s = SecondaryCache::CreateFromString(
115
121
  config_options, FLAGS_secondary_cache_uri, &secondary_cache);
116
122
  if (secondary_cache == nullptr) {
@@ -124,27 +130,81 @@ std::shared_ptr<Cache> StressTest::NewCache(size_t capacity,
124
130
  secondary_cache, static_cast<uint32_t>(FLAGS_seed),
125
131
  FLAGS_secondary_cache_fault_one_in);
126
132
  }
133
+ } else if (FLAGS_compressed_secondary_cache_size > 0) {
134
+ if (StartsWith(FLAGS_cache_type, "tiered_")) {
135
+ fprintf(stderr,
136
+ "Cannot specify both compressed_secondary_cache_size and %s\n",
137
+ FLAGS_cache_type.c_str());
138
+ exit(1);
139
+ }
140
+ CompressedSecondaryCacheOptions opts;
141
+ opts.capacity = FLAGS_compressed_secondary_cache_size;
142
+ secondary_cache = NewCompressedSecondaryCache(opts);
143
+ if (secondary_cache == nullptr) {
144
+ fprintf(stderr, "Failed to allocate compressed secondary cache\n");
145
+ exit(1);
146
+ }
147
+ compressed_secondary_cache = secondary_cache;
127
148
  }
128
149
 
129
- if (FLAGS_cache_type == "clock_cache") {
150
+ std::string cache_type = FLAGS_cache_type;
151
+ size_t cache_size = FLAGS_cache_size;
152
+ bool tiered = false;
153
+ if (StartsWith(cache_type, "tiered_")) {
154
+ tiered = true;
155
+ cache_type.erase(0, strlen("tiered_"));
156
+ }
157
+ if (FLAGS_use_write_buffer_manager) {
158
+ cache_size += FLAGS_db_write_buffer_size;
159
+ }
160
+ if (cache_type == "clock_cache") {
130
161
  fprintf(stderr, "Old clock cache implementation has been removed.\n");
131
162
  exit(1);
132
- } else if (FLAGS_cache_type == "hyper_clock_cache") {
133
- HyperClockCacheOptions opts(static_cast<size_t>(capacity),
134
- FLAGS_block_size /*estimated_entry_charge*/,
163
+ } else if (EndsWith(cache_type, "hyper_clock_cache")) {
164
+ size_t estimated_entry_charge;
165
+ if (cache_type == "fixed_hyper_clock_cache" ||
166
+ cache_type == "hyper_clock_cache") {
167
+ estimated_entry_charge = FLAGS_block_size;
168
+ } else if (cache_type == "auto_hyper_clock_cache") {
169
+ estimated_entry_charge = 0;
170
+ } else {
171
+ fprintf(stderr, "Cache type not supported.");
172
+ exit(1);
173
+ }
174
+ HyperClockCacheOptions opts(cache_size, estimated_entry_charge,
135
175
  num_shard_bits);
136
- opts.secondary_cache = std::move(secondary_cache);
137
- return opts.MakeSharedCache();
138
- } else if (FLAGS_cache_type == "lru_cache") {
176
+ opts.hash_seed = BitwiseAnd(FLAGS_seed, INT32_MAX);
177
+ if (tiered) {
178
+ TieredCacheOptions tiered_opts;
179
+ tiered_opts.cache_opts = &opts;
180
+ tiered_opts.cache_type = PrimaryCacheType::kCacheTypeHCC;
181
+ tiered_opts.total_capacity = cache_size;
182
+ tiered_opts.compressed_secondary_ratio = 0.5;
183
+ block_cache = NewTieredCache(tiered_opts);
184
+ } else {
185
+ opts.secondary_cache = std::move(secondary_cache);
186
+ block_cache = opts.MakeSharedCache();
187
+ }
188
+ } else if (EndsWith(cache_type, "lru_cache")) {
139
189
  LRUCacheOptions opts;
140
190
  opts.capacity = capacity;
141
191
  opts.num_shard_bits = num_shard_bits;
142
- opts.secondary_cache = std::move(secondary_cache);
143
- return NewLRUCache(opts);
192
+ if (tiered) {
193
+ TieredCacheOptions tiered_opts;
194
+ tiered_opts.cache_opts = &opts;
195
+ tiered_opts.cache_type = PrimaryCacheType::kCacheTypeLRU;
196
+ tiered_opts.total_capacity = cache_size;
197
+ tiered_opts.compressed_secondary_ratio = 0.5;
198
+ block_cache = NewTieredCache(tiered_opts);
199
+ } else {
200
+ opts.secondary_cache = std::move(secondary_cache);
201
+ block_cache = NewLRUCache(opts);
202
+ }
144
203
  } else {
145
204
  fprintf(stderr, "Cache type not supported.");
146
205
  exit(1);
147
206
  }
207
+ return block_cache;
148
208
  }
149
209
 
150
210
  std::vector<std::string> StressTest::GetBlobCompressionTags() {
@@ -264,6 +324,13 @@ bool StressTest::BuildOptionsTable() {
264
324
  std::vector<std::string>{"kDisable", "kFlushOnly"});
265
325
  }
266
326
 
327
+ if (FLAGS_bloom_before_level != INT_MAX) {
328
+ // Can modify RibbonFilterPolicy field
329
+ options_tbl.emplace("table_factory.filter_policy.bloom_before_level",
330
+ std::vector<std::string>{"-1", "0", "1", "2",
331
+ "2147483646", "2147483647"});
332
+ }
333
+
267
334
  options_table_ = std::move(options_tbl);
268
335
 
269
336
  for (const auto& iter : options_table_) {
@@ -301,7 +368,7 @@ void StressTest::FinishInitDb(SharedState* shared) {
301
368
  exit(1);
302
369
  }
303
370
  }
304
- if (FLAGS_use_txn) {
371
+ if (FLAGS_use_txn && !FLAGS_use_optimistic_txn) {
305
372
  // It's OK here without sync because unsynced data cannot be lost at this
306
373
  // point
307
374
  // - even with sync_fault_injection=1 as the
@@ -398,10 +465,22 @@ Status StressTest::AssertSame(DB* db, ColumnFamilyHandle* cf,
398
465
  return Status::OK();
399
466
  }
400
467
 
401
- void StressTest::VerificationAbort(SharedState* shared, std::string msg,
402
- Status s) const {
403
- fprintf(stderr, "Verification failed: %s. Status is %s\n", msg.c_str(),
404
- s.ToString().c_str());
468
+ void StressTest::ProcessStatus(SharedState* shared, std::string opname,
469
+ Status s) const {
470
+ if (s.ok()) {
471
+ return;
472
+ }
473
+ if (!s.IsIOError() || !std::strstr(s.getState(), "injected")) {
474
+ std::ostringstream oss;
475
+ oss << opname << " failed: " << s.ToString();
476
+ VerificationAbort(shared, oss.str());
477
+ assert(false);
478
+ }
479
+ fprintf(stdout, "%s failed: %s\n", opname.c_str(), s.ToString().c_str());
480
+ }
481
+
482
+ void StressTest::VerificationAbort(SharedState* shared, std::string msg) const {
483
+ fprintf(stderr, "Verification failed: %s\n", msg.c_str());
405
484
  shared->SetVerificationFailure();
406
485
  }
407
486
 
@@ -490,13 +569,16 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
490
569
 
491
570
  const Slice v(value, sz);
492
571
 
493
-
494
572
  std::string ts;
495
573
  if (FLAGS_user_timestamp_size > 0) {
496
574
  ts = GetNowNanos();
497
575
  }
498
576
 
499
- if (FLAGS_use_merge) {
577
+ if (FLAGS_use_put_entity_one_in > 0 &&
578
+ (value_base % FLAGS_use_put_entity_one_in) == 0) {
579
+ s = db_->PutEntity(write_opts, cfh, key,
580
+ GenerateWideColumns(value_base, v));
581
+ } else if (FLAGS_use_merge) {
500
582
  if (!FLAGS_use_txn) {
501
583
  if (FLAGS_user_timestamp_size > 0) {
502
584
  s = db_->Merge(write_opts, cfh, key, ts, v);
@@ -504,18 +586,10 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
504
586
  s = db_->Merge(write_opts, cfh, key, v);
505
587
  }
506
588
  } else {
507
- Transaction* txn;
508
- s = NewTxn(write_opts, &txn);
509
- if (s.ok()) {
510
- s = txn->Merge(cfh, key, v);
511
- if (s.ok()) {
512
- s = CommitTxn(txn);
513
- }
514
- }
589
+ s = ExecuteTransaction(
590
+ write_opts, /*thread=*/nullptr,
591
+ [&](Transaction& txn) { return txn.Merge(cfh, key, v); });
515
592
  }
516
- } else if (FLAGS_use_put_entity_one_in > 0) {
517
- s = db_->PutEntity(write_opts, cfh, key,
518
- GenerateWideColumns(value_base, v));
519
593
  } else {
520
594
  if (!FLAGS_use_txn) {
521
595
  if (FLAGS_user_timestamp_size > 0) {
@@ -524,14 +598,9 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
524
598
  s = db_->Put(write_opts, cfh, key, v);
525
599
  }
526
600
  } else {
527
- Transaction* txn;
528
- s = NewTxn(write_opts, &txn);
529
- if (s.ok()) {
530
- s = txn->Put(cfh, key, v);
531
- if (s.ok()) {
532
- s = CommitTxn(txn);
533
- }
534
- }
601
+ s = ExecuteTransaction(
602
+ write_opts, /*thread=*/nullptr,
603
+ [&](Transaction& txn) { return txn.Put(cfh, key, v); });
535
604
  }
536
605
  }
537
606
 
@@ -556,6 +625,7 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
556
625
  delete db_;
557
626
  db_ = nullptr;
558
627
  txn_db_ = nullptr;
628
+ optimistic_txn_db_ = nullptr;
559
629
 
560
630
  db_preload_finished_.store(true);
561
631
  auto now = clock_->NowMicros();
@@ -628,74 +698,116 @@ void StressTest::ProcessRecoveredPreparedTxnsHelper(Transaction* txn,
628
698
  }
629
699
  }
630
700
 
631
- Status StressTest::NewTxn(WriteOptions& write_opts, Transaction** txn) {
701
+ Status StressTest::NewTxn(WriteOptions& write_opts,
702
+ std::unique_ptr<Transaction>* out_txn) {
632
703
  if (!FLAGS_use_txn) {
633
704
  return Status::InvalidArgument("NewTxn when FLAGS_use_txn is not set");
634
705
  }
635
706
  write_opts.disableWAL = FLAGS_disable_wal;
636
707
  static std::atomic<uint64_t> txn_id = {0};
637
- TransactionOptions txn_options;
638
- txn_options.use_only_the_last_commit_time_batch_for_recovery =
639
- FLAGS_use_only_the_last_commit_time_batch_for_recovery;
640
- txn_options.lock_timeout = 600000; // 10 min
641
- txn_options.deadlock_detect = true;
642
- *txn = txn_db_->BeginTransaction(write_opts, txn_options);
643
- auto istr = std::to_string(txn_id.fetch_add(1));
644
- Status s = (*txn)->SetName("xid" + istr);
645
- return s;
708
+ if (FLAGS_use_optimistic_txn) {
709
+ out_txn->reset(optimistic_txn_db_->BeginTransaction(write_opts));
710
+ return Status::OK();
711
+ } else {
712
+ TransactionOptions txn_options;
713
+ txn_options.use_only_the_last_commit_time_batch_for_recovery =
714
+ FLAGS_use_only_the_last_commit_time_batch_for_recovery;
715
+ txn_options.lock_timeout = 600000; // 10 min
716
+ txn_options.deadlock_detect = true;
717
+ out_txn->reset(txn_db_->BeginTransaction(write_opts, txn_options));
718
+ auto istr = std::to_string(txn_id.fetch_add(1));
719
+ Status s = (*out_txn)->SetName("xid" + istr);
720
+ return s;
721
+ }
646
722
  }
647
723
 
648
- Status StressTest::CommitTxn(Transaction* txn, ThreadState* thread) {
724
+ Status StressTest::CommitTxn(Transaction& txn, ThreadState* thread) {
649
725
  if (!FLAGS_use_txn) {
650
726
  return Status::InvalidArgument("CommitTxn when FLAGS_use_txn is not set");
651
727
  }
652
- assert(txn_db_);
653
- Status s = txn->Prepare();
654
- std::shared_ptr<const Snapshot> timestamped_snapshot;
655
- if (s.ok()) {
656
- if (thread && FLAGS_create_timestamped_snapshot_one_in &&
657
- thread->rand.OneIn(FLAGS_create_timestamped_snapshot_one_in)) {
658
- uint64_t ts = db_stress_env->NowNanos();
659
- s = txn->CommitAndTryCreateSnapshot(/*notifier=*/nullptr, ts,
660
- &timestamped_snapshot);
661
-
662
- std::pair<Status, std::shared_ptr<const Snapshot>> res;
663
- if (thread->tid == 0) {
664
- uint64_t now = db_stress_env->NowNanos();
665
- res = txn_db_->CreateTimestampedSnapshot(now);
666
- if (res.first.ok()) {
667
- assert(res.second);
668
- assert(res.second->GetTimestamp() == now);
669
- if (timestamped_snapshot) {
670
- assert(res.second->GetTimestamp() >
671
- timestamped_snapshot->GetTimestamp());
728
+ Status s = Status::OK();
729
+ if (FLAGS_use_optimistic_txn) {
730
+ assert(optimistic_txn_db_);
731
+ s = txn.Commit();
732
+ } else {
733
+ assert(txn_db_);
734
+ s = txn.Prepare();
735
+ std::shared_ptr<const Snapshot> timestamped_snapshot;
736
+ if (s.ok()) {
737
+ if (thread && FLAGS_create_timestamped_snapshot_one_in &&
738
+ thread->rand.OneIn(FLAGS_create_timestamped_snapshot_one_in)) {
739
+ uint64_t ts = db_stress_env->NowNanos();
740
+ s = txn.CommitAndTryCreateSnapshot(/*notifier=*/nullptr, ts,
741
+ &timestamped_snapshot);
742
+
743
+ std::pair<Status, std::shared_ptr<const Snapshot>> res;
744
+ if (thread->tid == 0) {
745
+ uint64_t now = db_stress_env->NowNanos();
746
+ res = txn_db_->CreateTimestampedSnapshot(now);
747
+ if (res.first.ok()) {
748
+ assert(res.second);
749
+ assert(res.second->GetTimestamp() == now);
750
+ if (timestamped_snapshot) {
751
+ assert(res.second->GetTimestamp() >
752
+ timestamped_snapshot->GetTimestamp());
753
+ }
754
+ } else {
755
+ assert(!res.second);
672
756
  }
673
- } else {
674
- assert(!res.second);
675
757
  }
758
+ } else {
759
+ s = txn.Commit();
676
760
  }
677
- } else {
678
- s = txn->Commit();
761
+ }
762
+ if (thread && FLAGS_create_timestamped_snapshot_one_in > 0 &&
763
+ thread->rand.OneInOpt(50000)) {
764
+ uint64_t now = db_stress_env->NowNanos();
765
+ constexpr uint64_t time_diff = static_cast<uint64_t>(1000) * 1000 * 1000;
766
+ txn_db_->ReleaseTimestampedSnapshotsOlderThan(now - time_diff);
679
767
  }
680
768
  }
681
- if (thread && FLAGS_create_timestamped_snapshot_one_in > 0 &&
682
- thread->rand.OneInOpt(50000)) {
683
- uint64_t now = db_stress_env->NowNanos();
684
- constexpr uint64_t time_diff = static_cast<uint64_t>(1000) * 1000 * 1000;
685
- txn_db_->ReleaseTimestampedSnapshotsOlderThan(now - time_diff);
686
- }
687
- delete txn;
688
769
  return s;
689
770
  }
690
771
 
691
- Status StressTest::RollbackTxn(Transaction* txn) {
692
- if (!FLAGS_use_txn) {
693
- return Status::InvalidArgument(
694
- "RollbackTxn when FLAGS_use_txn is not"
695
- " set");
772
+ Status StressTest::ExecuteTransaction(
773
+ WriteOptions& write_opts, ThreadState* thread,
774
+ std::function<Status(Transaction&)>&& ops) {
775
+ std::unique_ptr<Transaction> txn;
776
+ Status s = NewTxn(write_opts, &txn);
777
+ std::string try_again_messages;
778
+ if (s.ok()) {
779
+ for (int tries = 1;; ++tries) {
780
+ s = ops(*txn);
781
+ if (s.ok()) {
782
+ s = CommitTxn(*txn, thread);
783
+ if (s.ok()) {
784
+ break;
785
+ }
786
+ }
787
+ // Optimistic txn might return TryAgain, in which case rollback
788
+ // and try again.
789
+ if (!s.IsTryAgain() || !FLAGS_use_optimistic_txn) {
790
+ break;
791
+ }
792
+ // Record and report historical TryAgain messages for debugging
793
+ try_again_messages +=
794
+ std::to_string(SystemClock::Default()->NowMicros() / 1000);
795
+ try_again_messages += "ms ";
796
+ try_again_messages += s.getState();
797
+ try_again_messages += "\n";
798
+ // In theory, each Rollback after TryAgain should have an independent
799
+ // chance of success, so too many retries could indicate something is
800
+ // not working properly.
801
+ if (tries >= 10) {
802
+ s = Status::TryAgain(try_again_messages);
803
+ break;
804
+ }
805
+ s = txn->Rollback();
806
+ if (!s.ok()) {
807
+ break;
808
+ }
809
+ }
696
810
  }
697
- Status s = txn->Rollback();
698
- delete txn;
699
811
  return s;
700
812
  }
701
813
 
@@ -706,6 +818,7 @@ void StressTest::OperateDb(ThreadState* thread) {
706
818
  read_opts.async_io = FLAGS_async_io;
707
819
  read_opts.adaptive_readahead = FLAGS_adaptive_readahead;
708
820
  read_opts.readahead_size = FLAGS_readahead_size;
821
+ read_opts.auto_readahead_size = FLAGS_auto_readahead_size;
709
822
  WriteOptions write_opts;
710
823
  if (FLAGS_rate_limit_auto_wal_flush) {
711
824
  write_opts.rate_limiter_priority = Env::IO_USER;
@@ -731,27 +844,11 @@ void StressTest::OperateDb(ThreadState* thread) {
731
844
 
732
845
  #ifndef NDEBUG
733
846
  if (FLAGS_read_fault_one_in) {
734
- fault_fs_guard->SetThreadLocalReadErrorContext(thread->shared->GetSeed(),
735
- FLAGS_read_fault_one_in);
847
+ fault_fs_guard->SetThreadLocalReadErrorContext(
848
+ thread->shared->GetSeed(), FLAGS_read_fault_one_in,
849
+ FLAGS_inject_error_severity == 1 /* retryable */);
736
850
  }
737
851
  #endif // NDEBUG
738
- if (FLAGS_write_fault_one_in) {
739
- IOStatus error_msg;
740
- if (FLAGS_injest_error_severity <= 1 || FLAGS_injest_error_severity > 2) {
741
- error_msg = IOStatus::IOError("Retryable IO Error");
742
- error_msg.SetRetryable(true);
743
- } else if (FLAGS_injest_error_severity == 2) {
744
- // Ingest the fatal error
745
- error_msg = IOStatus::IOError("Fatal IO Error");
746
- error_msg.SetDataLoss(true);
747
- }
748
- std::vector<FileType> types = {FileType::kTableFile,
749
- FileType::kDescriptorFile,
750
- FileType::kCurrentFile};
751
- fault_fs_guard->SetRandomWriteError(
752
- thread->shared->GetSeed(), FLAGS_write_fault_one_in, error_msg,
753
- /*inject_for_all_file_types=*/false, types);
754
- }
755
852
  thread->stats.Start();
756
853
  for (int open_cnt = 0; open_cnt <= FLAGS_reopen; ++open_cnt) {
757
854
  if (thread->shared->HasVerificationFailedYet() ||
@@ -875,42 +972,42 @@ void StressTest::OperateDb(ThreadState* thread) {
875
972
  if (thread->rand.OneInOpt(FLAGS_get_live_files_one_in) &&
876
973
  !FLAGS_write_fault_one_in) {
877
974
  Status status = VerifyGetLiveFiles();
878
- if (!status.ok()) {
879
- VerificationAbort(shared, "VerifyGetLiveFiles status not OK", status);
880
- }
975
+ ProcessStatus(shared, "VerifyGetLiveFiles", status);
881
976
  }
882
977
 
883
978
  // Verify GetSortedWalFiles with a 1 in N chance.
884
979
  if (thread->rand.OneInOpt(FLAGS_get_sorted_wal_files_one_in)) {
885
980
  Status status = VerifyGetSortedWalFiles();
886
- if (!status.ok()) {
887
- VerificationAbort(shared, "VerifyGetSortedWalFiles status not OK",
888
- status);
889
- }
981
+ ProcessStatus(shared, "VerifyGetSortedWalFiles", status);
890
982
  }
891
983
 
892
984
  // Verify GetCurrentWalFile with a 1 in N chance.
893
985
  if (thread->rand.OneInOpt(FLAGS_get_current_wal_file_one_in)) {
894
986
  Status status = VerifyGetCurrentWalFile();
895
- if (!status.ok()) {
896
- VerificationAbort(shared, "VerifyGetCurrentWalFile status not OK",
897
- status);
898
- }
987
+ ProcessStatus(shared, "VerifyGetCurrentWalFile", status);
899
988
  }
900
989
 
901
990
  if (thread->rand.OneInOpt(FLAGS_pause_background_one_in)) {
902
991
  Status status = TestPauseBackground(thread);
903
- if (!status.ok()) {
904
- VerificationAbort(
905
- shared, "Pause/ContinueBackgroundWork status not OK", status);
906
- }
992
+ ProcessStatus(shared, "Pause/ContinueBackgroundWork", status);
907
993
  }
908
994
 
909
995
  if (thread->rand.OneInOpt(FLAGS_verify_checksum_one_in)) {
996
+ ThreadStatusUtil::SetEnableTracking(FLAGS_enable_thread_tracking);
997
+ ThreadStatusUtil::SetThreadOperation(
998
+ ThreadStatus::OperationType::OP_VERIFY_DB_CHECKSUM);
910
999
  Status status = db_->VerifyChecksum();
911
- if (!status.ok()) {
912
- VerificationAbort(shared, "VerifyChecksum status not OK", status);
913
- }
1000
+ ThreadStatusUtil::ResetThreadStatus();
1001
+ ProcessStatus(shared, "VerifyChecksum", status);
1002
+ }
1003
+
1004
+ if (thread->rand.OneInOpt(FLAGS_verify_file_checksums_one_in)) {
1005
+ ThreadStatusUtil::SetEnableTracking(FLAGS_enable_thread_tracking);
1006
+ ThreadStatusUtil::SetThreadOperation(
1007
+ ThreadStatus::OperationType::OP_VERIFY_FILE_CHECKSUMS);
1008
+ Status status = db_->VerifyFileChecksums(read_opts);
1009
+ ThreadStatusUtil::ResetThreadStatus();
1010
+ ProcessStatus(shared, "VerifyFileChecksums", status);
914
1011
  }
915
1012
 
916
1013
  if (thread->rand.OneInOpt(FLAGS_get_property_one_in)) {
@@ -937,26 +1034,19 @@ void StressTest::OperateDb(ThreadState* thread) {
937
1034
 
938
1035
  if (total_size <= FLAGS_backup_max_size) {
939
1036
  Status s = TestBackupRestore(thread, rand_column_families, rand_keys);
940
- if (!s.ok()) {
941
- VerificationAbort(shared, "Backup/restore gave inconsistent state",
942
- s);
943
- }
1037
+ ProcessStatus(shared, "Backup/restore", s);
944
1038
  }
945
1039
  }
946
1040
 
947
1041
  if (thread->rand.OneInOpt(FLAGS_checkpoint_one_in)) {
948
1042
  Status s = TestCheckpoint(thread, rand_column_families, rand_keys);
949
- if (!s.ok()) {
950
- VerificationAbort(shared, "Checkpoint gave inconsistent state", s);
951
- }
1043
+ ProcessStatus(shared, "Checkpoint", s);
952
1044
  }
953
1045
 
954
1046
  if (thread->rand.OneInOpt(FLAGS_approximate_size_one_in)) {
955
1047
  Status s =
956
1048
  TestApproximateSize(thread, i, rand_column_families, rand_keys);
957
- if (!s.ok()) {
958
- VerificationAbort(shared, "ApproximateSize Failed", s);
959
- }
1049
+ ProcessStatus(shared, "ApproximateSize", s);
960
1050
  }
961
1051
  if (thread->rand.OneInOpt(FLAGS_acquire_snapshot_one_in)) {
962
1052
  TestAcquireSnapshot(thread, rand_column_family, keystr, i);
@@ -964,9 +1054,7 @@ void StressTest::OperateDb(ThreadState* thread) {
964
1054
 
965
1055
  /*always*/ {
966
1056
  Status s = MaybeReleaseSnapshots(thread, i);
967
- if (!s.ok()) {
968
- VerificationAbort(shared, "Snapshot gave inconsistent state", s);
969
- }
1057
+ ProcessStatus(shared, "Snapshot", s);
970
1058
  }
971
1059
 
972
1060
  // Assign timestamps if necessary.
@@ -985,6 +1073,7 @@ void StressTest::OperateDb(ThreadState* thread) {
985
1073
  if (prob_op >= 0 && prob_op < static_cast<int>(FLAGS_readpercent)) {
986
1074
  assert(0 <= prob_op);
987
1075
  // OPERATION read
1076
+ ThreadStatusUtil::SetEnableTracking(FLAGS_enable_thread_tracking);
988
1077
  if (FLAGS_use_multi_get_entity) {
989
1078
  constexpr uint64_t max_batch_size = 64;
990
1079
  const uint64_t batch_size = std::min(
@@ -995,12 +1084,14 @@ void StressTest::OperateDb(ThreadState* thread) {
995
1084
  assert(i + batch_size <= ops_per_open);
996
1085
 
997
1086
  rand_keys = GenerateNKeys(thread, static_cast<int>(batch_size), i);
998
-
1087
+ ThreadStatusUtil::SetThreadOperation(
1088
+ ThreadStatus::OperationType::OP_MULTIGETENTITY);
999
1089
  TestMultiGetEntity(thread, read_opts, rand_column_families,
1000
1090
  rand_keys);
1001
-
1002
1091
  i += batch_size - 1;
1003
1092
  } else if (FLAGS_use_get_entity) {
1093
+ ThreadStatusUtil::SetThreadOperation(
1094
+ ThreadStatus::OperationType::OP_GETENTITY);
1004
1095
  TestGetEntity(thread, read_opts, rand_column_families, rand_keys);
1005
1096
  } else if (FLAGS_use_multiget) {
1006
1097
  // Leave room for one more iteration of the loop with a single key
@@ -1012,11 +1103,16 @@ void StressTest::OperateDb(ThreadState* thread) {
1012
1103
  // If its the last iteration, ensure that multiget_batch_size is 1
1013
1104
  multiget_batch_size = std::max(multiget_batch_size, 1);
1014
1105
  rand_keys = GenerateNKeys(thread, multiget_batch_size, i);
1106
+ ThreadStatusUtil::SetThreadOperation(
1107
+ ThreadStatus::OperationType::OP_MULTIGET);
1015
1108
  TestMultiGet(thread, read_opts, rand_column_families, rand_keys);
1016
1109
  i += multiget_batch_size - 1;
1017
1110
  } else {
1111
+ ThreadStatusUtil::SetThreadOperation(
1112
+ ThreadStatus::OperationType::OP_GET);
1018
1113
  TestGet(thread, read_opts, rand_column_families, rand_keys);
1019
1114
  }
1115
+ ThreadStatusUtil::ResetThreadStatus();
1020
1116
  } else if (prob_op < prefix_bound) {
1021
1117
  assert(static_cast<int>(FLAGS_readpercent) <= prob_op);
1022
1118
  // OPERATION prefix scan
@@ -1044,8 +1140,12 @@ void StressTest::OperateDb(ThreadState* thread) {
1044
1140
  if (!FLAGS_skip_verifydb &&
1045
1141
  thread->rand.OneInOpt(
1046
1142
  FLAGS_verify_iterator_with_expected_state_one_in)) {
1143
+ ThreadStatusUtil::SetEnableTracking(FLAGS_enable_thread_tracking);
1144
+ ThreadStatusUtil::SetThreadOperation(
1145
+ ThreadStatus::OperationType::OP_DBITERATOR);
1047
1146
  TestIterateAgainstExpected(thread, read_opts, rand_column_families,
1048
1147
  rand_keys);
1148
+ ThreadStatusUtil::ResetThreadStatus();
1049
1149
  } else {
1050
1150
  int num_seeks = static_cast<int>(std::min(
1051
1151
  std::max(static_cast<uint64_t>(thread->rand.Uniform(4)),
@@ -1054,7 +1154,11 @@ void StressTest::OperateDb(ThreadState* thread) {
1054
1154
  static_cast<uint64_t>(1))));
1055
1155
  rand_keys = GenerateNKeys(thread, num_seeks, i);
1056
1156
  i += num_seeks - 1;
1157
+ ThreadStatusUtil::SetEnableTracking(FLAGS_enable_thread_tracking);
1158
+ ThreadStatusUtil::SetThreadOperation(
1159
+ ThreadStatus::OperationType::OP_DBITERATOR);
1057
1160
  TestIterate(thread, read_opts, rand_column_families, rand_keys);
1161
+ ThreadStatusUtil::ResetThreadStatus();
1058
1162
  }
1059
1163
  } else {
1060
1164
  assert(iterate_bound <= prob_op);
@@ -1161,7 +1265,6 @@ Status StressTest::TestIterate(ThreadState* thread,
1161
1265
  } else if (options_.prefix_extractor.get() == nullptr) {
1162
1266
  expect_total_order = true;
1163
1267
  }
1164
-
1165
1268
  std::string upper_bound_str;
1166
1269
  Slice upper_bound;
1167
1270
  if (thread->rand.OneIn(16)) {
@@ -1172,6 +1275,7 @@ Status StressTest::TestIterate(ThreadState* thread,
1172
1275
  upper_bound = Slice(upper_bound_str);
1173
1276
  ro.iterate_upper_bound = &upper_bound;
1174
1277
  }
1278
+
1175
1279
  std::string lower_bound_str;
1176
1280
  Slice lower_bound;
1177
1281
  if (thread->rand.OneIn(16)) {
@@ -1266,6 +1370,14 @@ Status StressTest::TestIterate(ThreadState* thread,
1266
1370
 
1267
1371
  const bool support_seek_first_or_last = expect_total_order;
1268
1372
 
1373
+ // Write-prepared and Write-unprepared do not support Refresh() yet.
1374
+ if (!(FLAGS_use_txn && FLAGS_txn_write_policy != 0 /* write committed */) &&
1375
+ thread->rand.OneIn(4)) {
1376
+ Status s = iter->Refresh(snapshot_guard.snapshot());
1377
+ assert(s.ok());
1378
+ op_logs += "Refresh ";
1379
+ }
1380
+
1269
1381
  LastIterateOp last_op;
1270
1382
  if (support_seek_first_or_last && thread->rand.OneIn(100)) {
1271
1383
  iter->SeekToFirst();
@@ -1481,7 +1593,8 @@ void StressTest::VerifyIterator(ThreadState* thread,
1481
1593
  fprintf(stderr, "iterator has value %s\n",
1482
1594
  iter->key().ToString(true).c_str());
1483
1595
  } else {
1484
- fprintf(stderr, "iterator is not valid\n");
1596
+ fprintf(stderr, "iterator is not valid with status: %s\n",
1597
+ iter->status().ToString().c_str());
1485
1598
  }
1486
1599
  *diverged = true;
1487
1600
  }
@@ -1769,7 +1882,7 @@ Status StressTest::TestBackupRestore(
1769
1882
  from = "Destroy restore dir";
1770
1883
  }
1771
1884
  }
1772
- if (!s.ok()) {
1885
+ if (!s.ok() && (!s.IsIOError() || !std::strstr(s.getState(), "injected"))) {
1773
1886
  fprintf(stderr, "Failure in %s with: %s\n", from.c_str(),
1774
1887
  s.ToString().c_str());
1775
1888
  }
@@ -1845,17 +1958,19 @@ Status StressTest::TestCheckpoint(ThreadState* thread,
1845
1958
  if (s.ok()) {
1846
1959
  s = checkpoint->CreateCheckpoint(checkpoint_dir);
1847
1960
  if (!s.ok()) {
1848
- fprintf(stderr, "Fail to create checkpoint to %s\n",
1849
- checkpoint_dir.c_str());
1850
- std::vector<std::string> files;
1851
- Status my_s = db_stress_env->GetChildren(checkpoint_dir, &files);
1852
- if (my_s.ok()) {
1853
- for (const auto& f : files) {
1854
- fprintf(stderr, " %s\n", f.c_str());
1961
+ if (!s.IsIOError() || !std::strstr(s.getState(), "injected")) {
1962
+ fprintf(stderr, "Fail to create checkpoint to %s\n",
1963
+ checkpoint_dir.c_str());
1964
+ std::vector<std::string> files;
1965
+ Status my_s = db_stress_env->GetChildren(checkpoint_dir, &files);
1966
+ if (my_s.ok()) {
1967
+ for (const auto& f : files) {
1968
+ fprintf(stderr, " %s\n", f.c_str());
1969
+ }
1970
+ } else {
1971
+ fprintf(stderr, "Fail to get files under the directory to %s\n",
1972
+ my_s.ToString().c_str());
1855
1973
  }
1856
- } else {
1857
- fprintf(stderr, "Fail to get files under the directory to %s\n",
1858
- my_s.ToString().c_str());
1859
1974
  }
1860
1975
  }
1861
1976
  }
@@ -1931,8 +2046,10 @@ Status StressTest::TestCheckpoint(ThreadState* thread,
1931
2046
  }
1932
2047
 
1933
2048
  if (!s.ok()) {
1934
- fprintf(stderr, "A checkpoint operation failed with: %s\n",
1935
- s.ToString().c_str());
2049
+ if (!s.IsIOError() || !std::strstr(s.getState(), "injected")) {
2050
+ fprintf(stderr, "A checkpoint operation failed with: %s\n",
2051
+ s.ToString().c_str());
2052
+ }
1936
2053
  } else {
1937
2054
  DestroyDB(checkpoint_dir, tmp_opts);
1938
2055
  }
@@ -2311,24 +2428,39 @@ void StressTest::PrintEnv() const {
2311
2428
  fprintf(stdout, "Format version : %d\n", FLAGS_format_version);
2312
2429
  fprintf(stdout, "TransactionDB : %s\n",
2313
2430
  FLAGS_use_txn ? "true" : "false");
2314
-
2315
2431
  if (FLAGS_use_txn) {
2316
- fprintf(stdout, "Two write queues: : %s\n",
2317
- FLAGS_two_write_queues ? "true" : "false");
2318
- fprintf(stdout, "Write policy : %d\n",
2319
- static_cast<int>(FLAGS_txn_write_policy));
2320
- if (static_cast<uint64_t>(TxnDBWritePolicy::WRITE_PREPARED) ==
2321
- FLAGS_txn_write_policy ||
2322
- static_cast<uint64_t>(TxnDBWritePolicy::WRITE_UNPREPARED) ==
2323
- FLAGS_txn_write_policy) {
2324
- fprintf(stdout, "Snapshot cache bits : %d\n",
2325
- static_cast<int>(FLAGS_wp_snapshot_cache_bits));
2326
- fprintf(stdout, "Commit cache bits : %d\n",
2327
- static_cast<int>(FLAGS_wp_commit_cache_bits));
2328
- }
2329
- fprintf(stdout, "last cwb for recovery : %s\n",
2330
- FLAGS_use_only_the_last_commit_time_batch_for_recovery ? "true"
2331
- : "false");
2432
+ fprintf(stdout, "TransactionDB Type : %s\n",
2433
+ FLAGS_use_optimistic_txn ? "Optimistic" : "Pessimistic");
2434
+ if (FLAGS_use_optimistic_txn) {
2435
+ fprintf(stdout, "OCC Validation Type : %d\n",
2436
+ static_cast<int>(FLAGS_occ_validation_policy));
2437
+ if (static_cast<uint64_t>(OccValidationPolicy::kValidateParallel) ==
2438
+ FLAGS_occ_validation_policy) {
2439
+ fprintf(stdout, "Share Lock Buckets : %s\n",
2440
+ FLAGS_share_occ_lock_buckets ? "true" : "false");
2441
+ if (FLAGS_share_occ_lock_buckets) {
2442
+ fprintf(stdout, "Lock Bucket Count : %d\n",
2443
+ static_cast<int>(FLAGS_occ_lock_bucket_count));
2444
+ }
2445
+ }
2446
+ } else {
2447
+ fprintf(stdout, "Two write queues: : %s\n",
2448
+ FLAGS_two_write_queues ? "true" : "false");
2449
+ fprintf(stdout, "Write policy : %d\n",
2450
+ static_cast<int>(FLAGS_txn_write_policy));
2451
+ if (static_cast<uint64_t>(TxnDBWritePolicy::WRITE_PREPARED) ==
2452
+ FLAGS_txn_write_policy ||
2453
+ static_cast<uint64_t>(TxnDBWritePolicy::WRITE_UNPREPARED) ==
2454
+ FLAGS_txn_write_policy) {
2455
+ fprintf(stdout, "Snapshot cache bits : %d\n",
2456
+ static_cast<int>(FLAGS_wp_snapshot_cache_bits));
2457
+ fprintf(stdout, "Commit cache bits : %d\n",
2458
+ static_cast<int>(FLAGS_wp_commit_cache_bits));
2459
+ }
2460
+ fprintf(stdout, "last cwb for recovery : %s\n",
2461
+ FLAGS_use_only_the_last_commit_time_batch_for_recovery ? "true"
2462
+ : "false");
2463
+ }
2332
2464
  }
2333
2465
 
2334
2466
  fprintf(stdout, "Stacked BlobDB : %s\n",
@@ -2396,6 +2528,8 @@ void StressTest::PrintEnv() const {
2396
2528
  FLAGS_use_get_entity ? "true" : "false");
2397
2529
  fprintf(stdout, "Use MultiGetEntity : %s\n",
2398
2530
  FLAGS_use_multi_get_entity ? "true" : "false");
2531
+ fprintf(stdout, "Verification only : %s\n",
2532
+ FLAGS_verification_only ? "true" : "false");
2399
2533
 
2400
2534
  const char* memtablerep = "";
2401
2535
  switch (FLAGS_rep_factory) {
@@ -2474,9 +2608,10 @@ void StressTest::PrintEnv() const {
2474
2608
  fprintf(stdout, "------------------------------------------------\n");
2475
2609
  }
2476
2610
 
2477
- void StressTest::Open(SharedState* shared) {
2611
+ void StressTest::Open(SharedState* shared, bool reopen) {
2478
2612
  assert(db_ == nullptr);
2479
2613
  assert(txn_db_ == nullptr);
2614
+ assert(optimistic_txn_db_ == nullptr);
2480
2615
  if (!InitializeOptionsFromFile(options_)) {
2481
2616
  InitializeOptionsFromFlags(cache_, filter_policy_, options_);
2482
2617
  }
@@ -2591,15 +2726,20 @@ void StressTest::Open(SharedState* shared) {
2591
2726
  FLAGS_db, options_.db_paths, cf_descriptors, db_stress_listener_env));
2592
2727
  RegisterAdditionalListeners();
2593
2728
 
2729
+ // If this is for DB reopen, write error injection may have been enabled.
2730
+ // Disable it here in case there is no open fault injection.
2731
+ if (fault_fs_guard) {
2732
+ fault_fs_guard->DisableWriteErrorInjection();
2733
+ }
2594
2734
  if (!FLAGS_use_txn) {
2595
- // Determine whether we need to ingest file metadata write failures
2735
+ // Determine whether we need to inject file metadata write failures
2596
2736
  // during DB reopen. If it does, enable it.
2597
- // Only ingest metadata error if it is reopening, as initial open
2737
+ // Only inject metadata error if it is reopening, as initial open
2598
2738
  // failure doesn't need to be handled.
2599
2739
  // TODO cover transaction DB is not covered in this fault test too.
2600
- bool ingest_meta_error = false;
2601
- bool ingest_write_error = false;
2602
- bool ingest_read_error = false;
2740
+ bool inject_meta_error = false;
2741
+ bool inject_write_error = false;
2742
+ bool inject_read_error = false;
2603
2743
  if ((FLAGS_open_metadata_write_fault_one_in ||
2604
2744
  FLAGS_open_write_fault_one_in || FLAGS_open_read_fault_one_in) &&
2605
2745
  fault_fs_guard
@@ -2610,25 +2750,25 @@ void StressTest::Open(SharedState* shared) {
2610
2750
  // WAL is durable. Buffering unsynced writes will cause false
2611
2751
  // positive in crash tests. Before we figure out a way to
2612
2752
  // solve it, skip WAL from failure injection.
2613
- fault_fs_guard->SetSkipDirectWritableTypes({kWalFile});
2753
+ fault_fs_guard->SetDirectWritableTypes({kWalFile});
2614
2754
  }
2615
- ingest_meta_error = FLAGS_open_metadata_write_fault_one_in;
2616
- ingest_write_error = FLAGS_open_write_fault_one_in;
2617
- ingest_read_error = FLAGS_open_read_fault_one_in;
2618
- if (ingest_meta_error) {
2755
+ inject_meta_error = FLAGS_open_metadata_write_fault_one_in;
2756
+ inject_write_error = FLAGS_open_write_fault_one_in;
2757
+ inject_read_error = FLAGS_open_read_fault_one_in;
2758
+ if (inject_meta_error) {
2619
2759
  fault_fs_guard->EnableMetadataWriteErrorInjection();
2620
2760
  fault_fs_guard->SetRandomMetadataWriteError(
2621
2761
  FLAGS_open_metadata_write_fault_one_in);
2622
2762
  }
2623
- if (ingest_write_error) {
2763
+ if (inject_write_error) {
2624
2764
  fault_fs_guard->SetFilesystemDirectWritable(false);
2625
2765
  fault_fs_guard->EnableWriteErrorInjection();
2626
2766
  fault_fs_guard->SetRandomWriteError(
2627
2767
  static_cast<uint32_t>(FLAGS_seed), FLAGS_open_write_fault_one_in,
2628
- IOStatus::IOError("Injected Open Error"),
2768
+ IOStatus::IOError("Injected Open Write Error"),
2629
2769
  /*inject_for_all_file_types=*/true, /*types=*/{});
2630
2770
  }
2631
- if (ingest_read_error) {
2771
+ if (inject_read_error) {
2632
2772
  fault_fs_guard->SetRandomReadError(FLAGS_open_read_fault_one_in);
2633
2773
  }
2634
2774
  }
@@ -2649,8 +2789,7 @@ void StressTest::Open(SharedState* shared) {
2649
2789
  if (s.ok()) {
2650
2790
  db_ = blob_db;
2651
2791
  }
2652
- } else
2653
- {
2792
+ } else {
2654
2793
  if (db_preload_finished_.load() && FLAGS_read_only) {
2655
2794
  s = DB::OpenForReadOnly(DBOptions(options_), FLAGS_db,
2656
2795
  cf_descriptors, &column_families_, &db_);
@@ -2660,18 +2799,19 @@ void StressTest::Open(SharedState* shared) {
2660
2799
  }
2661
2800
  }
2662
2801
 
2663
- if (ingest_meta_error || ingest_write_error || ingest_read_error) {
2802
+ if (inject_meta_error || inject_write_error || inject_read_error) {
2803
+ // TODO: re-enable write error injection after reopen. Same for
2804
+ // sync fault injection.
2664
2805
  fault_fs_guard->SetFilesystemDirectWritable(true);
2665
2806
  fault_fs_guard->DisableMetadataWriteErrorInjection();
2666
2807
  fault_fs_guard->DisableWriteErrorInjection();
2667
- fault_fs_guard->SetSkipDirectWritableTypes({});
2808
+ fault_fs_guard->SetDirectWritableTypes({});
2668
2809
  fault_fs_guard->SetRandomReadError(0);
2669
2810
  if (s.ok()) {
2670
- // Ingested errors might happen in background compactions. We
2811
+ // Injected errors might happen in background compactions. We
2671
2812
  // wait for all compactions to finish to make sure DB is in
2672
2813
  // clean state before executing queries.
2673
- s = static_cast_with_check<DBImpl>(db_->GetRootDB())
2674
- ->WaitForCompact();
2814
+ s = db_->GetRootDB()->WaitForCompact(WaitForCompactOptions());
2675
2815
  if (!s.ok()) {
2676
2816
  for (auto cf : column_families_) {
2677
2817
  delete cf;
@@ -2685,19 +2825,24 @@ void StressTest::Open(SharedState* shared) {
2685
2825
  // After failure to opening a DB due to IO error, retry should
2686
2826
  // successfully open the DB with correct data if no IO error shows
2687
2827
  // up.
2688
- ingest_meta_error = false;
2689
- ingest_write_error = false;
2690
- ingest_read_error = false;
2691
-
2692
- Random rand(static_cast<uint32_t>(FLAGS_seed));
2693
- if (rand.OneIn(2)) {
2694
- fault_fs_guard->DeleteFilesCreatedAfterLastDirSync(IOOptions(),
2695
- nullptr);
2696
- }
2697
- if (rand.OneIn(3)) {
2698
- fault_fs_guard->DropUnsyncedFileData();
2699
- } else if (rand.OneIn(2)) {
2700
- fault_fs_guard->DropRandomUnsyncedFileData(&rand);
2828
+ inject_meta_error = false;
2829
+ inject_write_error = false;
2830
+ inject_read_error = false;
2831
+
2832
+ // TODO: Unsynced data loss during DB reopen is not supported yet in
2833
+ // stress test. Will need to recreate expected state if we decide
2834
+ // to support unsynced data loss during DB reopen.
2835
+ if (!reopen) {
2836
+ Random rand(static_cast<uint32_t>(FLAGS_seed));
2837
+ if (rand.OneIn(2)) {
2838
+ fault_fs_guard->DeleteFilesCreatedAfterLastDirSync(IOOptions(),
2839
+ nullptr);
2840
+ }
2841
+ if (rand.OneIn(3)) {
2842
+ fault_fs_guard->DropUnsyncedFileData();
2843
+ } else if (rand.OneIn(2)) {
2844
+ fault_fs_guard->DropRandomUnsyncedFileData(&rand);
2845
+ }
2701
2846
  }
2702
2847
  continue;
2703
2848
  }
@@ -2705,36 +2850,65 @@ void StressTest::Open(SharedState* shared) {
2705
2850
  break;
2706
2851
  }
2707
2852
  } else {
2708
- TransactionDBOptions txn_db_options;
2709
- assert(FLAGS_txn_write_policy <= TxnDBWritePolicy::WRITE_UNPREPARED);
2710
- txn_db_options.write_policy =
2711
- static_cast<TxnDBWritePolicy>(FLAGS_txn_write_policy);
2712
- if (FLAGS_unordered_write) {
2713
- assert(txn_db_options.write_policy == TxnDBWritePolicy::WRITE_PREPARED);
2714
- options_.unordered_write = true;
2715
- options_.two_write_queues = true;
2716
- txn_db_options.skip_concurrency_control = true;
2853
+ if (FLAGS_use_optimistic_txn) {
2854
+ OptimisticTransactionDBOptions optimistic_txn_db_options;
2855
+ optimistic_txn_db_options.validate_policy =
2856
+ static_cast<OccValidationPolicy>(FLAGS_occ_validation_policy);
2857
+
2858
+ if (FLAGS_share_occ_lock_buckets) {
2859
+ optimistic_txn_db_options.shared_lock_buckets =
2860
+ MakeSharedOccLockBuckets(FLAGS_occ_lock_bucket_count);
2861
+ } else {
2862
+ optimistic_txn_db_options.occ_lock_buckets =
2863
+ FLAGS_occ_lock_bucket_count;
2864
+ optimistic_txn_db_options.shared_lock_buckets = nullptr;
2865
+ }
2866
+ s = OptimisticTransactionDB::Open(
2867
+ options_, optimistic_txn_db_options, FLAGS_db, cf_descriptors,
2868
+ &column_families_, &optimistic_txn_db_);
2869
+ if (!s.ok()) {
2870
+ fprintf(stderr, "Error in opening the OptimisticTransactionDB [%s]\n",
2871
+ s.ToString().c_str());
2872
+ fflush(stderr);
2873
+ }
2874
+ assert(s.ok());
2875
+ {
2876
+ db_ = optimistic_txn_db_;
2877
+ db_aptr_.store(optimistic_txn_db_, std::memory_order_release);
2878
+ }
2717
2879
  } else {
2718
- options_.two_write_queues = FLAGS_two_write_queues;
2719
- }
2720
- txn_db_options.wp_snapshot_cache_bits =
2721
- static_cast<size_t>(FLAGS_wp_snapshot_cache_bits);
2722
- txn_db_options.wp_commit_cache_bits =
2723
- static_cast<size_t>(FLAGS_wp_commit_cache_bits);
2724
- PrepareTxnDbOptions(shared, txn_db_options);
2725
- s = TransactionDB::Open(options_, txn_db_options, FLAGS_db,
2726
- cf_descriptors, &column_families_, &txn_db_);
2727
- if (!s.ok()) {
2728
- fprintf(stderr, "Error in opening the TransactionDB [%s]\n",
2729
- s.ToString().c_str());
2730
- fflush(stderr);
2731
- }
2732
- assert(s.ok());
2880
+ TransactionDBOptions txn_db_options;
2881
+ assert(FLAGS_txn_write_policy <= TxnDBWritePolicy::WRITE_UNPREPARED);
2882
+ txn_db_options.write_policy =
2883
+ static_cast<TxnDBWritePolicy>(FLAGS_txn_write_policy);
2884
+ if (FLAGS_unordered_write) {
2885
+ assert(txn_db_options.write_policy ==
2886
+ TxnDBWritePolicy::WRITE_PREPARED);
2887
+ options_.unordered_write = true;
2888
+ options_.two_write_queues = true;
2889
+ txn_db_options.skip_concurrency_control = true;
2890
+ } else {
2891
+ options_.two_write_queues = FLAGS_two_write_queues;
2892
+ }
2893
+ txn_db_options.wp_snapshot_cache_bits =
2894
+ static_cast<size_t>(FLAGS_wp_snapshot_cache_bits);
2895
+ txn_db_options.wp_commit_cache_bits =
2896
+ static_cast<size_t>(FLAGS_wp_commit_cache_bits);
2897
+ PrepareTxnDbOptions(shared, txn_db_options);
2898
+ s = TransactionDB::Open(options_, txn_db_options, FLAGS_db,
2899
+ cf_descriptors, &column_families_, &txn_db_);
2900
+ if (!s.ok()) {
2901
+ fprintf(stderr, "Error in opening the TransactionDB [%s]\n",
2902
+ s.ToString().c_str());
2903
+ fflush(stderr);
2904
+ }
2905
+ assert(s.ok());
2733
2906
 
2734
- // Do not swap the order of the following.
2735
- {
2736
- db_ = txn_db_;
2737
- db_aptr_.store(txn_db_, std::memory_order_release);
2907
+ // Do not swap the order of the following.
2908
+ {
2909
+ db_ = txn_db_;
2910
+ db_aptr_.store(txn_db_, std::memory_order_release);
2911
+ }
2738
2912
  }
2739
2913
  }
2740
2914
  if (!s.ok()) {
@@ -2812,16 +2986,18 @@ void StressTest::Reopen(ThreadState* thread) {
2812
2986
  }
2813
2987
  assert(s.ok());
2814
2988
  }
2815
- assert(txn_db_ == nullptr || db_ == txn_db_);
2989
+ assert((txn_db_ == nullptr && optimistic_txn_db_ == nullptr) ||
2990
+ (db_ == txn_db_ || db_ == optimistic_txn_db_));
2816
2991
  delete db_;
2817
2992
  db_ = nullptr;
2818
2993
  txn_db_ = nullptr;
2994
+ optimistic_txn_db_ = nullptr;
2819
2995
 
2820
2996
  num_times_reopened_++;
2821
2997
  auto now = clock_->NowMicros();
2822
2998
  fprintf(stdout, "%s Reopening database for the %dth time\n",
2823
2999
  clock_->TimeToString(now / 1000000).c_str(), num_times_reopened_);
2824
- Open(thread->shared);
3000
+ Open(thread->shared, /*reopen=*/true);
2825
3001
 
2826
3002
  if ((FLAGS_sync_fault_injection || FLAGS_disable_wal ||
2827
3003
  FLAGS_manual_wal_flush_one_in > 0) &&
@@ -3031,6 +3207,10 @@ void InitializeOptionsFromFlags(
3031
3207
  FLAGS_max_write_buffer_size_to_maintain;
3032
3208
  options.memtable_prefix_bloom_size_ratio =
3033
3209
  FLAGS_memtable_prefix_bloom_size_ratio;
3210
+ if (FLAGS_use_write_buffer_manager) {
3211
+ options.write_buffer_manager.reset(
3212
+ new WriteBufferManager(FLAGS_db_write_buffer_size, block_cache));
3213
+ }
3034
3214
  options.memtable_whole_key_filtering = FLAGS_memtable_whole_key_filtering;
3035
3215
  options.disable_auto_compactions = FLAGS_disable_auto_compactions;
3036
3216
  options.max_background_compactions = FLAGS_max_background_compactions;
@@ -3087,6 +3267,9 @@ void InitializeOptionsFromFlags(
3087
3267
  "cannot be used because ZSTD 1.4.5+ is not linked with the binary."
3088
3268
  " zstd dictionary trainer will be used.\n");
3089
3269
  }
3270
+ if (FLAGS_compression_checksum) {
3271
+ options.compression_opts.checksum = true;
3272
+ }
3090
3273
  options.max_manifest_file_size = FLAGS_max_manifest_file_size;
3091
3274
  options.inplace_update_support = FLAGS_in_place_update;
3092
3275
  options.max_subcompactions = static_cast<uint32_t>(FLAGS_subcompactions);
@@ -3191,7 +3374,11 @@ void InitializeOptionsFromFlags(
3191
3374
  if (FLAGS_use_full_merge_v1) {
3192
3375
  options.merge_operator = MergeOperators::CreateDeprecatedPutOperator();
3193
3376
  } else {
3194
- options.merge_operator = MergeOperators::CreatePutOperator();
3377
+ if (FLAGS_use_put_entity_one_in > 0) {
3378
+ options.merge_operator = std::make_shared<DBStressWideMergeOperator>();
3379
+ } else {
3380
+ options.merge_operator = MergeOperators::CreatePutOperator();
3381
+ }
3195
3382
  }
3196
3383
 
3197
3384
  if (FLAGS_enable_compaction_filter) {
@@ -3210,6 +3397,11 @@ void InitializeOptionsFromFlags(
3210
3397
  options.allow_data_in_errors = FLAGS_allow_data_in_errors;
3211
3398
 
3212
3399
  options.enable_thread_tracking = FLAGS_enable_thread_tracking;
3400
+
3401
+ options.memtable_max_range_deletions = FLAGS_memtable_max_range_deletions;
3402
+
3403
+ options.bottommost_file_compaction_delay =
3404
+ FLAGS_bottommost_file_compaction_delay;
3213
3405
  }
3214
3406
 
3215
3407
  void InitializeOptionsGeneral(