@nxtedition/rocksdb 6.0.1 → 6.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/BUILDING.md +2 -2
  2. package/binding.cc +14 -17
  3. package/deps/rocksdb/build_version.cc +4 -10
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +17 -3
  5. package/deps/rocksdb/rocksdb/Makefile +57 -86
  6. package/deps/rocksdb/rocksdb/TARGETS +4 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_test.cc +29 -17
  8. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +511 -0
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +299 -0
  10. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +3 -0
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.h +7 -0
  12. package/deps/rocksdb/rocksdb/common.mk +30 -0
  13. package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
  14. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
  15. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
  16. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
  17. package/deps/rocksdb/rocksdb/db/builder.cc +11 -4
  18. package/deps/rocksdb/rocksdb/db/c.cc +45 -0
  19. package/deps/rocksdb/rocksdb/db/c_test.c +25 -2
  20. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -3
  21. package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
  22. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +25 -10
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +6 -0
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +69 -14
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +21 -21
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +135 -32
  36. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  37. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  38. package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
  39. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
  40. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
  42. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
  43. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
  44. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
  45. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +9 -8
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +1 -1
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -4
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +9 -3
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +6 -3
  54. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
  55. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
  56. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
  57. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
  58. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
  59. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
  60. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
  61. package/deps/rocksdb/rocksdb/db/db_options_test.cc +12 -12
  62. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
  63. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
  64. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +15 -14
  65. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +6 -6
  66. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
  67. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +44 -42
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +23 -19
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +95 -17
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +48 -0
  72. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
  74. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +4 -4
  75. package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
  76. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  77. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
  78. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
  79. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +34 -12
  80. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +3 -0
  81. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
  82. package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
  83. package/deps/rocksdb/rocksdb/db/flush_job.cc +18 -4
  84. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
  85. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
  86. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  87. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -0
  88. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
  89. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
  90. package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
  91. package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
  92. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
  93. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
  94. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
  95. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
  96. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
  97. package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
  98. package/deps/rocksdb/rocksdb/db/repair_test.cc +5 -5
  99. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
  100. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -4
  101. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  102. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -5
  103. package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -2
  104. package/deps/rocksdb/rocksdb/db/version_set.cc +2 -2
  105. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  106. package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
  107. package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
  108. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
  110. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
  111. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +7 -6
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +31 -6
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
  120. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +359 -275
  121. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
  122. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
  123. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
  124. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
  125. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
  126. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
  127. package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
  128. package/deps/rocksdb/rocksdb/env/env.cc +0 -60
  129. package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
  130. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  131. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
  132. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
  133. package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
  134. package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
  135. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
  136. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -1
  137. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  138. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
  139. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
  140. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +69 -45
  141. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +3 -1
  142. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +35 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
  144. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
  145. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
  148. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  149. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
  150. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
  151. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +28 -3
  152. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
  153. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
  154. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
  155. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
  157. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +189 -103
  159. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
  160. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
  162. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  163. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
  164. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
  165. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
  166. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
  167. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
  168. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
  169. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
  170. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
  171. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
  172. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
  173. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +2 -8
  174. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
  175. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
  176. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
  177. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
  178. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
  179. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
  180. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
  181. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  182. package/deps/rocksdb/rocksdb/options/cf_options.cc +34 -38
  183. package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
  184. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
  185. package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
  186. package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
  187. package/deps/rocksdb/rocksdb/options/db_options.cc +38 -17
  188. package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
  189. package/deps/rocksdb/rocksdb/options/options_helper.cc +82 -39
  190. package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
  191. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -3
  192. package/deps/rocksdb/rocksdb/options/options_test.cc +115 -59
  193. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
  194. package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
  195. package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
  196. package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
  197. package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
  198. package/deps/rocksdb/rocksdb/src.mk +2 -0
  199. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  200. package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
  201. package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
  202. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
  203. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +14 -4
  204. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
  205. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +1 -1
  206. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +85 -41
  207. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +42 -72
  208. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +7 -5
  209. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  210. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  211. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
  212. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
  213. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
  214. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  215. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
  216. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +2 -1
  217. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +6 -3
  218. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
  219. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -5
  220. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
  221. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
  222. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
  223. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
  224. package/deps/rocksdb/rocksdb/table/format.cc +22 -20
  225. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
  226. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  227. package/deps/rocksdb/rocksdb/table/multiget_context.h +14 -11
  228. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
  229. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
  230. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
  231. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  232. package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
  233. package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
  234. package/deps/rocksdb/rocksdb/table/unique_id.cc +57 -25
  235. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +34 -4
  236. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -1
  237. package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
  238. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
  239. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
  240. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
  241. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  242. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +254 -98
  243. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
  244. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
  245. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
  246. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
  247. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
  248. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  249. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +17 -3
  250. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  251. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
  252. package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
  253. package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
  254. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
  255. package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
  256. package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
  257. package/deps/rocksdb/rocksdb/util/compression.h +7 -7
  258. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
  259. package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
  260. package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
  261. package/deps/rocksdb/rocksdb/util/heap.h +5 -3
  262. package/deps/rocksdb/rocksdb/util/random.cc +1 -5
  263. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
  264. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
  265. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
  266. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
  267. package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
  268. package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
  269. package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
  270. package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
  271. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
  272. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
  273. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
  274. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
  275. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
  276. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
  277. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  278. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  279. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
  280. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
  281. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
  282. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
  283. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
  284. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
  285. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
  286. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
  287. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
  288. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
  289. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
  290. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
  291. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
  292. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
  293. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
  294. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
  295. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
  296. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
  297. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
  298. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
  299. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
  300. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
  301. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
  302. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
  303. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  304. package/deps/rocksdb/rocksdb.gyp +8 -2
  305. package/package.json +1 -1
  306. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  307. package/prebuilds/linux-x64/node.napi.node +0 -0
  308. package/deps/rocksdb/rocksdb/python.mk +0 -9
  309. package/prebuilds/darwin-x64/node.napi.node +0 -0
  310. package/prebuilds/linux-arm64/node.napi.node +0 -0
@@ -12,9 +12,8 @@
12
12
 
13
13
  #include "rocksdb/utilities/write_batch_with_index.h"
14
14
  #include "util/defer.h"
15
- #ifndef NDEBUG
16
15
  #include "utilities/fault_injection_fs.h"
17
- #endif // NDEBUG
16
+ #include "utilities/transactions/write_prepared_txn_db.h"
18
17
 
19
18
  namespace ROCKSDB_NAMESPACE {
20
19
 
@@ -31,6 +30,21 @@ DEFINE_int32(delay_snapshot_read_one_in, 0,
31
30
  "With a chance of 1/N, inject a random delay between taking "
32
31
  "snapshot and read.");
33
32
 
33
+ DEFINE_int32(rollback_one_in, 0,
34
+ "If non-zero, rollback non-read-only transactions with a "
35
+ "probability of 1/N.");
36
+
37
+ DEFINE_int32(clear_wp_commit_cache_one_in, 0,
38
+ "If non-zero, evict all commit entries from commit cache with a "
39
+ "probability of 1/N. This options applies to write-prepared and "
40
+ "write-unprepared transactions.");
41
+
42
+ extern "C" bool rocksdb_write_prepared_TEST_ShouldClearCommitCache(void) {
43
+ static Random rand(static_cast<uint32_t>(db_stress_env->NowMicros()));
44
+ return FLAGS_clear_wp_commit_cache_one_in > 0 &&
45
+ rand.OneIn(FLAGS_clear_wp_commit_cache_one_in);
46
+ }
47
+
34
48
  // MultiOpsTxnsStressTest can either operate on a database with pre-populated
35
49
  // data (possibly from previous ones), or create a new db and preload it with
36
50
  // data specified via `-lb_a`, `-ub_a`, `-lb_c`, `-ub_c`, etc. Among these, we
@@ -75,8 +89,9 @@ void MultiOpsTxnsStressTest::KeyGenerator::FinishInit() {
75
89
  "Cannot allocate key in [%u, %u)\nStart with a new DB or try change "
76
90
  "the number of threads for testing via -threads=<#threads>\n",
77
91
  static_cast<unsigned int>(low_), static_cast<unsigned int>(high_));
92
+ fflush(stdout);
78
93
  fflush(stderr);
79
- std::terminate();
94
+ assert(false);
80
95
  }
81
96
  initialized_ = true;
82
97
  }
@@ -131,33 +146,43 @@ void MultiOpsTxnsStressTest::KeyGenerator::UndoAllocation(uint32_t new_val) {
131
146
  }
132
147
 
133
148
  std::string MultiOpsTxnsStressTest::Record::EncodePrimaryKey(uint32_t a) {
134
- char buf[8];
135
- EncodeFixed32(buf, kPrimaryIndexId);
136
- std::reverse(buf, buf + 4);
137
- EncodeFixed32(buf + 4, a);
138
- std::reverse(buf + 4, buf + 8);
139
- return std::string(buf, sizeof(buf));
149
+ std::string ret;
150
+ PutFixed32(&ret, kPrimaryIndexId);
151
+ PutFixed32(&ret, a);
152
+
153
+ char* const buf = &ret[0];
154
+ std::reverse(buf, buf + sizeof(kPrimaryIndexId));
155
+ std::reverse(buf + sizeof(kPrimaryIndexId),
156
+ buf + sizeof(kPrimaryIndexId) + sizeof(a));
157
+ return ret;
140
158
  }
141
159
 
142
160
  std::string MultiOpsTxnsStressTest::Record::EncodeSecondaryKey(uint32_t c) {
143
- char buf[8];
144
- EncodeFixed32(buf, kSecondaryIndexId);
145
- std::reverse(buf, buf + 4);
146
- EncodeFixed32(buf + 4, c);
147
- std::reverse(buf + 4, buf + 8);
148
- return std::string(buf, sizeof(buf));
161
+ std::string ret;
162
+ PutFixed32(&ret, kSecondaryIndexId);
163
+ PutFixed32(&ret, c);
164
+
165
+ char* const buf = &ret[0];
166
+ std::reverse(buf, buf + sizeof(kSecondaryIndexId));
167
+ std::reverse(buf + sizeof(kSecondaryIndexId),
168
+ buf + sizeof(kSecondaryIndexId) + sizeof(c));
169
+ return ret;
149
170
  }
150
171
 
151
172
  std::string MultiOpsTxnsStressTest::Record::EncodeSecondaryKey(uint32_t c,
152
173
  uint32_t a) {
153
- char buf[12];
154
- EncodeFixed32(buf, kSecondaryIndexId);
155
- std::reverse(buf, buf + 4);
156
- EncodeFixed32(buf + 4, c);
157
- EncodeFixed32(buf + 8, a);
158
- std::reverse(buf + 4, buf + 8);
159
- std::reverse(buf + 8, buf + 12);
160
- return std::string(buf, sizeof(buf));
174
+ std::string ret;
175
+ PutFixed32(&ret, kSecondaryIndexId);
176
+ PutFixed32(&ret, c);
177
+ PutFixed32(&ret, a);
178
+
179
+ char* const buf = &ret[0];
180
+ std::reverse(buf, buf + sizeof(kSecondaryIndexId));
181
+ std::reverse(buf + sizeof(kSecondaryIndexId),
182
+ buf + sizeof(kSecondaryIndexId) + sizeof(c));
183
+ std::reverse(buf + sizeof(kSecondaryIndexId) + sizeof(c),
184
+ buf + sizeof(kSecondaryIndexId) + sizeof(c) + sizeof(a));
185
+ return ret;
161
186
  }
162
187
 
163
188
  std::tuple<Status, uint32_t, uint32_t>
@@ -201,40 +226,26 @@ std::string MultiOpsTxnsStressTest::Record::EncodePrimaryKey() const {
201
226
  }
202
227
 
203
228
  std::string MultiOpsTxnsStressTest::Record::EncodePrimaryIndexValue() const {
204
- char buf[8];
205
- EncodeFixed32(buf, b_);
206
- EncodeFixed32(buf + 4, c_);
207
- return std::string(buf, sizeof(buf));
229
+ std::string ret;
230
+ PutFixed32(&ret, b_);
231
+ PutFixed32(&ret, c_);
232
+ return ret;
208
233
  }
209
234
 
210
235
  std::pair<std::string, std::string>
211
236
  MultiOpsTxnsStressTest::Record::EncodeSecondaryIndexEntry() const {
212
- std::string secondary_index_key;
213
- char buf[12];
214
- EncodeFixed32(buf, kSecondaryIndexId);
215
- std::reverse(buf, buf + 4);
216
- EncodeFixed32(buf + 4, c_);
217
- EncodeFixed32(buf + 8, a_);
218
- std::reverse(buf + 4, buf + 8);
219
- std::reverse(buf + 8, buf + 12);
220
- secondary_index_key.assign(buf, sizeof(buf));
237
+ std::string secondary_index_key = EncodeSecondaryKey(c_, a_);
221
238
 
222
239
  // Secondary index value is always 4-byte crc32 of the secondary key
223
240
  std::string secondary_index_value;
224
- uint32_t crc = crc32c::Value(buf, sizeof(buf));
241
+ uint32_t crc =
242
+ crc32c::Value(secondary_index_key.data(), secondary_index_key.size());
225
243
  PutFixed32(&secondary_index_value, crc);
226
- return std::make_pair(secondary_index_key, secondary_index_value);
244
+ return std::make_pair(std::move(secondary_index_key), secondary_index_value);
227
245
  }
228
246
 
229
247
  std::string MultiOpsTxnsStressTest::Record::EncodeSecondaryKey() const {
230
- char buf[12];
231
- EncodeFixed32(buf, kSecondaryIndexId);
232
- std::reverse(buf, buf + 4);
233
- EncodeFixed32(buf + 4, c_);
234
- EncodeFixed32(buf + 8, a_);
235
- std::reverse(buf + 4, buf + 8);
236
- std::reverse(buf + 8, buf + 12);
237
- return std::string(buf, sizeof(buf));
248
+ return EncodeSecondaryKey(c_, a_);
238
249
  }
239
250
 
240
251
  Status MultiOpsTxnsStressTest::Record::DecodePrimaryIndexEntry(
@@ -244,27 +255,22 @@ Status MultiOpsTxnsStressTest::Record::DecodePrimaryIndexEntry(
244
255
  return Status::Corruption("Primary index key length is not 8");
245
256
  }
246
257
 
247
- const char* const index_id_buf = primary_index_key.data();
248
- uint32_t index_id =
249
- static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[0])) << 24;
250
- index_id += static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[1]))
251
- << 16;
252
- index_id += static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[2]))
253
- << 8;
254
- index_id +=
255
- static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[3]));
256
- primary_index_key.remove_prefix(sizeof(uint32_t));
258
+ uint32_t index_id = 0;
259
+
260
+ [[maybe_unused]] bool res = GetFixed32(&primary_index_key, &index_id);
261
+ assert(res);
262
+ index_id = EndianSwapValue(index_id);
263
+
257
264
  if (index_id != kPrimaryIndexId) {
258
265
  std::ostringstream oss;
259
266
  oss << "Unexpected primary index id: " << index_id;
260
267
  return Status::Corruption(oss.str());
261
268
  }
262
269
 
263
- const char* const buf = primary_index_key.data();
264
- a_ = static_cast<uint32_t>(static_cast<unsigned char>(buf[0])) << 24;
265
- a_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[1])) << 16;
266
- a_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[2])) << 8;
267
- a_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[3]));
270
+ res = GetFixed32(&primary_index_key, &a_);
271
+ assert(res);
272
+ a_ = EndianSwapValue(a_);
273
+ assert(primary_index_key.empty());
268
274
 
269
275
  if (primary_index_value.size() != 8) {
270
276
  return Status::Corruption("Primary index value length is not 8");
@@ -282,33 +288,28 @@ Status MultiOpsTxnsStressTest::Record::DecodeSecondaryIndexEntry(
282
288
  uint32_t crc =
283
289
  crc32c::Value(secondary_index_key.data(), secondary_index_key.size());
284
290
 
285
- const char* const index_id_buf = secondary_index_key.data();
286
- uint32_t index_id =
287
- static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[0])) << 24;
288
- index_id += static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[1]))
289
- << 16;
290
- index_id += static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[2]))
291
- << 8;
292
- index_id +=
293
- static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[3]));
294
- secondary_index_key.remove_prefix(sizeof(uint32_t));
291
+ uint32_t index_id = 0;
292
+
293
+ [[maybe_unused]] bool res = GetFixed32(&secondary_index_key, &index_id);
294
+ assert(res);
295
+ index_id = EndianSwapValue(index_id);
296
+
295
297
  if (index_id != kSecondaryIndexId) {
296
298
  std::ostringstream oss;
297
299
  oss << "Unexpected secondary index id: " << index_id;
298
300
  return Status::Corruption(oss.str());
299
301
  }
300
302
 
301
- const char* const buf = secondary_index_key.data();
302
303
  assert(secondary_index_key.size() == 8);
303
- c_ = static_cast<uint32_t>(static_cast<unsigned char>(buf[0])) << 24;
304
- c_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[1])) << 16;
305
- c_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[2])) << 8;
306
- c_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[3]));
304
+ res = GetFixed32(&secondary_index_key, &c_);
305
+ assert(res);
306
+ c_ = EndianSwapValue(c_);
307
307
 
308
- a_ = static_cast<uint32_t>(static_cast<unsigned char>(buf[4])) << 24;
309
- a_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[5])) << 16;
310
- a_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[6])) << 8;
311
- a_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[7]));
308
+ assert(secondary_index_key.size() == 4);
309
+ res = GetFixed32(&secondary_index_key, &a_);
310
+ assert(res);
311
+ a_ = EndianSwapValue(a_);
312
+ assert(secondary_index_key.empty());
312
313
 
313
314
  if (secondary_index_value.size() != 4) {
314
315
  return Status::Corruption("Secondary index value length is not 4");
@@ -520,9 +521,35 @@ Status MultiOpsTxnsStressTest::TestCustomOperations(
520
521
  // Should never reach here.
521
522
  assert(false);
522
523
  }
524
+
523
525
  return s;
524
526
  }
525
527
 
528
+ void MultiOpsTxnsStressTest::RegisterAdditionalListeners() {
529
+ options_.listeners.emplace_back(new MultiOpsTxnsStressListener(this));
530
+ }
531
+
532
+ #ifndef ROCKSDB_LITE
533
+ void MultiOpsTxnsStressTest::PrepareTxnDbOptions(
534
+ SharedState* /*shared*/, TransactionDBOptions& txn_db_opts) {
535
+ // MultiOpsTxnStressTest uses SingleDelete to delete secondary keys, thus we
536
+ // register this callback to let TxnDb know that when rolling back
537
+ // a transaction, use only SingleDelete to cancel prior Put from the same
538
+ // transaction if applicable.
539
+ txn_db_opts.rollback_deletion_type_callback =
540
+ [](TransactionDB* /*db*/, ColumnFamilyHandle* /*column_family*/,
541
+ const Slice& key) {
542
+ Slice ks = key;
543
+ uint32_t index_id = 0;
544
+ [[maybe_unused]] bool res = GetFixed32(&ks, &index_id);
545
+ assert(res);
546
+ index_id = EndianSwapValue(index_id);
547
+ assert(index_id <= Record::kSecondaryIndexId);
548
+ return index_id == Record::kSecondaryIndexId;
549
+ };
550
+ }
551
+ #endif // !ROCKSDB_LITE
552
+
526
553
  Status MultiOpsTxnsStressTest::PrimaryKeyUpdateTxn(ThreadState* thread,
527
554
  uint32_t old_a,
528
555
  uint32_t old_a_pos,
@@ -561,8 +588,10 @@ Status MultiOpsTxnsStressTest::PrimaryKeyUpdateTxn(ThreadState* thread,
561
588
  }
562
589
  if (s.IsNotFound()) {
563
590
  thread->stats.AddGets(/*ngets=*/1, /*nfounds=*/0);
564
- } else if (s.IsBusy()) {
591
+ } else if (s.IsBusy() || s.IsIncomplete()) {
565
592
  // ignore.
593
+ // Incomplete also means rollback by application. See the transaction
594
+ // implementations.
566
595
  } else {
567
596
  thread->stats.AddErrors(1);
568
597
  }
@@ -631,6 +660,16 @@ Status MultiOpsTxnsStressTest::PrimaryKeyUpdateTxn(ThreadState* thread,
631
660
  return s;
632
661
  }
633
662
 
663
+ if (FLAGS_rollback_one_in > 0 && thread->rand.OneIn(FLAGS_rollback_one_in)) {
664
+ s = Status::Incomplete();
665
+ return s;
666
+ }
667
+
668
+ s = WriteToCommitTimeWriteBatch(*txn);
669
+ if (!s.ok()) {
670
+ return s;
671
+ }
672
+
634
673
  s = txn->Commit();
635
674
 
636
675
  auto& key_gen = key_gen_for_a_.at(thread->tid);
@@ -677,11 +716,12 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
677
716
  Record::kPrimaryIndexEntrySize + Record::kSecondaryIndexEntrySize);
678
717
  return;
679
718
  } else if (s.IsBusy() || s.IsTimedOut() || s.IsTryAgain() ||
680
- s.IsMergeInProgress()) {
719
+ s.IsMergeInProgress() || s.IsIncomplete()) {
681
720
  // ww-conflict detected, or
682
721
  // lock cannot be acquired, or
683
722
  // memtable history is not large enough for conflict checking, or
684
- // Merge operation cannot be resolved.
723
+ // Merge operation cannot be resolved, or
724
+ // application rollback.
685
725
  // TODO (yanqin) add stats for other cases?
686
726
  } else if (s.IsNotFound()) {
687
727
  // ignore.
@@ -727,8 +767,9 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
727
767
  Record record;
728
768
  s = record.DecodeSecondaryIndexEntry(it->key(), it->value());
729
769
  if (!s.ok()) {
730
- fprintf(stderr, "Cannot decode secondary key: %s\n",
731
- s.ToString().c_str());
770
+ fprintf(stderr, "Cannot decode secondary key (%s => %s): %s\n",
771
+ it->key().ToString(true).c_str(),
772
+ it->value().ToString(true).c_str(), s.ToString().c_str());
732
773
  assert(false);
733
774
  break;
734
775
  }
@@ -749,21 +790,31 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
749
790
  } else if (s.IsNotFound()) {
750
791
  // We can also fail verification here.
751
792
  std::ostringstream oss;
752
- oss << "pk should exist: " << Slice(pk).ToString(true);
793
+ auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
794
+ assert(dbimpl);
795
+ oss << "snap " << read_opts.snapshot->GetSequenceNumber()
796
+ << " (published " << dbimpl->GetLastPublishedSequence()
797
+ << "), pk should exist: " << Slice(pk).ToString(true);
753
798
  fprintf(stderr, "%s\n", oss.str().c_str());
754
799
  assert(false);
755
800
  break;
756
801
  }
757
802
  if (!s.ok()) {
758
- fprintf(stderr, "%s\n", s.ToString().c_str());
803
+ std::ostringstream oss;
804
+ auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
805
+ assert(dbimpl);
806
+ oss << "snap " << read_opts.snapshot->GetSequenceNumber()
807
+ << " (published " << dbimpl->GetLastPublishedSequence() << "), "
808
+ << s.ToString();
809
+ fprintf(stderr, "%s\n", oss.str().c_str());
759
810
  assert(false);
760
811
  break;
761
812
  }
762
813
  auto result = Record::DecodePrimaryIndexValue(value);
763
814
  s = std::get<0>(result);
764
815
  if (!s.ok()) {
765
- fprintf(stderr, "Cannot decode primary index value: %s\n",
766
- s.ToString().c_str());
816
+ fprintf(stderr, "Cannot decode primary index value %s: %s\n",
817
+ Slice(value).ToString(true).c_str(), s.ToString().c_str());
767
818
  assert(false);
768
819
  break;
769
820
  }
@@ -771,8 +822,12 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
771
822
  uint32_t c = std::get<2>(result);
772
823
  if (c != old_c) {
773
824
  std::ostringstream oss;
774
- oss << "c in primary index does not match secondary index: " << c
775
- << " != " << old_c;
825
+ auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
826
+ assert(dbimpl);
827
+ oss << "snap " << read_opts.snapshot->GetSequenceNumber()
828
+ << " (published " << dbimpl->GetLastPublishedSequence()
829
+ << "), pk/sk mismatch. pk: (a=" << record.a_value() << ", "
830
+ << "c=" << c << "), sk: (c=" << old_c << ")";
776
831
  s = Status::Corruption();
777
832
  fprintf(stderr, "%s\n", oss.str().c_str());
778
833
  assert(false);
@@ -811,6 +866,16 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
811
866
  return s;
812
867
  }
813
868
 
869
+ if (FLAGS_rollback_one_in > 0 && thread->rand.OneIn(FLAGS_rollback_one_in)) {
870
+ s = Status::Incomplete();
871
+ return s;
872
+ }
873
+
874
+ s = WriteToCommitTimeWriteBatch(*txn);
875
+ if (!s.ok()) {
876
+ return s;
877
+ }
878
+
814
879
  s = txn->Commit();
815
880
 
816
881
  if (s.ok()) {
@@ -856,7 +921,7 @@ Status MultiOpsTxnsStressTest::UpdatePrimaryIndexValueTxn(ThreadState* thread,
856
921
  } else if (s.IsInvalidArgument()) {
857
922
  // ignored.
858
923
  } else if (s.IsBusy() || s.IsTimedOut() || s.IsTryAgain() ||
859
- s.IsMergeInProgress()) {
924
+ s.IsMergeInProgress() || s.IsIncomplete()) {
860
925
  // ignored.
861
926
  } else {
862
927
  thread->stats.AddErrors(1);
@@ -874,8 +939,8 @@ Status MultiOpsTxnsStressTest::UpdatePrimaryIndexValueTxn(ThreadState* thread,
874
939
  auto result = Record::DecodePrimaryIndexValue(value);
875
940
  if (!std::get<0>(result).ok()) {
876
941
  s = std::get<0>(result);
877
- fprintf(stderr, "Cannot decode primary index value: %s\n",
878
- s.ToString().c_str());
942
+ fprintf(stderr, "Cannot decode primary index value %s: %s\n",
943
+ Slice(value).ToString(true).c_str(), s.ToString().c_str());
879
944
  assert(false);
880
945
  return s;
881
946
  }
@@ -892,6 +957,17 @@ Status MultiOpsTxnsStressTest::UpdatePrimaryIndexValueTxn(ThreadState* thread,
892
957
  if (!s.ok()) {
893
958
  return s;
894
959
  }
960
+
961
+ if (FLAGS_rollback_one_in > 0 && thread->rand.OneIn(FLAGS_rollback_one_in)) {
962
+ s = Status::Incomplete();
963
+ return s;
964
+ }
965
+
966
+ s = WriteToCommitTimeWriteBatch(*txn);
967
+ if (!s.ok()) {
968
+ return s;
969
+ }
970
+
895
971
  s = txn->Commit();
896
972
  if (s.ok()) {
897
973
  delete txn;
@@ -1050,12 +1126,15 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1050
1126
  // First, iterate primary index.
1051
1127
  size_t primary_index_entries_count = 0;
1052
1128
  {
1053
- char buf[4];
1054
- EncodeFixed32(buf, Record::kPrimaryIndexId + 1);
1055
- std::reverse(buf, buf + sizeof(buf));
1056
- std::string iter_ub_str(buf, sizeof(buf));
1129
+ std::string iter_ub_str;
1130
+ PutFixed32(&iter_ub_str, Record::kPrimaryIndexId + 1);
1131
+ std::reverse(iter_ub_str.begin(), iter_ub_str.end());
1057
1132
  Slice iter_ub = iter_ub_str;
1058
1133
 
1134
+ std::string start_key;
1135
+ PutFixed32(&start_key, Record::kPrimaryIndexId);
1136
+ std::reverse(start_key.begin(), start_key.end());
1137
+
1059
1138
  // This `ReadOptions` is for validation purposes. Ignore
1060
1139
  // `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
1061
1140
  ReadOptions ropts;
@@ -1064,7 +1143,7 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1064
1143
  ropts.iterate_upper_bound = &iter_ub;
1065
1144
 
1066
1145
  std::unique_ptr<Iterator> it(db_->NewIterator(ropts));
1067
- for (it->SeekToFirst(); it->Valid(); it->Next()) {
1146
+ for (it->Seek(start_key); it->Valid(); it->Next()) {
1068
1147
  Record record;
1069
1148
  Status s = record.DecodePrimaryIndexEntry(it->key(), it->value());
1070
1149
  if (!s.ok()) {
@@ -1101,10 +1180,9 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1101
1180
  // Second, iterate secondary index.
1102
1181
  size_t secondary_index_entries_count = 0;
1103
1182
  {
1104
- char buf[4];
1105
- EncodeFixed32(buf, Record::kSecondaryIndexId);
1106
- std::reverse(buf, buf + sizeof(buf));
1107
- const std::string start_key(buf, sizeof(buf));
1183
+ std::string start_key;
1184
+ PutFixed32(&start_key, Record::kSecondaryIndexId);
1185
+ std::reverse(start_key.begin(), start_key.end());
1108
1186
 
1109
1187
  // This `ReadOptions` is for validation purposes. Ignore
1110
1188
  // `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
@@ -1118,7 +1196,8 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1118
1196
  Record record;
1119
1197
  Status s = record.DecodeSecondaryIndexEntry(it->key(), it->value());
1120
1198
  if (!s.ok()) {
1121
- oss << "Cannot decode secondary index entry";
1199
+ oss << "Cannot decode secondary index entry "
1200
+ << it->key().ToString(true) << "=>" << it->value().ToString(true);
1122
1201
  VerificationAbort(thread->shared, oss.str(), s);
1123
1202
  assert(false);
1124
1203
  return;
@@ -1132,7 +1211,7 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1132
1211
  s = db_->Get(ropts, pk, &value);
1133
1212
  if (!s.ok()) {
1134
1213
  oss << "Error searching pk " << Slice(pk).ToString(true) << ". "
1135
- << s.ToString();
1214
+ << s.ToString() << ". sk " << it->key().ToString(true);
1136
1215
  VerificationAbort(thread->shared, oss.str(), s);
1137
1216
  assert(false);
1138
1217
  return;
@@ -1148,8 +1227,10 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1148
1227
  }
1149
1228
  uint32_t c_in_primary = std::get<2>(result);
1150
1229
  if (c_in_primary != record.c_value()) {
1151
- oss << "Pk/sk mismatch. pk: (c=" << c_in_primary
1152
- << "), sk: (c=" << record.c_value() << ")";
1230
+ oss << "Pk/sk mismatch. pk: " << Slice(pk).ToString(true) << "=>"
1231
+ << Slice(value).ToString(true) << " (a=" << record.a_value()
1232
+ << ", c=" << c_in_primary << "), sk: " << it->key().ToString(true)
1233
+ << " (c=" << record.c_value() << ")";
1153
1234
  VerificationAbort(thread->shared, oss.str(), s);
1154
1235
  assert(false);
1155
1236
  return;
@@ -1167,6 +1248,75 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1167
1248
  }
1168
1249
  }
1169
1250
 
1251
+ void MultiOpsTxnsStressTest::VerifyPkSkFast(int job_id) {
1252
+ const Snapshot* const snapshot = db_->GetSnapshot();
1253
+ assert(snapshot);
1254
+ ManagedSnapshot snapshot_guard(db_, snapshot);
1255
+
1256
+ std::ostringstream oss;
1257
+ auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
1258
+ assert(dbimpl);
1259
+
1260
+ oss << "Job " << job_id << ": [" << snapshot->GetSequenceNumber() << ","
1261
+ << dbimpl->GetLastPublishedSequence() << "] ";
1262
+
1263
+ std::string start_key;
1264
+ PutFixed32(&start_key, Record::kSecondaryIndexId);
1265
+ std::reverse(start_key.begin(), start_key.end());
1266
+
1267
+ // This `ReadOptions` is for validation purposes. Ignore
1268
+ // `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
1269
+ ReadOptions ropts;
1270
+ ropts.snapshot = snapshot;
1271
+ ropts.total_order_seek = true;
1272
+
1273
+ std::unique_ptr<Iterator> it(db_->NewIterator(ropts));
1274
+ for (it->Seek(start_key); it->Valid(); it->Next()) {
1275
+ Record record;
1276
+ Status s = record.DecodeSecondaryIndexEntry(it->key(), it->value());
1277
+ if (!s.ok()) {
1278
+ oss << "Cannot decode secondary index entry " << it->key().ToString(true)
1279
+ << "=>" << it->value().ToString(true);
1280
+ fprintf(stderr, "%s\n", oss.str().c_str());
1281
+ fflush(stderr);
1282
+ assert(false);
1283
+ }
1284
+ // After decoding secondary index entry, we know a and c. Crc is verified
1285
+ // in decoding phase.
1286
+ //
1287
+ // Form a primary key and search in the primary index.
1288
+ std::string pk = Record::EncodePrimaryKey(record.a_value());
1289
+ std::string value;
1290
+ s = db_->Get(ropts, pk, &value);
1291
+ if (!s.ok()) {
1292
+ oss << "Error searching pk " << Slice(pk).ToString(true) << ". "
1293
+ << s.ToString() << ". sk " << it->key().ToString(true);
1294
+ fprintf(stderr, "%s\n", oss.str().c_str());
1295
+ fflush(stderr);
1296
+ assert(false);
1297
+ }
1298
+ auto result = Record::DecodePrimaryIndexValue(value);
1299
+ s = std::get<0>(result);
1300
+ if (!s.ok()) {
1301
+ oss << "Error decoding primary index value "
1302
+ << Slice(value).ToString(true) << ". " << s.ToString();
1303
+ fprintf(stderr, "%s\n", oss.str().c_str());
1304
+ fflush(stderr);
1305
+ assert(false);
1306
+ }
1307
+ uint32_t c_in_primary = std::get<2>(result);
1308
+ if (c_in_primary != record.c_value()) {
1309
+ oss << "Pk/sk mismatch. pk: " << Slice(pk).ToString(true) << "=>"
1310
+ << Slice(value).ToString(true) << " (a=" << record.a_value()
1311
+ << ", c=" << c_in_primary << "), sk: " << it->key().ToString(true)
1312
+ << " (c=" << record.c_value() << ")";
1313
+ fprintf(stderr, "%s\n", oss.str().c_str());
1314
+ fflush(stderr);
1315
+ assert(false);
1316
+ }
1317
+ }
1318
+ }
1319
+
1170
1320
  std::pair<uint32_t, uint32_t> MultiOpsTxnsStressTest::ChooseExistingA(
1171
1321
  ThreadState* thread) {
1172
1322
  uint32_t tid = thread->tid;
@@ -1193,6 +1343,22 @@ uint32_t MultiOpsTxnsStressTest::GenerateNextC(ThreadState* thread) {
1193
1343
  return key_gen->Allocate();
1194
1344
  }
1195
1345
 
1346
+ #ifndef ROCKSDB_LITE
1347
+ Status MultiOpsTxnsStressTest::WriteToCommitTimeWriteBatch(Transaction& txn) {
1348
+ WriteBatch* ctwb = txn.GetCommitTimeWriteBatch();
1349
+ assert(ctwb);
1350
+ // Do not change the content in key_buf.
1351
+ static constexpr char key_buf[sizeof(Record::kMetadataPrefix) + 4] = {
1352
+ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\xff'};
1353
+
1354
+ uint64_t counter_val = counter_.Next();
1355
+ char val_buf[sizeof(counter_val)];
1356
+ EncodeFixed64(val_buf, counter_val);
1357
+ return ctwb->Put(Slice(key_buf, sizeof(key_buf)),
1358
+ Slice(val_buf, sizeof(val_buf)));
1359
+ }
1360
+ #endif // !ROCKSDB_LITE
1361
+
1196
1362
  std::string MultiOpsTxnsStressTest::KeySpaces::EncodeTo() const {
1197
1363
  std::string result;
1198
1364
  PutFixed32(&result, lb_a);
@@ -1428,8 +1594,9 @@ void MultiOpsTxnsStressTest::ScanExistingDb(SharedState* shared, int threads) {
1428
1594
  Record record;
1429
1595
  Status s = record.DecodePrimaryIndexEntry(it->key(), it->value());
1430
1596
  if (!s.ok()) {
1431
- fprintf(stderr, "Cannot decode primary index entry: %s\n",
1432
- s.ToString().c_str());
1597
+ fprintf(stderr, "Cannot decode primary index entry (%s => %s): %s\n",
1598
+ it->key().ToString(true).c_str(),
1599
+ it->value().ToString(true).c_str(), s.ToString().c_str());
1433
1600
  assert(false);
1434
1601
  }
1435
1602
  uint32_t a = record.a_value();