@nxtedition/rocksdb 7.1.20 → 7.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -6
  2. package/deps/rocksdb/rocksdb/Makefile +1 -1
  3. package/deps/rocksdb/rocksdb/TARGETS +2 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
  11. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
  13. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
  15. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
  19. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
  27. package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
  29. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
  46. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  47. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  48. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
  49. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
  50. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
  51. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
  60. package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
  61. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
  62. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
  64. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
  65. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
  67. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
  72. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
  73. package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
  74. package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
  75. package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
  76. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
  77. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
  78. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
  79. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
  80. package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
  82. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
  83. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
  84. package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
  85. package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
  86. package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
  87. package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
  88. package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
  89. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  91. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
  92. package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
  93. package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
  94. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
  95. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
  96. package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
  97. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
  98. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
  99. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  100. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  101. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
  102. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
  103. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
  104. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
  105. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
  106. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
  108. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
  109. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
  110. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
  111. package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
  112. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
  113. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
  114. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
  115. package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
  116. package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
  117. package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
  118. package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
  119. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
  120. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
  121. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
  122. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
  123. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
  124. package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
  125. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
  126. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
  127. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
  130. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
  140. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
  142. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
  143. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
  144. package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
  145. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
  146. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
  147. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
  148. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
  149. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
  150. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
  152. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
  153. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
  154. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
  155. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
  157. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
  160. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
  162. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  164. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
  165. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
  166. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  167. package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
  168. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
  169. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  170. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  171. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  172. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  174. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  175. package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
  176. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
  177. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  178. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  179. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
  180. package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
  181. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  182. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  183. package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
  184. package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
  185. package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
  186. package/deps/rocksdb/rocksdb/src.mk +1 -0
  187. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
  188. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
  189. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
  192. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
  195. package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
  196. package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
  197. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
  198. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
  199. package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
  200. package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
  201. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
  202. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
  203. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
  204. package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
  205. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
  206. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
  207. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  208. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
  209. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
  210. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  211. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
  212. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
  213. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
  214. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
  215. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
  216. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
  217. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
  218. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
  219. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
  220. package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
  221. package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
  222. package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
  223. package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
  224. package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
  225. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
  226. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
  227. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
  228. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
  229. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
  230. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
  231. package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
  232. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
  233. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
  234. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
  235. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
  236. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
  237. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
  239. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
  240. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
  241. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
  242. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
  243. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
  244. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
  245. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
  246. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
  247. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
  248. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
  249. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
  250. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
  251. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
  252. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
  253. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
  254. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
  255. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
  256. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
  257. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
  258. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
  259. package/index.js +12 -4
  260. package/package.json +1 -1
  261. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  262. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -8,6 +8,8 @@
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
  //
10
10
 
11
+ #include <ios>
12
+
11
13
  #include "util/compression.h"
12
14
  #ifdef GFLAGS
13
15
  #include "cache/fast_lru_cache.h"
@@ -21,6 +23,7 @@
21
23
  #include "rocksdb/sst_file_manager.h"
22
24
  #include "rocksdb/types.h"
23
25
  #include "rocksdb/utilities/object_registry.h"
26
+ #include "rocksdb/utilities/write_batch_with_index.h"
24
27
  #include "test_util/testutil.h"
25
28
  #include "util/cast_util.h"
26
29
  #include "utilities/backup/backup_engine_impl.h"
@@ -309,7 +312,15 @@ void StressTest::FinishInitDb(SharedState* shared) {
309
312
  exit(1);
310
313
  }
311
314
  }
312
-
315
+ #ifndef ROCKSDB_LITE
316
+ if (FLAGS_use_txn) {
317
+ // It's OK here without sync because unsynced data cannot be lost at this
318
+ // point
319
+ // - even with sync_fault_injection=1 as the
320
+ // file is still directly writable until after FinishInitDb()
321
+ ProcessRecoveredPreparedTxns(shared);
322
+ }
323
+ #endif
313
324
  if (FLAGS_enable_compaction_filter) {
314
325
  auto* compaction_filter_factory =
315
326
  reinterpret_cast<DbStressCompactionFilterFactory*>(
@@ -325,7 +336,14 @@ void StressTest::FinishInitDb(SharedState* shared) {
325
336
  }
326
337
 
327
338
  void StressTest::TrackExpectedState(SharedState* shared) {
328
- if ((FLAGS_sync_fault_injection || FLAGS_disable_wal) && IsStateTracked()) {
339
+ // For `FLAGS_manual_wal_flush_one_inWAL`
340
+ // data can be lost when `manual_wal_flush_one_in > 0` and `FlushWAL()` is not
341
+ // explictly called by users of RocksDB (in our case, db stress).
342
+ // Therefore recovery from such potential WAL data loss is a prefix recovery
343
+ // that requires tracing
344
+ if ((FLAGS_sync_fault_injection || FLAGS_disable_wal ||
345
+ FLAGS_manual_wal_flush_one_in > 0) &&
346
+ IsStateTracked()) {
329
347
  Status s = shared->SaveAtAndAfter(db_);
330
348
  if (!s.ok()) {
331
349
  fprintf(stderr, "Error enabling history tracing: %s\n",
@@ -422,6 +440,53 @@ void StressTest::VerificationAbort(SharedState* shared, std::string msg, int cf,
422
440
  shared->SetVerificationFailure();
423
441
  }
424
442
 
443
+ void StressTest::VerificationAbort(SharedState* shared, int cf, int64_t key,
444
+ const Slice& value,
445
+ const WideColumns& columns,
446
+ const WideColumns& expected_columns) const {
447
+ assert(shared);
448
+
449
+ auto key_str = Key(key);
450
+
451
+ fprintf(stderr,
452
+ "Verification failed for column family %d key %s (%" PRIi64
453
+ "): Value and columns inconsistent: %s\n",
454
+ cf, Slice(key_str).ToString(/* hex */ true).c_str(), key,
455
+ DebugString(value, columns, expected_columns).c_str());
456
+
457
+ shared->SetVerificationFailure();
458
+ }
459
+
460
+ std::string StressTest::DebugString(const Slice& value,
461
+ const WideColumns& columns,
462
+ const WideColumns& expected_columns) {
463
+ std::ostringstream oss;
464
+
465
+ oss << "value: " << value.ToString(/* hex */ true);
466
+
467
+ auto dump = [](const WideColumns& cols, std::ostream& os) {
468
+ if (cols.empty()) {
469
+ return;
470
+ }
471
+
472
+ os << std::hex;
473
+
474
+ auto it = cols.begin();
475
+ os << *it;
476
+ for (++it; it != cols.end(); ++it) {
477
+ os << ' ' << *it;
478
+ }
479
+ };
480
+
481
+ oss << ", columns: ";
482
+ dump(columns, oss);
483
+
484
+ oss << ", expected_columns: ";
485
+ dump(expected_columns, oss);
486
+
487
+ return oss.str();
488
+ }
489
+
425
490
  void StressTest::PrintStatistics() {
426
491
  if (dbstats) {
427
492
  fprintf(stdout, "STATISTICS:\n%s\n", dbstats->ToString().c_str());
@@ -448,11 +513,14 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
448
513
  Status s;
449
514
  for (auto cfh : column_families_) {
450
515
  for (int64_t k = 0; k != number_of_keys; ++k) {
451
- std::string key_str = Key(k);
452
- Slice key = key_str;
453
- size_t sz = GenerateValue(0 /*value_base*/, value, sizeof(value));
454
- Slice v(value, sz);
455
- shared->Put(cf_idx, k, 0, true /* pending */);
516
+ const std::string key = Key(k);
517
+
518
+ constexpr uint32_t value_base = 0;
519
+ const size_t sz = GenerateValue(value_base, value, sizeof(value));
520
+
521
+ const Slice v(value, sz);
522
+
523
+ shared->Put(cf_idx, k, value_base, true /* pending */);
456
524
 
457
525
  if (FLAGS_use_merge) {
458
526
  if (!FLAGS_use_txn) {
@@ -469,13 +537,13 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
469
537
  }
470
538
  #endif
471
539
  }
540
+ } else if (FLAGS_use_put_entity_one_in > 0) {
541
+ s = db_->PutEntity(write_opts, cfh, key,
542
+ GenerateWideColumns(value_base, v));
472
543
  } else {
473
544
  if (!FLAGS_use_txn) {
474
- std::string ts_str;
475
- Slice ts;
476
545
  if (FLAGS_user_timestamp_size > 0) {
477
- ts_str = GetNowNanos();
478
- ts = ts_str;
546
+ const std::string ts = GetNowNanos();
479
547
  s = db_->Put(write_opts, cfh, key, ts, v);
480
548
  } else {
481
549
  s = db_->Put(write_opts, cfh, key, v);
@@ -494,7 +562,7 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
494
562
  }
495
563
  }
496
564
 
497
- shared->Put(cf_idx, k, 0, false /* pending */);
565
+ shared->Put(cf_idx, k, value_base, false /* pending */);
498
566
  if (!s.ok()) {
499
567
  break;
500
568
  }
@@ -555,6 +623,42 @@ Status StressTest::SetOptions(ThreadState* thread) {
555
623
  }
556
624
 
557
625
  #ifndef ROCKSDB_LITE
626
+ void StressTest::ProcessRecoveredPreparedTxns(SharedState* shared) {
627
+ assert(txn_db_);
628
+ std::vector<Transaction*> recovered_prepared_trans;
629
+ txn_db_->GetAllPreparedTransactions(&recovered_prepared_trans);
630
+ for (Transaction* txn : recovered_prepared_trans) {
631
+ ProcessRecoveredPreparedTxnsHelper(txn, shared);
632
+ delete txn;
633
+ }
634
+ recovered_prepared_trans.clear();
635
+ txn_db_->GetAllPreparedTransactions(&recovered_prepared_trans);
636
+ assert(recovered_prepared_trans.size() == 0);
637
+ }
638
+
639
+ void StressTest::ProcessRecoveredPreparedTxnsHelper(Transaction* txn,
640
+ SharedState* shared) {
641
+ thread_local Random rand(static_cast<uint32_t>(FLAGS_seed));
642
+ for (size_t i = 0; i < column_families_.size(); ++i) {
643
+ std::unique_ptr<WBWIIterator> wbwi_iter(
644
+ txn->GetWriteBatch()->NewIterator(column_families_[i]));
645
+ for (wbwi_iter->SeekToFirst(); wbwi_iter->Valid(); wbwi_iter->Next()) {
646
+ uint64_t key_val;
647
+ if (GetIntVal(wbwi_iter->Entry().key.ToString(), &key_val)) {
648
+ shared->Put(static_cast<int>(i) /* cf_idx */, key_val,
649
+ 0 /* value_base */, true /* pending */);
650
+ }
651
+ }
652
+ }
653
+ if (rand.OneIn(2)) {
654
+ Status s = txn->Commit();
655
+ assert(s.ok());
656
+ } else {
657
+ Status s = txn->Rollback();
658
+ assert(s.ok());
659
+ }
660
+ }
661
+
558
662
  Status StressTest::NewTxn(WriteOptions& write_opts, Transaction** txn) {
559
663
  if (!FLAGS_use_txn) {
560
664
  return Status::InvalidArgument("NewTxn when FLAGS_use_txn is not set");
@@ -729,6 +833,15 @@ void StressTest::OperateDb(ThreadState* thread) {
729
833
 
730
834
  MaybeClearOneColumnFamily(thread);
731
835
 
836
+ if (thread->rand.OneInOpt(FLAGS_manual_wal_flush_one_in)) {
837
+ bool sync = thread->rand.OneIn(2) ? true : false;
838
+ Status s = db_->FlushWAL(sync);
839
+ if (!s.ok() && !(sync && s.IsNotSupported())) {
840
+ fprintf(stderr, "FlushWAL(sync=%s) failed: %s\n",
841
+ (sync ? "true" : "false"), s.ToString().c_str());
842
+ }
843
+ }
844
+
732
845
  if (thread->rand.OneInOpt(FLAGS_sync_wal_one_in)) {
733
846
  Status s = db_->SyncWAL();
734
847
  if (!s.ok() && !s.IsNotSupported()) {
@@ -871,15 +984,11 @@ void StressTest::OperateDb(ThreadState* thread) {
871
984
 
872
985
  // Assign timestamps if necessary.
873
986
  std::string read_ts_str;
874
- std::string write_ts_str;
875
987
  Slice read_ts;
876
- Slice write_ts;
877
988
  if (FLAGS_user_timestamp_size > 0) {
878
989
  read_ts_str = GetNowNanos();
879
990
  read_ts = read_ts_str;
880
991
  read_opts.timestamp = &read_ts;
881
- write_ts_str = GetNowNanos();
882
- write_ts = write_ts_str;
883
992
  }
884
993
 
885
994
  int prob_op = thread->rand.Uniform(100);
@@ -1024,24 +1133,26 @@ Status StressTest::TestIterate(ThreadState* thread,
1024
1133
  const ReadOptions& read_opts,
1025
1134
  const std::vector<int>& rand_column_families,
1026
1135
  const std::vector<int64_t>& rand_keys) {
1027
- Status s;
1028
- const Snapshot* snapshot = db_->GetSnapshot();
1029
- ReadOptions readoptionscopy = read_opts;
1030
- readoptionscopy.snapshot = snapshot;
1136
+ assert(!rand_column_families.empty());
1137
+ assert(!rand_keys.empty());
1138
+
1139
+ ManagedSnapshot snapshot_guard(db_);
1140
+
1141
+ ReadOptions ro = read_opts;
1142
+ ro.snapshot = snapshot_guard.snapshot();
1031
1143
 
1032
1144
  std::string read_ts_str;
1033
1145
  Slice read_ts_slice;
1034
- MaybeUseOlderTimestampForRangeScan(thread, read_ts_str, read_ts_slice,
1035
- readoptionscopy);
1146
+ MaybeUseOlderTimestampForRangeScan(thread, read_ts_str, read_ts_slice, ro);
1036
1147
 
1037
1148
  bool expect_total_order = false;
1038
1149
  if (thread->rand.OneIn(16)) {
1039
1150
  // When prefix extractor is used, it's useful to cover total order seek.
1040
- readoptionscopy.total_order_seek = true;
1151
+ ro.total_order_seek = true;
1041
1152
  expect_total_order = true;
1042
1153
  } else if (thread->rand.OneIn(4)) {
1043
- readoptionscopy.total_order_seek = false;
1044
- readoptionscopy.auto_prefix_mode = true;
1154
+ ro.total_order_seek = false;
1155
+ ro.auto_prefix_mode = true;
1045
1156
  expect_total_order = true;
1046
1157
  } else if (options_.prefix_extractor.get() == nullptr) {
1047
1158
  expect_total_order = true;
@@ -1050,101 +1161,106 @@ Status StressTest::TestIterate(ThreadState* thread,
1050
1161
  std::string upper_bound_str;
1051
1162
  Slice upper_bound;
1052
1163
  if (thread->rand.OneIn(16)) {
1053
- // in 1/16 chance, set a iterator upper bound
1054
- int64_t rand_upper_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
1164
+ // With a 1/16 chance, set an iterator upper bound.
1165
+ // Note: upper_bound can be smaller than the seek key.
1166
+ const int64_t rand_upper_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
1055
1167
  upper_bound_str = Key(rand_upper_key);
1056
1168
  upper_bound = Slice(upper_bound_str);
1057
- // uppder_bound can be smaller than seek key, but the query itself
1058
- // should not crash either.
1059
- readoptionscopy.iterate_upper_bound = &upper_bound;
1169
+ ro.iterate_upper_bound = &upper_bound;
1060
1170
  }
1061
1171
  std::string lower_bound_str;
1062
1172
  Slice lower_bound;
1063
1173
  if (thread->rand.OneIn(16)) {
1064
- // in 1/16 chance, enable iterator lower bound
1065
- int64_t rand_lower_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
1174
+ // With a 1/16 chance, enable iterator lower bound.
1175
+ // Note: lower_bound can be greater than the seek key.
1176
+ const int64_t rand_lower_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
1066
1177
  lower_bound_str = Key(rand_lower_key);
1067
1178
  lower_bound = Slice(lower_bound_str);
1068
- // uppder_bound can be smaller than seek key, but the query itself
1069
- // should not crash either.
1070
- readoptionscopy.iterate_lower_bound = &lower_bound;
1179
+ ro.iterate_lower_bound = &lower_bound;
1071
1180
  }
1072
1181
 
1073
- auto cfh = column_families_[rand_column_families[0]];
1074
- std::unique_ptr<Iterator> iter(db_->NewIterator(readoptionscopy, cfh));
1182
+ ColumnFamilyHandle* const cfh = column_families_[rand_column_families[0]];
1183
+ assert(cfh);
1184
+
1185
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ro, cfh));
1075
1186
 
1076
- std::vector<std::string> key_str;
1187
+ std::vector<std::string> key_strs;
1077
1188
  if (thread->rand.OneIn(16)) {
1078
1189
  // Generate keys close to lower or upper bound of SST files.
1079
- key_str = GetWhiteBoxKeys(thread, db_, cfh, rand_keys.size());
1190
+ key_strs = GetWhiteBoxKeys(thread, db_, cfh, rand_keys.size());
1080
1191
  }
1081
- if (key_str.empty()) {
1082
- // If key string is not geneerated using white block keys,
1083
- // Use randomized key passe in.
1192
+ if (key_strs.empty()) {
1193
+ // Use the random keys passed in.
1084
1194
  for (int64_t rkey : rand_keys) {
1085
- key_str.push_back(Key(rkey));
1195
+ key_strs.push_back(Key(rkey));
1086
1196
  }
1087
1197
  }
1088
1198
 
1089
1199
  std::string op_logs;
1090
- const size_t kOpLogsLimit = 10000;
1200
+ constexpr size_t kOpLogsLimit = 10000;
1091
1201
 
1092
- for (const std::string& skey : key_str) {
1202
+ for (const std::string& key_str : key_strs) {
1093
1203
  if (op_logs.size() > kOpLogsLimit) {
1094
1204
  // Shouldn't take too much memory for the history log. Clear it.
1095
1205
  op_logs = "(cleared...)\n";
1096
1206
  }
1097
1207
 
1098
- Slice key = skey;
1099
-
1100
- if (readoptionscopy.iterate_upper_bound != nullptr &&
1101
- thread->rand.OneIn(2)) {
1102
- // 1/2 chance, change the upper bound.
1103
- // It is possible that it is changed without first use, but there is no
1208
+ if (ro.iterate_upper_bound != nullptr && thread->rand.OneIn(2)) {
1209
+ // With a 1/2 chance, change the upper bound.
1210
+ // It is possible that it is changed before first use, but there is no
1104
1211
  // problem with that.
1105
- int64_t rand_upper_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
1212
+ const int64_t rand_upper_key =
1213
+ GenerateOneKey(thread, FLAGS_ops_per_thread);
1106
1214
  upper_bound_str = Key(rand_upper_key);
1107
1215
  upper_bound = Slice(upper_bound_str);
1108
- } else if (readoptionscopy.iterate_lower_bound != nullptr &&
1109
- thread->rand.OneIn(4)) {
1110
- // 1/4 chance, change the lower bound.
1111
- // It is possible that it is changed without first use, but there is no
1216
+ }
1217
+ if (ro.iterate_lower_bound != nullptr && thread->rand.OneIn(4)) {
1218
+ // With a 1/4 chance, change the lower bound.
1219
+ // It is possible that it is changed before first use, but there is no
1112
1220
  // problem with that.
1113
- int64_t rand_lower_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
1221
+ const int64_t rand_lower_key =
1222
+ GenerateOneKey(thread, FLAGS_ops_per_thread);
1114
1223
  lower_bound_str = Key(rand_lower_key);
1115
1224
  lower_bound = Slice(lower_bound_str);
1116
1225
  }
1117
1226
 
1118
- // Record some options to op_logs;
1227
+ // Record some options to op_logs
1119
1228
  op_logs += "total_order_seek: ";
1120
- op_logs += (readoptionscopy.total_order_seek ? "1 " : "0 ");
1229
+ op_logs += (ro.total_order_seek ? "1 " : "0 ");
1121
1230
  op_logs += "auto_prefix_mode: ";
1122
- op_logs += (readoptionscopy.auto_prefix_mode ? "1 " : "0 ");
1123
- if (readoptionscopy.iterate_upper_bound != nullptr) {
1231
+ op_logs += (ro.auto_prefix_mode ? "1 " : "0 ");
1232
+ if (ro.iterate_upper_bound != nullptr) {
1124
1233
  op_logs += "ub: " + upper_bound.ToString(true) + " ";
1125
1234
  }
1126
- if (readoptionscopy.iterate_lower_bound != nullptr) {
1235
+ if (ro.iterate_lower_bound != nullptr) {
1127
1236
  op_logs += "lb: " + lower_bound.ToString(true) + " ";
1128
1237
  }
1129
1238
 
1130
- // Set up an iterator and does the same without bounds and with total
1131
- // order seek and compare the results. This is to identify bugs related
1132
- // to bounds, prefix extractor or reseeking. Sometimes we are comparing
1133
- // iterators with the same set-up, and it doesn't hurt to check them
1134
- // to be equal.
1239
+ // Set up an iterator, perform the same operations without bounds and with
1240
+ // total order seek, and compare the results. This is to identify bugs
1241
+ // related to bounds, prefix extractor, or reseeking. Sometimes we are
1242
+ // comparing iterators with the same set-up, and it doesn't hurt to check
1243
+ // them to be equal.
1244
+ //
1135
1245
  // This `ReadOptions` is for validation purposes. Ignore
1136
1246
  // `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
1137
1247
  ReadOptions cmp_ro;
1138
- cmp_ro.timestamp = readoptionscopy.timestamp;
1139
- cmp_ro.iter_start_ts = readoptionscopy.iter_start_ts;
1140
- cmp_ro.snapshot = snapshot;
1248
+ cmp_ro.timestamp = ro.timestamp;
1249
+ cmp_ro.iter_start_ts = ro.iter_start_ts;
1250
+ cmp_ro.snapshot = snapshot_guard.snapshot();
1141
1251
  cmp_ro.total_order_seek = true;
1142
- ColumnFamilyHandle* cmp_cfh =
1252
+
1253
+ ColumnFamilyHandle* const cmp_cfh =
1143
1254
  GetControlCfh(thread, rand_column_families[0]);
1255
+ assert(cmp_cfh);
1256
+
1144
1257
  std::unique_ptr<Iterator> cmp_iter(db_->NewIterator(cmp_ro, cmp_cfh));
1258
+
1145
1259
  bool diverged = false;
1146
1260
 
1147
- bool support_seek_first_or_last = expect_total_order;
1261
+ Slice key(key_str);
1262
+
1263
+ const bool support_seek_first_or_last = expect_total_order;
1148
1264
 
1149
1265
  LastIterateOp last_op;
1150
1266
  if (support_seek_first_or_last && thread->rand.OneIn(100)) {
@@ -1168,12 +1284,13 @@ Status StressTest::TestIterate(ThreadState* thread,
1168
1284
  last_op = kLastOpSeek;
1169
1285
  op_logs += "S " + key.ToString(true) + " ";
1170
1286
  }
1171
- VerifyIterator(thread, cmp_cfh, readoptionscopy, iter.get(), cmp_iter.get(),
1172
- last_op, key, op_logs, &diverged);
1173
1287
 
1174
- bool no_reverse =
1288
+ VerifyIterator(thread, cmp_cfh, ro, iter.get(), cmp_iter.get(), last_op,
1289
+ key, op_logs, &diverged);
1290
+
1291
+ const bool no_reverse =
1175
1292
  (FLAGS_memtablerep == "prefix_hash" && !expect_total_order);
1176
- for (uint64_t i = 0; i < FLAGS_num_iterations && iter->Valid(); i++) {
1293
+ for (uint64_t i = 0; i < FLAGS_num_iterations && iter->Valid(); ++i) {
1177
1294
  if (no_reverse || thread->rand.OneIn(2)) {
1178
1295
  iter->Next();
1179
1296
  if (!diverged) {
@@ -1189,25 +1306,19 @@ Status StressTest::TestIterate(ThreadState* thread,
1189
1306
  }
1190
1307
  op_logs += "P";
1191
1308
  }
1309
+
1192
1310
  last_op = kLastOpNextOrPrev;
1193
- VerifyIterator(thread, cmp_cfh, readoptionscopy, iter.get(),
1194
- cmp_iter.get(), last_op, key, op_logs, &diverged);
1195
- }
1196
1311
 
1197
- if (s.ok()) {
1198
- thread->stats.AddIterations(1);
1199
- } else {
1200
- fprintf(stderr, "TestIterate error: %s\n", s.ToString().c_str());
1201
- thread->stats.AddErrors(1);
1202
- break;
1312
+ VerifyIterator(thread, cmp_cfh, ro, iter.get(), cmp_iter.get(), last_op,
1313
+ key, op_logs, &diverged);
1203
1314
  }
1204
1315
 
1316
+ thread->stats.AddIterations(1);
1317
+
1205
1318
  op_logs += "; ";
1206
1319
  }
1207
1320
 
1208
- db_->ReleaseSnapshot(snapshot);
1209
-
1210
- return s;
1321
+ return Status::OK();
1211
1322
  }
1212
1323
 
1213
1324
  #ifndef ROCKSDB_LITE
@@ -1243,6 +1354,8 @@ void StressTest::VerifyIterator(ThreadState* thread,
1243
1354
  Iterator* cmp_iter, LastIterateOp op,
1244
1355
  const Slice& seek_key,
1245
1356
  const std::string& op_logs, bool* diverged) {
1357
+ assert(diverged);
1358
+
1246
1359
  if (*diverged) {
1247
1360
  return;
1248
1361
  }
@@ -1372,6 +1485,21 @@ void StressTest::VerifyIterator(ThreadState* thread,
1372
1485
  }
1373
1486
  }
1374
1487
  }
1488
+
1489
+ if (!*diverged && iter->Valid()) {
1490
+ const Slice value_base_slice = GetValueBaseSlice(iter->value());
1491
+
1492
+ const WideColumns expected_columns = GenerateExpectedWideColumns(
1493
+ GetValueBase(value_base_slice), iter->value());
1494
+ if (iter->columns() != expected_columns) {
1495
+ fprintf(stderr, "Value and columns inconsistent for iterator: %s\n",
1496
+ DebugString(iter->value(), iter->columns(), expected_columns)
1497
+ .c_str());
1498
+
1499
+ *diverged = true;
1500
+ }
1501
+ }
1502
+
1375
1503
  if (*diverged) {
1376
1504
  fprintf(stderr, "Control CF %s\n", cmp_cfh->GetName().c_str());
1377
1505
  thread->stats.AddErrors(1);
@@ -2176,8 +2304,6 @@ uint32_t StressTest::GetRangeHash(ThreadState* thread, const Snapshot* snapshot,
2176
2304
  ColumnFamilyHandle* column_family,
2177
2305
  const Slice& start_key,
2178
2306
  const Slice& end_key) {
2179
- const std::string kCrcCalculatorSepearator = ";";
2180
- uint32_t crc = 0;
2181
2307
  // This `ReadOptions` is for validation purposes. Ignore
2182
2308
  // `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
2183
2309
  ReadOptions ro;
@@ -2190,15 +2316,29 @@ uint32_t StressTest::GetRangeHash(ThreadState* thread, const Snapshot* snapshot,
2190
2316
  ts = ts_str;
2191
2317
  ro.timestamp = &ts;
2192
2318
  }
2319
+
2193
2320
  std::unique_ptr<Iterator> it(db_->NewIterator(ro, column_family));
2321
+
2322
+ constexpr char kCrcCalculatorSepearator = ';';
2323
+
2324
+ uint32_t crc = 0;
2325
+
2194
2326
  for (it->Seek(start_key);
2195
2327
  it->Valid() && options_.comparator->Compare(it->key(), end_key) <= 0;
2196
2328
  it->Next()) {
2197
2329
  crc = crc32c::Extend(crc, it->key().data(), it->key().size());
2198
- crc = crc32c::Extend(crc, kCrcCalculatorSepearator.data(), 1);
2330
+ crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
2199
2331
  crc = crc32c::Extend(crc, it->value().data(), it->value().size());
2200
- crc = crc32c::Extend(crc, kCrcCalculatorSepearator.data(), 1);
2332
+ crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
2333
+
2334
+ for (const auto& column : it->columns()) {
2335
+ crc = crc32c::Extend(crc, column.name().data(), column.name().size());
2336
+ crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
2337
+ crc = crc32c::Extend(crc, column.value().data(), column.value().size());
2338
+ crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
2339
+ }
2201
2340
  }
2341
+
2202
2342
  if (!it->status().ok()) {
2203
2343
  fprintf(stderr, "Iterator non-OK when calculating range CRC: %s\n",
2204
2344
  it->status().ToString().c_str());
@@ -2206,6 +2346,7 @@ uint32_t StressTest::GetRangeHash(ThreadState* thread, const Snapshot* snapshot,
2206
2346
  // Fail fast to preserve the DB state.
2207
2347
  thread->shared->SetVerificationFailure();
2208
2348
  }
2349
+
2209
2350
  return crc;
2210
2351
  }
2211
2352
 
@@ -2245,6 +2386,8 @@ void StressTest::PrintEnv() const {
2245
2386
  FLAGS_read_only ? "true" : "false");
2246
2387
  fprintf(stdout, "Atomic flush : %s\n",
2247
2388
  FLAGS_atomic_flush ? "true" : "false");
2389
+ fprintf(stdout, "Manual WAL flush : %s\n",
2390
+ FLAGS_manual_wal_flush_one_in > 0 ? "true" : "false");
2248
2391
  fprintf(stdout, "Column families : %d\n", FLAGS_column_families);
2249
2392
  if (!FLAGS_test_batches_snapshots) {
2250
2393
  fprintf(stdout, "Clear CFs one in : %d\n",
@@ -2648,24 +2791,6 @@ void StressTest::Open(SharedState* shared) {
2648
2791
  db_ = txn_db_;
2649
2792
  db_aptr_.store(txn_db_, std::memory_order_release);
2650
2793
  }
2651
-
2652
- // after a crash, rollback to commit recovered transactions
2653
- std::vector<Transaction*> trans;
2654
- txn_db_->GetAllPreparedTransactions(&trans);
2655
- Random rand(static_cast<uint32_t>(FLAGS_seed));
2656
- for (auto txn : trans) {
2657
- if (rand.OneIn(2)) {
2658
- s = txn->Commit();
2659
- assert(s.ok());
2660
- } else {
2661
- s = txn->Rollback();
2662
- assert(s.ok());
2663
- }
2664
- delete txn;
2665
- }
2666
- trans.clear();
2667
- txn_db_->GetAllPreparedTransactions(&trans);
2668
- assert(trans.size() == 0);
2669
2794
  #endif
2670
2795
  }
2671
2796
  if (!s.ok()) {
@@ -2771,7 +2896,9 @@ void StressTest::Reopen(ThreadState* thread) {
2771
2896
  clock_->TimeToString(now / 1000000).c_str(), num_times_reopened_);
2772
2897
  Open(thread->shared);
2773
2898
 
2774
- if ((FLAGS_sync_fault_injection || FLAGS_disable_wal) && IsStateTracked()) {
2899
+ if ((FLAGS_sync_fault_injection || FLAGS_disable_wal ||
2900
+ FLAGS_manual_wal_flush_one_in > 0) &&
2901
+ IsStateTracked()) {
2775
2902
  Status s = thread->shared->SaveAtAndAfter(db_);
2776
2903
  if (!s.ok()) {
2777
2904
  fprintf(stderr, "Error enabling history tracing: %s\n",
@@ -2781,17 +2908,17 @@ void StressTest::Reopen(ThreadState* thread) {
2781
2908
  }
2782
2909
  }
2783
2910
 
2784
- void StressTest::MaybeUseOlderTimestampForPointLookup(ThreadState* thread,
2911
+ bool StressTest::MaybeUseOlderTimestampForPointLookup(ThreadState* thread,
2785
2912
  std::string& ts_str,
2786
2913
  Slice& ts_slice,
2787
2914
  ReadOptions& read_opts) {
2788
2915
  if (FLAGS_user_timestamp_size == 0) {
2789
- return;
2916
+ return false;
2790
2917
  }
2791
2918
 
2792
2919
  assert(thread);
2793
2920
  if (!thread->rand.OneInOpt(3)) {
2794
- return;
2921
+ return false;
2795
2922
  }
2796
2923
 
2797
2924
  const SharedState* const shared = thread->shared;
@@ -2807,6 +2934,7 @@ void StressTest::MaybeUseOlderTimestampForPointLookup(ThreadState* thread,
2807
2934
  PutFixed64(&ts_str, ts);
2808
2935
  ts_slice = ts_str;
2809
2936
  read_opts.timestamp = &ts_slice;
2937
+ return true;
2810
2938
  }
2811
2939
 
2812
2940
  void StressTest::MaybeUseOlderTimestampForRangeScan(ThreadState* thread,
@@ -2864,10 +2992,6 @@ void CheckAndSetOptionsForUserTimestamp(Options& options) {
2864
2992
  fprintf(stderr, "Merge does not support timestamp yet.\n");
2865
2993
  exit(1);
2866
2994
  }
2867
- if (FLAGS_delrangepercent > 0) {
2868
- fprintf(stderr, "DeleteRange does not support timestamp yet.\n");
2869
- exit(1);
2870
- }
2871
2995
  if (FLAGS_use_txn) {
2872
2996
  fprintf(stderr, "TransactionDB does not support timestamp yet.\n");
2873
2997
  exit(1);
@@ -3001,6 +3125,7 @@ void InitializeOptionsFromFlags(
3001
3125
  static_cast<ROCKSDB_NAMESPACE::CompactionStyle>(FLAGS_compaction_style);
3002
3126
  options.compaction_pri =
3003
3127
  static_cast<ROCKSDB_NAMESPACE::CompactionPri>(FLAGS_compaction_pri);
3128
+ options.num_levels = FLAGS_num_levels;
3004
3129
  if (FLAGS_prefix_size >= 0) {
3005
3130
  options.prefix_extractor.reset(NewFixedPrefixTransform(FLAGS_prefix_size));
3006
3131
  }
@@ -3051,6 +3176,8 @@ void InitializeOptionsFromFlags(
3051
3176
  options.experimental_mempurge_threshold =
3052
3177
  FLAGS_experimental_mempurge_threshold;
3053
3178
  options.periodic_compaction_seconds = FLAGS_periodic_compaction_seconds;
3179
+ options.stats_dump_period_sec =
3180
+ static_cast<unsigned int>(FLAGS_stats_dump_period_sec);
3054
3181
  options.ttl = FLAGS_compaction_ttl;
3055
3182
  options.enable_pipelined_write = FLAGS_enable_pipelined_write;
3056
3183
  options.enable_write_thread_adaptive_yield =
@@ -3063,6 +3190,7 @@ void InitializeOptionsFromFlags(
3063
3190
  options.compaction_options_universal.max_size_amplification_percent =
3064
3191
  FLAGS_universal_max_size_amplification_percent;
3065
3192
  options.atomic_flush = FLAGS_atomic_flush;
3193
+ options.manual_wal_flush = FLAGS_manual_wal_flush_one_in > 0 ? true : false;
3066
3194
  options.avoid_unnecessary_blocking_io = FLAGS_avoid_unnecessary_blocking_io;
3067
3195
  options.write_dbid_to_manifest = FLAGS_write_dbid_to_manifest;
3068
3196
  options.avoid_flush_during_recovery = FLAGS_avoid_flush_during_recovery;
@@ -3127,6 +3255,7 @@ void InitializeOptionsFromFlags(
3127
3255
  }
3128
3256
  options.preclude_last_level_data_seconds =
3129
3257
  FLAGS_preclude_last_level_data_seconds;
3258
+ options.preserve_internal_time_seconds = FLAGS_preserve_internal_time_seconds;
3130
3259
 
3131
3260
  switch (FLAGS_rep_factory) {
3132
3261
  case kSkipList: