@nxtedition/rocksdb 6.0.1 → 7.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/BUILDING.md +12 -4
  2. package/binding.cc +421 -40
  3. package/deps/rocksdb/build_version.cc +4 -10
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +26 -3
  5. package/deps/rocksdb/rocksdb/Makefile +73 -91
  6. package/deps/rocksdb/rocksdb/TARGETS +27 -2
  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/cmake/modules/CxxFlags.cmake +7 -0
  13. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  14. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  15. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  16. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  17. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  18. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  19. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  20. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  21. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  22. package/deps/rocksdb/rocksdb/common.mk +30 -0
  23. package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
  24. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
  25. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
  26. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
  27. package/deps/rocksdb/rocksdb/db/builder.cc +22 -7
  28. package/deps/rocksdb/rocksdb/db/c.cc +71 -0
  29. package/deps/rocksdb/rocksdb/db/c_test.c +28 -2
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +12 -5
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +54 -16
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +14 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +85 -18
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +23 -22
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +151 -32
  46. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  48. package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
  49. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
  50. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +404 -32
  51. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
  52. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
  53. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
  54. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
  55. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +11 -20
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +15 -1
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +12 -9
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +42 -10
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +54 -23
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -0
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +14 -4
  67. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
  68. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
  69. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
  70. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
  71. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
  72. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
  73. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
  74. package/deps/rocksdb/rocksdb/db/db_options_test.cc +28 -12
  75. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
  76. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
  77. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +331 -0
  78. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +11 -6
  79. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
  80. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
  81. package/deps/rocksdb/rocksdb/db/db_test.cc +60 -42
  82. package/deps/rocksdb/rocksdb/db/db_test2.cc +244 -111
  83. package/deps/rocksdb/rocksdb/db/db_test_util.cc +101 -19
  84. package/deps/rocksdb/rocksdb/db/db_test_util.h +52 -2
  85. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
  86. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
  87. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +5 -175
  88. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.cc +96 -0
  89. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.h +126 -0
  90. package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
  91. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  92. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
  93. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
  94. package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +91 -12
  96. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +16 -2
  97. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +2 -0
  98. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
  99. package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
  100. package/deps/rocksdb/rocksdb/db/flush_job.cc +28 -15
  101. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
  102. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
  103. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  104. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +14 -1
  105. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  106. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
  107. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
  108. package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
  109. package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
  110. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
  111. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
  112. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
  113. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
  114. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
  115. package/deps/rocksdb/rocksdb/db/repair.cc +13 -2
  116. package/deps/rocksdb/rocksdb/db/repair_test.cc +37 -15
  117. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
  118. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +3 -1
  119. package/deps/rocksdb/rocksdb/db/table_cache.cc +20 -130
  120. package/deps/rocksdb/rocksdb/db/table_cache.h +3 -2
  121. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +140 -0
  122. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  123. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +133 -133
  124. package/deps/rocksdb/rocksdb/db/version_edit.cc +22 -2
  125. package/deps/rocksdb/rocksdb/db/version_edit.h +13 -4
  126. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +14 -14
  127. package/deps/rocksdb/rocksdb/db/version_set.cc +207 -214
  128. package/deps/rocksdb/rocksdb/db/version_set.h +14 -3
  129. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +154 -0
  130. package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -9
  131. package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
  132. package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
  133. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  134. package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
  135. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
  136. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -6
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +44 -6
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
  144. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
  145. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +374 -275
  146. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
  147. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
  148. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
  149. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
  150. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
  151. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
  152. package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
  153. package/deps/rocksdb/rocksdb/env/env.cc +0 -60
  154. package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
  155. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  156. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
  157. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
  158. package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
  159. package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
  160. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
  161. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +159 -65
  162. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +44 -22
  163. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  164. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +142 -17
  165. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
  166. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
  167. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +60 -40
  168. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -0
  169. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +23 -5
  170. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +49 -1
  171. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
  172. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
  173. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  174. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
  175. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
  176. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  177. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
  178. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
  179. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -3
  181. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -0
  182. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +4 -1
  183. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  184. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
  185. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
  187. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
  188. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
  189. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +378 -103
  191. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
  192. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  193. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
  194. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  195. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
  196. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
  197. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
  198. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
  199. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
  200. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
  201. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
  202. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
  203. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
  204. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
  205. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +7 -8
  206. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
  207. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
  208. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
  209. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
  210. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  211. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
  212. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
  213. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
  214. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  215. package/deps/rocksdb/rocksdb/options/cf_options.cc +47 -38
  216. package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
  217. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
  218. package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
  219. package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
  220. package/deps/rocksdb/rocksdb/options/db_options.cc +46 -17
  221. package/deps/rocksdb/rocksdb/options/db_options.h +2 -0
  222. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  223. package/deps/rocksdb/rocksdb/options/options_helper.cc +86 -39
  224. package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
  225. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +12 -7
  226. package/deps/rocksdb/rocksdb/options/options_test.cc +222 -68
  227. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
  228. package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
  229. package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
  230. package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
  231. package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
  232. package/deps/rocksdb/rocksdb/src.mk +6 -1
  233. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  234. package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
  235. package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
  236. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
  237. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +23 -8
  238. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
  239. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +81 -7
  240. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +8 -2
  241. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +94 -726
  242. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +21 -15
  243. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +9 -3
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +754 -0
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -73
  246. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -5
  247. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  248. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +2 -11
  249. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +59 -1
  250. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +18 -0
  251. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
  252. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +0 -61
  253. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +0 -13
  254. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
  255. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
  256. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -2
  257. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
  258. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -2
  259. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
  260. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +8 -4
  261. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
  262. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -1
  263. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +65 -7
  264. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -0
  265. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
  266. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
  267. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
  268. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
  269. package/deps/rocksdb/rocksdb/table/format.cc +22 -20
  270. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
  271. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +39 -0
  272. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  273. package/deps/rocksdb/rocksdb/table/multiget_context.h +60 -13
  274. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
  275. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
  276. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
  277. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -1
  278. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +1 -1
  279. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  280. package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
  281. package/deps/rocksdb/rocksdb/table/table_reader.h +13 -0
  282. package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
  283. package/deps/rocksdb/rocksdb/table/unique_id.cc +84 -25
  284. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +37 -4
  285. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -1
  286. package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
  287. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
  288. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
  289. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
  290. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  291. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +277 -105
  292. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
  293. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
  294. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
  295. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
  296. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
  297. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  298. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +26 -4
  299. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  300. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
  301. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +72 -0
  302. package/deps/rocksdb/rocksdb/util/async_file_reader.h +144 -0
  303. package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
  304. package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
  305. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
  306. package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
  307. package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
  308. package/deps/rocksdb/rocksdb/util/compression.h +56 -7
  309. package/deps/rocksdb/rocksdb/util/coro_utils.h +111 -0
  310. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
  311. package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
  312. package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
  313. package/deps/rocksdb/rocksdb/util/heap.h +5 -3
  314. package/deps/rocksdb/rocksdb/util/random.cc +1 -5
  315. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
  316. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
  317. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
  318. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
  319. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +55 -0
  320. package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
  321. package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
  322. package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
  323. package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
  324. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
  325. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
  326. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
  327. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
  328. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
  329. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
  330. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  331. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  332. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
  333. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
  334. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
  335. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
  336. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
  337. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
  338. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
  339. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
  340. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
  341. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
  342. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
  343. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
  344. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
  345. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
  346. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
  347. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
  348. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
  349. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
  350. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
  351. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
  352. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
  353. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
  354. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
  355. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
  356. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  357. package/deps/rocksdb/rocksdb.gyp +20 -13
  358. package/index.js +187 -3
  359. package/iterator.js +1 -0
  360. package/package-lock.json +23687 -0
  361. package/package.json +2 -30
  362. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  363. package/snapshot.js +23 -0
  364. package/deps/liburing/liburing/README +0 -46
  365. package/deps/liburing/liburing/test/232c93d07b74-test.c +0 -305
  366. package/deps/liburing/liburing/test/35fa71a030ca-test.c +0 -329
  367. package/deps/liburing/liburing/test/500f9fbadef8-test.c +0 -89
  368. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +0 -93
  369. package/deps/liburing/liburing/test/8a9973408177-test.c +0 -106
  370. package/deps/liburing/liburing/test/917257daa0fe-test.c +0 -53
  371. package/deps/liburing/liburing/test/Makefile +0 -312
  372. package/deps/liburing/liburing/test/a0908ae19763-test.c +0 -58
  373. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +0 -180
  374. package/deps/liburing/liburing/test/accept-link.c +0 -251
  375. package/deps/liburing/liburing/test/accept-reuse.c +0 -164
  376. package/deps/liburing/liburing/test/accept-test.c +0 -79
  377. package/deps/liburing/liburing/test/accept.c +0 -476
  378. package/deps/liburing/liburing/test/across-fork.c +0 -283
  379. package/deps/liburing/liburing/test/b19062a56726-test.c +0 -53
  380. package/deps/liburing/liburing/test/b5837bd5311d-test.c +0 -77
  381. package/deps/liburing/liburing/test/ce593a6c480a-test.c +0 -135
  382. package/deps/liburing/liburing/test/close-opath.c +0 -122
  383. package/deps/liburing/liburing/test/config +0 -10
  384. package/deps/liburing/liburing/test/connect.c +0 -398
  385. package/deps/liburing/liburing/test/cq-full.c +0 -96
  386. package/deps/liburing/liburing/test/cq-overflow.c +0 -294
  387. package/deps/liburing/liburing/test/cq-peek-batch.c +0 -102
  388. package/deps/liburing/liburing/test/cq-ready.c +0 -94
  389. package/deps/liburing/liburing/test/cq-size.c +0 -58
  390. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +0 -96
  391. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +0 -65
  392. package/deps/liburing/liburing/test/defer.c +0 -307
  393. package/deps/liburing/liburing/test/double-poll-crash.c +0 -186
  394. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +0 -114
  395. package/deps/liburing/liburing/test/empty-eownerdead.c +0 -42
  396. package/deps/liburing/liburing/test/eventfd-disable.c +0 -151
  397. package/deps/liburing/liburing/test/eventfd-ring.c +0 -97
  398. package/deps/liburing/liburing/test/eventfd.c +0 -112
  399. package/deps/liburing/liburing/test/fadvise.c +0 -202
  400. package/deps/liburing/liburing/test/fallocate.c +0 -249
  401. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +0 -138
  402. package/deps/liburing/liburing/test/file-register.c +0 -843
  403. package/deps/liburing/liburing/test/file-update.c +0 -173
  404. package/deps/liburing/liburing/test/files-exit-hang-poll.c +0 -128
  405. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +0 -134
  406. package/deps/liburing/liburing/test/fixed-link.c +0 -90
  407. package/deps/liburing/liburing/test/fsync.c +0 -224
  408. package/deps/liburing/liburing/test/hardlink.c +0 -136
  409. package/deps/liburing/liburing/test/helpers.c +0 -135
  410. package/deps/liburing/liburing/test/helpers.h +0 -67
  411. package/deps/liburing/liburing/test/io-cancel.c +0 -537
  412. package/deps/liburing/liburing/test/io_uring_enter.c +0 -296
  413. package/deps/liburing/liburing/test/io_uring_register.c +0 -664
  414. package/deps/liburing/liburing/test/io_uring_setup.c +0 -192
  415. package/deps/liburing/liburing/test/iopoll.c +0 -366
  416. package/deps/liburing/liburing/test/lfs-openat-write.c +0 -117
  417. package/deps/liburing/liburing/test/lfs-openat.c +0 -273
  418. package/deps/liburing/liburing/test/link-timeout.c +0 -1107
  419. package/deps/liburing/liburing/test/link.c +0 -496
  420. package/deps/liburing/liburing/test/link_drain.c +0 -229
  421. package/deps/liburing/liburing/test/madvise.c +0 -195
  422. package/deps/liburing/liburing/test/mkdir.c +0 -108
  423. package/deps/liburing/liburing/test/multicqes_drain.c +0 -383
  424. package/deps/liburing/liburing/test/nop-all-sizes.c +0 -107
  425. package/deps/liburing/liburing/test/nop.c +0 -115
  426. package/deps/liburing/liburing/test/open-close.c +0 -146
  427. package/deps/liburing/liburing/test/openat2.c +0 -240
  428. package/deps/liburing/liburing/test/personality.c +0 -204
  429. package/deps/liburing/liburing/test/pipe-eof.c +0 -81
  430. package/deps/liburing/liburing/test/pipe-reuse.c +0 -105
  431. package/deps/liburing/liburing/test/poll-cancel-ton.c +0 -139
  432. package/deps/liburing/liburing/test/poll-cancel.c +0 -135
  433. package/deps/liburing/liburing/test/poll-link.c +0 -227
  434. package/deps/liburing/liburing/test/poll-many.c +0 -208
  435. package/deps/liburing/liburing/test/poll-mshot-update.c +0 -273
  436. package/deps/liburing/liburing/test/poll-ring.c +0 -48
  437. package/deps/liburing/liburing/test/poll-v-poll.c +0 -353
  438. package/deps/liburing/liburing/test/poll.c +0 -109
  439. package/deps/liburing/liburing/test/probe.c +0 -137
  440. package/deps/liburing/liburing/test/read-write.c +0 -876
  441. package/deps/liburing/liburing/test/register-restrictions.c +0 -633
  442. package/deps/liburing/liburing/test/rename.c +0 -134
  443. package/deps/liburing/liburing/test/ring-leak.c +0 -173
  444. package/deps/liburing/liburing/test/ring-leak2.c +0 -249
  445. package/deps/liburing/liburing/test/rsrc_tags.c +0 -449
  446. package/deps/liburing/liburing/test/runtests-loop.sh +0 -16
  447. package/deps/liburing/liburing/test/runtests.sh +0 -170
  448. package/deps/liburing/liburing/test/rw_merge_test.c +0 -97
  449. package/deps/liburing/liburing/test/self.c +0 -91
  450. package/deps/liburing/liburing/test/send_recv.c +0 -291
  451. package/deps/liburing/liburing/test/send_recvmsg.c +0 -345
  452. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +0 -198
  453. package/deps/liburing/liburing/test/shared-wq.c +0 -84
  454. package/deps/liburing/liburing/test/short-read.c +0 -75
  455. package/deps/liburing/liburing/test/shutdown.c +0 -163
  456. package/deps/liburing/liburing/test/sigfd-deadlock.c +0 -74
  457. package/deps/liburing/liburing/test/socket-rw-eagain.c +0 -156
  458. package/deps/liburing/liburing/test/socket-rw.c +0 -147
  459. package/deps/liburing/liburing/test/splice.c +0 -511
  460. package/deps/liburing/liburing/test/sq-full-cpp.cc +0 -45
  461. package/deps/liburing/liburing/test/sq-full.c +0 -45
  462. package/deps/liburing/liburing/test/sq-poll-dup.c +0 -200
  463. package/deps/liburing/liburing/test/sq-poll-kthread.c +0 -168
  464. package/deps/liburing/liburing/test/sq-poll-share.c +0 -137
  465. package/deps/liburing/liburing/test/sq-space_left.c +0 -159
  466. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +0 -159
  467. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +0 -195
  468. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +0 -77
  469. package/deps/liburing/liburing/test/sqpoll-sleep.c +0 -68
  470. package/deps/liburing/liburing/test/statx.c +0 -172
  471. package/deps/liburing/liburing/test/stdout.c +0 -232
  472. package/deps/liburing/liburing/test/submit-link-fail.c +0 -154
  473. package/deps/liburing/liburing/test/submit-reuse.c +0 -239
  474. package/deps/liburing/liburing/test/symlink.c +0 -116
  475. package/deps/liburing/liburing/test/teardowns.c +0 -58
  476. package/deps/liburing/liburing/test/thread-exit.c +0 -131
  477. package/deps/liburing/liburing/test/timeout-new.c +0 -246
  478. package/deps/liburing/liburing/test/timeout-overflow.c +0 -204
  479. package/deps/liburing/liburing/test/timeout.c +0 -1354
  480. package/deps/liburing/liburing/test/unlink.c +0 -111
  481. package/deps/liburing/liburing/test/wakeup-hang.c +0 -162
  482. package/deps/rocksdb/rocksdb/README.md +0 -32
  483. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  484. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  485. package/deps/rocksdb/rocksdb/port/README +0 -10
  486. package/deps/rocksdb/rocksdb/python.mk +0 -9
  487. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  488. package/prebuilds/darwin-x64/node.napi.node +0 -0
  489. package/prebuilds/linux-arm64/node.napi.node +0 -0
  490. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -369,6 +369,46 @@ TEST_F(RangeLockingTest, LockWaitCount) {
369
369
  delete txn1;
370
370
  }
371
371
 
372
+ TEST_F(RangeLockingTest, LockWaiteeAccess) {
373
+ TransactionOptions txn_options;
374
+ auto cf = db->DefaultColumnFamily();
375
+ txn_options.lock_timeout = 60;
376
+ Transaction* txn0 = db->BeginTransaction(WriteOptions(), txn_options);
377
+ Transaction* txn1 = db->BeginTransaction(WriteOptions(), txn_options);
378
+
379
+ // Get a range lock
380
+ ASSERT_OK(txn0->GetRangeLock(cf, Endpoint("a"), Endpoint("c")));
381
+
382
+ std::atomic<bool> reached(false);
383
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
384
+ "RangeTreeLockManager::TryRangeLock:EnterWaitingTxn", [&](void* /*arg*/) {
385
+ reached.store(true);
386
+ std::this_thread::sleep_for(std::chrono::milliseconds(2000));
387
+ });
388
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
389
+
390
+ port::Thread t([&]() {
391
+ // Attempt to get a conflicting lock
392
+ auto s = txn1->GetRangeLock(cf, Endpoint("b"), Endpoint("z"));
393
+ ASSERT_TRUE(s.ok());
394
+ txn1->Rollback();
395
+ });
396
+
397
+ while (!reached.load()) {
398
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
399
+ }
400
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
401
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
402
+
403
+ // Release locks and free the transaction
404
+ txn0->Rollback();
405
+ delete txn0;
406
+
407
+ t.join();
408
+
409
+ delete txn1;
410
+ }
411
+
372
412
  void PointLockManagerTestExternalSetup(PointLockManagerTest* self) {
373
413
  self->env_ = Env::Default();
374
414
  self->db_dir_ = test::PerThreadDBPath("point_lock_manager_test");
@@ -368,8 +368,6 @@ void lock_request::retry_all_lock_requests(
368
368
 
369
369
  toku_mutex_lock(&info->retry_mutex);
370
370
 
371
- lock_wait_infos conflicts_collector;
372
-
373
371
  // here is the group retry algorithm.
374
372
  // get the latest retry_want count and use it as the generation number of
375
373
  // this retry operation. if this retry generation is > the last retry
@@ -381,7 +379,7 @@ void lock_request::retry_all_lock_requests(
381
379
  info->running_retry = true;
382
380
  info->retry_done = info->retry_want;
383
381
  toku_mutex_unlock(&info->retry_mutex);
384
- retry_all_lock_requests_info(info, &conflicts_collector);
382
+ retry_all_lock_requests_info(info, lock_wait_callback, callback_arg);
385
383
  if (after_retry_all_test_callback) after_retry_all_test_callback();
386
384
  toku_mutex_lock(&info->retry_mutex);
387
385
  info->running_retry = false;
@@ -393,14 +391,14 @@ void lock_request::retry_all_lock_requests(
393
391
  }
394
392
  }
395
393
  toku_mutex_unlock(&info->retry_mutex);
396
-
397
- report_waits(&conflicts_collector, lock_wait_callback, callback_arg);
398
394
  }
399
395
 
400
- void lock_request::retry_all_lock_requests_info(lt_lock_request_info *info,
401
- lock_wait_infos *collector) {
396
+ void lock_request::retry_all_lock_requests_info(
397
+ lt_lock_request_info *info,
398
+ void (*lock_wait_callback)(void *, lock_wait_infos *), void *callback_arg) {
402
399
  toku_external_mutex_lock(&info->mutex);
403
400
  // retry all of the pending lock requests.
401
+ lock_wait_infos conflicts_collector;
404
402
  for (uint32_t i = 0; i < info->pending_lock_requests.size();) {
405
403
  lock_request *request;
406
404
  int r = info->pending_lock_requests.fetch(i, &request);
@@ -410,12 +408,16 @@ void lock_request::retry_all_lock_requests_info(lt_lock_request_info *info,
410
408
  // move on to the next lock request. otherwise
411
409
  // the request is gone from the list so we may
412
410
  // read the i'th entry for the next one.
413
- r = request->retry(collector);
411
+ r = request->retry(&conflicts_collector);
414
412
  if (r != 0) {
415
413
  i++;
416
414
  }
417
415
  }
418
416
 
417
+ // call report_waits while holding the pending queue lock since
418
+ // the waiter object is still valid while it's in the queue
419
+ report_waits(&conflicts_collector, lock_wait_callback, callback_arg);
420
+
419
421
  // future threads should only retry lock requests if some still exist
420
422
  info->should_retry_lock_requests = info->pending_lock_requests.size() > 0;
421
423
  toku_external_mutex_unlock(&info->mutex);
@@ -140,8 +140,10 @@ class lock_request {
140
140
  void (*lock_wait_callback)(void *, lock_wait_infos *) = nullptr,
141
141
  void *callback_arg = nullptr,
142
142
  void (*after_retry_test_callback)(void) = nullptr);
143
- static void retry_all_lock_requests_info(lt_lock_request_info *info,
144
- lock_wait_infos *collector);
143
+ static void retry_all_lock_requests_info(
144
+ lt_lock_request_info *info,
145
+ void (*lock_wait_callback)(void *, lock_wait_infos *),
146
+ void *callback_arg);
145
147
 
146
148
  void set_start_test_callback(void (*f)(void));
147
149
  void set_start_before_pending_test_callback(void (*f)(void));
@@ -137,6 +137,23 @@ static inline tokutime_t toku_time_now(void) {
137
137
  uint64_t result;
138
138
  asm volatile("stckf %0" : "=Q"(result) : : "cc");
139
139
  return result;
140
+ #elif defined(__riscv) && __riscv_xlen == 32
141
+ uint32_t cycles_lo, cycles_hi0, cycles_hi1;
142
+ // Implemented in assembly because Clang insisted on branching.
143
+ asm volatile(
144
+ "rdcycleh %0\n"
145
+ "rdcycle %1\n"
146
+ "rdcycleh %2\n"
147
+ "sub %0, %0, %2\n"
148
+ "seqz %0, %0\n"
149
+ "sub %0, zero, %0\n"
150
+ "and %1, %1, %0\n"
151
+ : "=r"(cycles_hi0), "=r"(cycles_lo), "=r"(cycles_hi1));
152
+ return (static_cast<uint64_t>(cycles_hi1) << 32) | cycles_lo;
153
+ #elif defined(__riscv) && __riscv_xlen == 64
154
+ uint64_t cycles;
155
+ asm volatile("rdcycle %0" : "=r"(cycles));
156
+ return cycles;
140
157
  #else
141
158
  #error No timer implementation for this platform
142
159
  #endif
@@ -111,8 +111,7 @@ Status RangeTreeLockManager::TryLock(PessimisticTransaction* txn,
111
111
  deserialize_endpoint(start_dbt, &start);
112
112
  deserialize_endpoint(end_dbt, &end);
113
113
 
114
- di_path.push_back({((PessimisticTransaction*)txnid)->GetID(),
115
- column_family_id, is_exclusive, std::move(start),
114
+ di_path.push_back({txnid, column_family_id, is_exclusive, std::move(start),
116
115
  std::move(end)});
117
116
  };
118
117
 
@@ -150,13 +149,16 @@ Status RangeTreeLockManager::TryLock(PessimisticTransaction* txn,
150
149
  // Wait callback that locktree library will call to inform us about
151
150
  // the lock waits that are in progress.
152
151
  void wait_callback_for_locktree(void*, toku::lock_wait_infos* infos) {
152
+ TEST_SYNC_POINT("RangeTreeLockManager::TryRangeLock:EnterWaitingTxn");
153
153
  for (auto wait_info : *infos) {
154
+ // As long as we hold the lock on the locktree's pending request queue
155
+ // this should be safe.
154
156
  auto txn = (PessimisticTransaction*)wait_info.waiter;
155
157
  auto cf_id = (ColumnFamilyId)wait_info.ltree->get_dict_id().dictid;
156
158
 
157
159
  autovector<TransactionID> waitee_ids;
158
160
  for (auto waitee : wait_info.waitees) {
159
- waitee_ids.push_back(((PessimisticTransaction*)waitee)->GetID());
161
+ waitee_ids.push_back(waitee);
160
162
  }
161
163
  txn->SetWaitingTxn(waitee_ids, cf_id, (std::string*)wait_info.m_extra);
162
164
  }
@@ -475,12 +477,10 @@ static void push_into_lock_status_data(void* param, const DBT* left,
475
477
  deserialize_endpoint(right, &info.end);
476
478
 
477
479
  if (txnid_arg != TXNID_SHARED) {
478
- TXNID txnid = ((PessimisticTransaction*)txnid_arg)->GetID();
479
- info.ids.push_back(txnid);
480
+ info.ids.push_back(txnid_arg);
480
481
  } else {
481
482
  for (auto it : *owners) {
482
- TXNID real_id = ((PessimisticTransaction*)it)->GetID();
483
- info.ids.push_back(real_id);
483
+ info.ids.push_back(it);
484
484
  }
485
485
  }
486
486
  ctx->data->insert({ctx->cfh_id, info});
@@ -61,7 +61,14 @@ PessimisticTransaction::PessimisticTransaction(
61
61
  }
62
62
 
63
63
  void PessimisticTransaction::Initialize(const TransactionOptions& txn_options) {
64
- txn_id_ = GenTxnID();
64
+ // Range lock manager uses address of transaction object as TXNID
65
+ const TransactionDBOptions& db_options = txn_db_impl_->GetTxnDBOptions();
66
+ if (db_options.lock_mgr_handle &&
67
+ db_options.lock_mgr_handle->getLockManager()->IsRangeLockSupported()) {
68
+ txn_id_ = reinterpret_cast<TransactionID>(this);
69
+ } else {
70
+ txn_id_ = GenTxnID();
71
+ }
65
72
 
66
73
  txn_state_ = STARTED;
67
74
 
@@ -9,6 +9,7 @@
9
9
  #include <assert.h>
10
10
  #endif // ROCKSDB_LITE
11
11
 
12
+ #include "port/lang.h"
12
13
  #include "utilities/transactions/write_prepared_txn_db.h"
13
14
 
14
15
  namespace ROCKSDB_NAMESPACE {
@@ -44,6 +45,9 @@ SnapshotCheckerResult WritePreparedSnapshotChecker::CheckInSnapshot(
44
45
  }
45
46
 
46
47
  #endif // ROCKSDB_LITE
47
- DisableGCSnapshotChecker DisableGCSnapshotChecker::instance_;
48
48
 
49
+ DisableGCSnapshotChecker* DisableGCSnapshotChecker::Instance() {
50
+ STATIC_AVOID_DESTRUCTION(DisableGCSnapshotChecker, instance);
51
+ return &instance;
52
+ }
49
53
  } // namespace ROCKSDB_NAMESPACE
@@ -574,8 +574,8 @@ TEST_P(TransactionTest, DeadlockCycleShared) {
574
574
  for (uint32_t i = 0; i < 31; i++) {
575
575
  txns[i] = db->BeginTransaction(write_options, txn_options);
576
576
  ASSERT_TRUE(txns[i]);
577
- auto s = txns[i]->GetForUpdate(read_options, ToString((i + 1) / 2), nullptr,
578
- false /* exclusive */);
577
+ auto s = txns[i]->GetForUpdate(read_options, std::to_string((i + 1) / 2),
578
+ nullptr, false /* exclusive */);
579
579
  ASSERT_OK(s);
580
580
  }
581
581
 
@@ -589,8 +589,8 @@ TEST_P(TransactionTest, DeadlockCycleShared) {
589
589
  std::vector<port::Thread> threads;
590
590
  for (uint32_t i = 0; i < 15; i++) {
591
591
  std::function<void()> blocking_thread = [&, i] {
592
- auto s = txns[i]->GetForUpdate(read_options, ToString(i + 1), nullptr,
593
- true /* exclusive */);
592
+ auto s = txns[i]->GetForUpdate(read_options, std::to_string(i + 1),
593
+ nullptr, true /* exclusive */);
594
594
  ASSERT_OK(s);
595
595
  ASSERT_OK(txns[i]->Rollback());
596
596
  delete txns[i];
@@ -641,7 +641,7 @@ TEST_P(TransactionTest, DeadlockCycleShared) {
641
641
  auto dl_node = *it;
642
642
  ASSERT_EQ(dl_node.m_txn_id, offset_root + leaf_id);
643
643
  ASSERT_EQ(dl_node.m_cf_id, 0U);
644
- ASSERT_EQ(dl_node.m_waiting_key, ToString(curr_waiting_key));
644
+ ASSERT_EQ(dl_node.m_waiting_key, std::to_string(curr_waiting_key));
645
645
  ASSERT_EQ(dl_node.m_exclusive, true);
646
646
 
647
647
  if (curr_waiting_key == 0) {
@@ -708,7 +708,8 @@ TEST_P(TransactionTest, DeadlockCycleShared) {
708
708
  for (uint32_t i = 0; i < 2; i++) {
709
709
  txns_shared[i] = db->BeginTransaction(write_options, txn_options);
710
710
  ASSERT_TRUE(txns_shared[i]);
711
- auto s = txns_shared[i]->GetForUpdate(read_options, ToString(i), nullptr);
711
+ auto s =
712
+ txns_shared[i]->GetForUpdate(read_options, std::to_string(i), nullptr);
712
713
  ASSERT_OK(s);
713
714
  }
714
715
 
@@ -721,8 +722,8 @@ TEST_P(TransactionTest, DeadlockCycleShared) {
721
722
  std::vector<port::Thread> threads_shared;
722
723
  for (uint32_t i = 0; i < 1; i++) {
723
724
  std::function<void()> blocking_thread = [&, i] {
724
- auto s =
725
- txns_shared[i]->GetForUpdate(read_options, ToString(i + 1), nullptr);
725
+ auto s = txns_shared[i]->GetForUpdate(read_options, std::to_string(i + 1),
726
+ nullptr);
726
727
  ASSERT_OK(s);
727
728
  ASSERT_OK(txns_shared[i]->Rollback());
728
729
  delete txns_shared[i];
@@ -781,7 +782,7 @@ TEST_P(TransactionStressTest, DeadlockCycle) {
781
782
  for (uint32_t i = 0; i < len; i++) {
782
783
  txns[i] = db->BeginTransaction(write_options, txn_options);
783
784
  ASSERT_TRUE(txns[i]);
784
- auto s = txns[i]->GetForUpdate(read_options, ToString(i), nullptr);
785
+ auto s = txns[i]->GetForUpdate(read_options, std::to_string(i), nullptr);
785
786
  ASSERT_OK(s);
786
787
  }
787
788
 
@@ -796,7 +797,8 @@ TEST_P(TransactionStressTest, DeadlockCycle) {
796
797
  std::vector<port::Thread> threads;
797
798
  for (uint32_t i = 0; i + 1 < len; i++) {
798
799
  std::function<void()> blocking_thread = [&, i] {
799
- auto s = txns[i]->GetForUpdate(read_options, ToString(i + 1), nullptr);
800
+ auto s =
801
+ txns[i]->GetForUpdate(read_options, std::to_string(i + 1), nullptr);
800
802
  ASSERT_OK(s);
801
803
  ASSERT_OK(txns[i]->Rollback());
802
804
  delete txns[i];
@@ -848,7 +850,7 @@ TEST_P(TransactionStressTest, DeadlockCycle) {
848
850
  auto dl_node = *it;
849
851
  ASSERT_EQ(dl_node.m_txn_id, len + curr_txn_id - 1);
850
852
  ASSERT_EQ(dl_node.m_cf_id, 0u);
851
- ASSERT_EQ(dl_node.m_waiting_key, ToString(curr_waiting_key));
853
+ ASSERT_EQ(dl_node.m_waiting_key, std::to_string(curr_waiting_key));
852
854
  ASSERT_EQ(dl_node.m_exclusive, true);
853
855
 
854
856
  curr_txn_id--;
@@ -882,8 +884,8 @@ TEST_P(TransactionStressTest, DeadlockStress) {
882
884
  std::vector<std::string> keys;
883
885
 
884
886
  for (uint32_t i = 0; i < NUM_KEYS; i++) {
885
- ASSERT_OK(db->Put(write_options, Slice(ToString(i)), Slice("")));
886
- keys.push_back(ToString(i));
887
+ ASSERT_OK(db->Put(write_options, Slice(std::to_string(i)), Slice("")));
888
+ keys.push_back(std::to_string(i));
887
889
  }
888
890
 
889
891
  size_t tid = std::hash<std::thread::id>()(std::this_thread::get_id());
@@ -959,8 +961,8 @@ TEST_P(TransactionTest, LogMarkLeakTest) {
959
961
  ASSERT_EQ(db_impl->TEST_FindMinLogContainingOutstandingPrep(), 0);
960
962
  for (size_t i = 0; i < 100; i++) {
961
963
  Transaction* txn = db->BeginTransaction(write_options, txn_options);
962
- ASSERT_OK(txn->SetName("xid" + ToString(i)));
963
- ASSERT_OK(txn->Put(Slice("foo" + ToString(i)), Slice("bar")));
964
+ ASSERT_OK(txn->SetName("xid" + std::to_string(i)));
965
+ ASSERT_OK(txn->Put(Slice("foo" + std::to_string(i)), Slice("bar")));
964
966
  ASSERT_OK(txn->Prepare());
965
967
  ASSERT_GT(db_impl->TEST_FindMinLogContainingOutstandingPrep(), 0);
966
968
  if (rnd.OneIn(5)) {
@@ -5469,6 +5471,10 @@ Status TransactionStressTestInserter(
5469
5471
  TEST_P(MySQLStyleTransactionTest, TransactionStressTest) {
5470
5472
  // Small write buffer to trigger more compactions
5471
5473
  options.write_buffer_size = 1024;
5474
+ txn_db_options.rollback_deletion_type_callback =
5475
+ [](TransactionDB*, ColumnFamilyHandle*, const Slice& key) {
5476
+ return RandomTransactionInserter::RollbackDeletionTypeCallback(key);
5477
+ };
5472
5478
  ASSERT_OK(ReOpenNoDelete());
5473
5479
  constexpr size_t num_workers = 4; // worker threads count
5474
5480
  constexpr size_t num_checkers = 2; // checker threads count
@@ -79,7 +79,7 @@ Status TransactionUtil::CheckKey(DBImpl* db_impl, SuperVersion* sv,
79
79
  result = Status::TryAgain(
80
80
  "Transaction could not check for conflicts as the MemTable does not "
81
81
  "contain a long enough history to check write at SequenceNumber: ",
82
- ToString(snap_seq));
82
+ std::to_string(snap_seq));
83
83
  }
84
84
  } else if (snap_seq < earliest_seq || min_uncommitted <= earliest_seq) {
85
85
  // Use <= for min_uncommitted since earliest_seq is actually the largest sec
@@ -164,7 +164,7 @@ Status TransactionUtil::CheckKeysForConflicts(DBImpl* db_impl,
164
164
  SuperVersion* sv = db_impl->GetAndRefSuperVersion(cf);
165
165
  if (sv == nullptr) {
166
166
  result = Status::InvalidArgument("Could not access column family " +
167
- ToString(cf));
167
+ std::to_string(cf));
168
168
  break;
169
169
  }
170
170
 
@@ -1596,9 +1596,9 @@ TEST_P(WritePreparedTransactionTest, SmallestUnCommittedSeq) {
1596
1596
  const int cnt = 100;
1597
1597
  for (int i = 0; i < cnt; i++) {
1598
1598
  Transaction* txn = db->BeginTransaction(write_options, txn_options);
1599
- ASSERT_OK(txn->SetName("xid" + ToString(i)));
1600
- auto key = "key1" + ToString(i);
1601
- auto value = "value1" + ToString(i);
1599
+ ASSERT_OK(txn->SetName("xid" + std::to_string(i)));
1600
+ auto key = "key1" + std::to_string(i);
1601
+ auto value = "value1" + std::to_string(i);
1602
1602
  ASSERT_OK(txn->Put(Slice(key), Slice(value)));
1603
1603
  ASSERT_OK(txn->Prepare());
1604
1604
  txns.push_back(txn);
@@ -2229,7 +2229,7 @@ TEST_P(WritePreparedTransactionTest, Rollback) {
2229
2229
  for (bool crash : {false, true}) {
2230
2230
  ASSERT_OK(ReOpen());
2231
2231
  WritePreparedTxnDB* wp_db = dynamic_cast<WritePreparedTxnDB*>(db);
2232
- std::string key_str = "key" + ToString(ikey);
2232
+ std::string key_str = "key" + std::to_string(ikey);
2233
2233
  switch (ivalue) {
2234
2234
  case 0:
2235
2235
  break;
@@ -2335,7 +2335,7 @@ TEST_P(WritePreparedTransactionTest, DisableGCDuringRecovery) {
2335
2335
  std::vector<KeyVersion> versions;
2336
2336
  uint64_t seq = 0;
2337
2337
  for (uint64_t i = 1; i <= 1024; i++) {
2338
- std::string v = "bar" + ToString(i);
2338
+ std::string v = "bar" + std::to_string(i);
2339
2339
  ASSERT_OK(db->Put(WriteOptions(), "foo", v));
2340
2340
  VerifyKeys({{"foo", v}});
2341
2341
  seq++; // one for the key/value
@@ -3202,6 +3202,8 @@ TEST_P(WritePreparedTransactionTest, ReleaseEarliestSnapshotAfterSeqZeroing2) {
3202
3202
  TEST_P(WritePreparedTransactionTest, SingleDeleteAfterRollback) {
3203
3203
  constexpr size_t kSnapshotCacheBits = 7; // same as default
3204
3204
  constexpr size_t kCommitCacheBits = 0; // minimum commit cache
3205
+ txn_db_options.rollback_deletion_type_callback =
3206
+ [](TransactionDB*, ColumnFamilyHandle*, const Slice&) { return true; };
3205
3207
  UpdateTransactionDBOptions(kSnapshotCacheBits, kCommitCacheBits);
3206
3208
  options.disable_auto_compactions = true;
3207
3209
  ASSERT_OK(ReOpen());
@@ -3290,7 +3292,7 @@ TEST_P(WritePreparedTransactionTest,
3290
3292
  ASSERT_OK(ReOpen());
3291
3293
 
3292
3294
  for (size_t i = 0; i < kNumTransactions; i++) {
3293
- std::string key = "key" + ToString(i);
3295
+ std::string key = "key" + std::to_string(i);
3294
3296
  std::string value = "value0";
3295
3297
  ASSERT_OK(db->Put(WriteOptions(), key, value));
3296
3298
  current_data[key] = value;
@@ -3300,16 +3302,16 @@ TEST_P(WritePreparedTransactionTest,
3300
3302
  for (size_t iter = 0; iter < kNumIterations; iter++) {
3301
3303
  auto r = rnd.Next() % (kNumTransactions + 1);
3302
3304
  if (r < kNumTransactions) {
3303
- std::string key = "key" + ToString(r);
3305
+ std::string key = "key" + std::to_string(r);
3304
3306
  if (transactions[r] == nullptr) {
3305
- std::string value = "value" + ToString(versions[r] + 1);
3307
+ std::string value = "value" + std::to_string(versions[r] + 1);
3306
3308
  auto* txn = db->BeginTransaction(WriteOptions());
3307
- ASSERT_OK(txn->SetName("txn" + ToString(r)));
3309
+ ASSERT_OK(txn->SetName("txn" + std::to_string(r)));
3308
3310
  ASSERT_OK(txn->Put(key, value));
3309
3311
  ASSERT_OK(txn->Prepare());
3310
3312
  transactions[r] = txn;
3311
3313
  } else {
3312
- std::string value = "value" + ToString(++versions[r]);
3314
+ std::string value = "value" + std::to_string(++versions[r]);
3313
3315
  ASSERT_OK(transactions[r]->Commit());
3314
3316
  delete transactions[r];
3315
3317
  transactions[r] = nullptr;
@@ -3886,7 +3888,7 @@ TEST_P(WritePreparedTransactionTest, CommitOfDelayedPrepared) {
3886
3888
  Transaction* txn =
3887
3889
  db->BeginTransaction(WriteOptions(), TransactionOptions());
3888
3890
  ASSERT_OK(txn->SetName("xid"));
3889
- std::string val_str = "value" + ToString(i);
3891
+ std::string val_str = "value" + std::to_string(i);
3890
3892
  for (size_t b = 0; b < sub_batch_cnt; b++) {
3891
3893
  ASSERT_OK(txn->Put(Slice("key2"), val_str));
3892
3894
  }
@@ -3970,6 +3972,62 @@ TEST_P(WritePreparedTransactionTest, AtomicCommit) {
3970
3972
  }
3971
3973
  }
3972
3974
 
3975
+ TEST_P(WritePreparedTransactionTest, BasicRollbackDeletionTypeCb) {
3976
+ options.level0_file_num_compaction_trigger = 2;
3977
+ // Always use SingleDelete to rollback Put.
3978
+ txn_db_options.rollback_deletion_type_callback =
3979
+ [](TransactionDB*, ColumnFamilyHandle*, const Slice&) { return true; };
3980
+
3981
+ const auto write_to_db = [&]() {
3982
+ assert(db);
3983
+ std::unique_ptr<Transaction> txn0(
3984
+ db->BeginTransaction(WriteOptions(), TransactionOptions()));
3985
+ ASSERT_OK(txn0->SetName("txn0"));
3986
+ ASSERT_OK(txn0->Put("a", "v0"));
3987
+ ASSERT_OK(txn0->Prepare());
3988
+
3989
+ // Generate sst1: [PUT('a')]
3990
+ ASSERT_OK(db->Flush(FlushOptions()));
3991
+
3992
+ {
3993
+ CompactRangeOptions cro;
3994
+ cro.change_level = true;
3995
+ cro.target_level = options.num_levels - 1;
3996
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
3997
+ ASSERT_OK(db->CompactRange(cro, /*begin=*/nullptr, /*end=*/nullptr));
3998
+ }
3999
+
4000
+ ASSERT_OK(txn0->Rollback());
4001
+ txn0.reset();
4002
+
4003
+ ASSERT_OK(db->Put(WriteOptions(), "a", "v1"));
4004
+
4005
+ ASSERT_OK(db->SingleDelete(WriteOptions(), "a"));
4006
+ // Generate another SST with a SD to cover the oldest PUT('a')
4007
+ ASSERT_OK(db->Flush(FlushOptions()));
4008
+
4009
+ auto* dbimpl = static_cast_with_check<DBImpl>(db->GetRootDB());
4010
+ assert(dbimpl);
4011
+ ASSERT_OK(dbimpl->TEST_WaitForCompact());
4012
+
4013
+ {
4014
+ CompactRangeOptions cro;
4015
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
4016
+ ASSERT_OK(db->CompactRange(cro, /*begin=*/nullptr, /*end=*/nullptr));
4017
+ }
4018
+
4019
+ {
4020
+ std::string value;
4021
+ const Status s = db->Get(ReadOptions(), "a", &value);
4022
+ ASSERT_TRUE(s.IsNotFound());
4023
+ }
4024
+ };
4025
+
4026
+ // Destroy and reopen
4027
+ ASSERT_OK(ReOpen());
4028
+ write_to_db();
4029
+ }
4030
+
3973
4031
  // Test that we can change write policy from WriteCommitted to WritePrepared
3974
4032
  // after a clean shutdown (which would empty the WAL)
3975
4033
  TEST_P(WritePreparedTransactionTest, WP_WC_DBBackwardCompatibility) {
@@ -263,6 +263,10 @@ Status WritePreparedTxn::CommitInternal() {
263
263
  Status WritePreparedTxn::RollbackInternal() {
264
264
  ROCKS_LOG_WARN(db_impl_->immutable_db_options().info_log,
265
265
  "RollbackInternal prepare_seq: %" PRIu64, GetId());
266
+
267
+ assert(db_impl_);
268
+ assert(wpt_db_);
269
+
266
270
  WriteBatch rollback_batch;
267
271
  assert(GetId() != kMaxSequenceNumber);
268
272
  assert(GetId() > 0);
@@ -273,8 +277,9 @@ Status WritePreparedTxn::RollbackInternal() {
273
277
  // to prevent callback's seq to be overrriden inside DBImpk::Get
274
278
  roptions.snapshot = wpt_db_->GetMaxSnapshot();
275
279
  struct RollbackWriteBatchBuilder : public WriteBatch::Handler {
276
- DBImpl* db_;
277
- WritePreparedTxnReadCallback callback;
280
+ DBImpl* const db_;
281
+ WritePreparedTxnDB* const wpt_db_;
282
+ WritePreparedTxnReadCallback callback_;
278
283
  WriteBatch* rollback_batch_;
279
284
  std::map<uint32_t, const Comparator*>& comparators_;
280
285
  std::map<uint32_t, ColumnFamilyHandle*>& handles_;
@@ -282,14 +287,16 @@ Status WritePreparedTxn::RollbackInternal() {
282
287
  std::map<uint32_t, CFKeys> keys_;
283
288
  bool rollback_merge_operands_;
284
289
  ReadOptions roptions_;
290
+
285
291
  RollbackWriteBatchBuilder(
286
292
  DBImpl* db, WritePreparedTxnDB* wpt_db, SequenceNumber snap_seq,
287
293
  WriteBatch* dst_batch,
288
294
  std::map<uint32_t, const Comparator*>& comparators,
289
295
  std::map<uint32_t, ColumnFamilyHandle*>& handles,
290
- bool rollback_merge_operands, ReadOptions _roptions)
296
+ bool rollback_merge_operands, const ReadOptions& _roptions)
291
297
  : db_(db),
292
- callback(wpt_db, snap_seq), // disable min_uncommitted optimization
298
+ wpt_db_(wpt_db),
299
+ callback_(wpt_db, snap_seq), // disable min_uncommitted optimization
293
300
  rollback_batch_(dst_batch),
294
301
  comparators_(comparators),
295
302
  handles_(handles),
@@ -304,8 +311,8 @@ Status WritePreparedTxn::RollbackInternal() {
304
311
  keys_[cf] = CFKeys(SetComparator(cmp));
305
312
  }
306
313
  auto it = cf_keys.insert(key);
307
- if (it.second ==
308
- false) { // second is false if a element already existed.
314
+ // second is false if a element already existed.
315
+ if (it.second == false) {
309
316
  return s;
310
317
  }
311
318
 
@@ -316,7 +323,7 @@ Status WritePreparedTxn::RollbackInternal() {
316
323
  get_impl_options.column_family = cf_handle;
317
324
  get_impl_options.value = &pinnable_val;
318
325
  get_impl_options.value_found = &not_used;
319
- get_impl_options.callback = &callback;
326
+ get_impl_options.callback = &callback_;
320
327
  s = db_->GetImpl(roptions_, key, get_impl_options);
321
328
  assert(s.ok() || s.IsNotFound());
322
329
  if (s.ok()) {
@@ -325,7 +332,11 @@ Status WritePreparedTxn::RollbackInternal() {
325
332
  } else if (s.IsNotFound()) {
326
333
  // There has been no readable value before txn. By adding a delete we
327
334
  // make sure that there will be none afterwards either.
328
- s = rollback_batch_->Delete(cf_handle, key);
335
+ if (wpt_db_->ShouldRollbackWithSingleDelete(cf_handle, key)) {
336
+ s = rollback_batch_->SingleDelete(cf_handle, key);
337
+ } else {
338
+ s = rollback_batch_->Delete(cf_handle, key);
339
+ }
329
340
  assert(s.ok());
330
341
  } else {
331
342
  // Unexpected status. Return it to the user.
@@ -363,7 +374,9 @@ Status WritePreparedTxn::RollbackInternal() {
363
374
  }
364
375
 
365
376
  protected:
366
- bool WriteAfterCommit() const override { return false; }
377
+ Handler::OptionState WriteAfterCommit() const override {
378
+ return Handler::OptionState::kDisabled;
379
+ }
367
380
  } rollback_handler(db_impl_, wpt_db_, read_at_seq, &rollback_batch,
368
381
  *cf_comp_map_shared_ptr.get(), *cf_map_shared_ptr.get(),
369
382
  wpt_db_->txn_db_options_.rollback_merge_operands,
@@ -26,6 +26,18 @@
26
26
  #include "utilities/transactions/pessimistic_transaction.h"
27
27
  #include "utilities/transactions/transaction_db_mutex_impl.h"
28
28
 
29
+ // This function is for testing only. If it returns true, then all entries in
30
+ // the commit cache will be evicted. Unit and/or stress tests (db_stress)
31
+ // can implement this function and customize how frequently commit cache
32
+ // eviction occurs.
33
+ // TODO: remove this function once we can configure commit cache to be very
34
+ // small so that eviction occurs very frequently. This requires the commit
35
+ // cache entry to be able to encode prepare and commit sequence numbers so that
36
+ // the commit sequence number does not have to be within a certain range of
37
+ // prepare sequence number.
38
+ extern "C" bool rocksdb_write_prepared_TEST_ShouldClearCommitCache(void)
39
+ __attribute__((__weak__));
40
+
29
41
  namespace ROCKSDB_NAMESPACE {
30
42
 
31
43
  Status WritePreparedTxnDB::Initialize(
@@ -394,7 +406,7 @@ Status WritePreparedTxnDB::NewIterators(
394
406
  return Status::OK();
395
407
  }
396
408
 
397
- void WritePreparedTxnDB::Init(const TransactionDBOptions& /* unused */) {
409
+ void WritePreparedTxnDB::Init(const TransactionDBOptions& txn_db_opts) {
398
410
  // Adcance max_evicted_seq_ no more than 100 times before the cache wraps
399
411
  // around.
400
412
  INC_STEP_FOR_MAX_EVICTED =
@@ -404,6 +416,8 @@ void WritePreparedTxnDB::Init(const TransactionDBOptions& /* unused */) {
404
416
  commit_cache_ = std::unique_ptr<std::atomic<CommitEntry64b>[]>(
405
417
  new std::atomic<CommitEntry64b>[COMMIT_CACHE_SIZE] {});
406
418
  dummy_max_snapshot_.number_ = kMaxSequenceNumber;
419
+ rollback_deletion_type_callback_ =
420
+ txn_db_opts.rollback_deletion_type_callback;
407
421
  }
408
422
 
409
423
  void WritePreparedTxnDB::CheckPreparedAgainstMax(SequenceNumber new_max,
@@ -433,7 +447,7 @@ void WritePreparedTxnDB::CheckPreparedAgainstMax(SequenceNumber new_max,
433
447
  delayed_prepared_.insert(to_be_popped);
434
448
  ROCKS_LOG_WARN(info_log_,
435
449
  "prepared_mutex_ overhead %" PRIu64 " (prep=%" PRIu64
436
- " new_max=%" PRIu64,
450
+ " new_max=%" PRIu64 ")",
437
451
  static_cast<uint64_t>(delayed_prepared_.size()),
438
452
  to_be_popped, new_max);
439
453
  delayed_prepared_empty_.store(false, std::memory_order_release);
@@ -503,6 +517,12 @@ void WritePreparedTxnDB::AddCommitted(uint64_t prepare_seq, uint64_t commit_seq,
503
517
  // legit when a commit entry in a write batch overwrite the previous one
504
518
  max_evicted_seq = evicted.commit_seq;
505
519
  }
520
+ #ifdef OS_LINUX
521
+ if (rocksdb_write_prepared_TEST_ShouldClearCommitCache &&
522
+ rocksdb_write_prepared_TEST_ShouldClearCommitCache()) {
523
+ max_evicted_seq = last;
524
+ }
525
+ #endif // OS_LINUX
506
526
  ROCKS_LOG_DETAILS(info_log_,
507
527
  "%lu Evicting %" PRIu64 ",%" PRIu64 " with max %" PRIu64
508
528
  " => %lu",
@@ -706,9 +726,10 @@ SnapshotImpl* WritePreparedTxnDB::GetSnapshotInternal(
706
726
  assert(snap_impl->GetSequenceNumber() > max);
707
727
  if (snap_impl->GetSequenceNumber() <= max) {
708
728
  throw std::runtime_error(
709
- "Snapshot seq " + ToString(snap_impl->GetSequenceNumber()) +
710
- " after " + ToString(retry) +
711
- " retries is still less than futre_max_evicted_seq_" + ToString(max));
729
+ "Snapshot seq " + std::to_string(snap_impl->GetSequenceNumber()) +
730
+ " after " + std::to_string(retry) +
731
+ " retries is still less than futre_max_evicted_seq_" +
732
+ std::to_string(max));
712
733
  }
713
734
  }
714
735
  EnhanceSnapshot(snap_impl, min_uncommitted);