@nxtedition/rocksdb 10.1.5 → 10.2.0

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 (255) hide show
  1. package/binding.cc +19 -11
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -5
  3. package/deps/rocksdb/rocksdb/Makefile +38 -15
  4. package/deps/rocksdb/rocksdb/TARGETS +10 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -0
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +4 -4
  7. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +4 -2
  8. package/deps/rocksdb/rocksdb/db/builder.cc +2 -2
  9. package/deps/rocksdb/rocksdb/db/builder.h +1 -1
  10. package/deps/rocksdb/rocksdb/db/c.cc +205 -6
  11. package/deps/rocksdb/rocksdb/db/c_test.c +189 -1
  12. package/deps/rocksdb/rocksdb/db/column_family.cc +28 -0
  13. package/deps/rocksdb/rocksdb/db/column_family.h +17 -0
  14. package/deps/rocksdb/rocksdb/db/column_family_test.cc +234 -60
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +8 -1
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -9
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +4 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -0
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +22 -25
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +112 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +72 -21
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +2 -0
  25. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +77 -0
  26. package/deps/rocksdb/rocksdb/db/convenience.cc +3 -0
  27. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +269 -112
  28. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +107 -43
  29. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +93 -24
  30. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +5 -5
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +157 -68
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +56 -15
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -105
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +39 -9
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +21 -14
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +107 -63
  38. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +43 -2
  39. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +4 -0
  40. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +6 -0
  41. package/deps/rocksdb/rocksdb/db/db_test.cc +10 -2
  42. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
  44. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -6
  45. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +92 -2
  46. package/deps/rocksdb/rocksdb/db/error_handler.cc +34 -39
  47. package/deps/rocksdb/rocksdb/db/error_handler.h +3 -4
  48. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/event_helpers.cc +6 -3
  50. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +71 -15
  51. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +11 -0
  52. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +383 -4
  53. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +88 -72
  54. package/deps/rocksdb/rocksdb/db/flush_job.cc +30 -3
  55. package/deps/rocksdb/rocksdb/db/flush_job.h +14 -0
  56. package/deps/rocksdb/rocksdb/db/internal_stats.cc +60 -1
  57. package/deps/rocksdb/rocksdb/db/internal_stats.h +20 -1
  58. package/deps/rocksdb/rocksdb/db/log_writer.cc +24 -0
  59. package/deps/rocksdb/rocksdb/db/log_writer.h +5 -0
  60. package/deps/rocksdb/rocksdb/db/memtable.cc +6 -4
  61. package/deps/rocksdb/rocksdb/db/memtable.h +10 -10
  62. package/deps/rocksdb/rocksdb/db/memtable_list.cc +4 -4
  63. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +10 -3
  64. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +8 -10
  65. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  66. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +30 -0
  67. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +9 -0
  68. package/deps/rocksdb/rocksdb/db/table_cache.cc +17 -2
  69. package/deps/rocksdb/rocksdb/db/table_cache.h +9 -1
  70. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +9 -2
  71. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +3 -1
  72. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -3
  73. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +7 -7
  74. package/deps/rocksdb/rocksdb/db/version_edit.cc +0 -1
  75. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -6
  76. package/deps/rocksdb/rocksdb/db/version_set.cc +54 -31
  77. package/deps/rocksdb/rocksdb/db/version_set.h +14 -7
  78. package/deps/rocksdb/rocksdb/db/wal_manager.cc +37 -29
  79. package/deps/rocksdb/rocksdb/db/wal_manager.h +6 -5
  80. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +6 -0
  81. package/deps/rocksdb/rocksdb/db/write_batch.cc +54 -23
  82. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +46 -5
  83. package/deps/rocksdb/rocksdb/db/write_thread.cc +53 -5
  84. package/deps/rocksdb/rocksdb/db/write_thread.h +36 -4
  85. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  86. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -0
  87. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +57 -17
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +11 -3
  89. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -4
  90. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +10 -25
  91. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +25 -88
  92. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.cc +93 -0
  93. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.h +16 -0
  94. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +43 -0
  95. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +109 -21
  96. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -0
  97. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +666 -205
  98. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +55 -10
  99. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -16
  100. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +19 -0
  101. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +5 -0
  102. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +782 -494
  103. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +21 -0
  104. package/deps/rocksdb/rocksdb/env/env.cc +6 -0
  105. package/deps/rocksdb/rocksdb/env/io_posix.cc +0 -1
  106. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  107. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +34 -19
  108. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +29 -32
  109. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +41 -15
  110. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -2
  111. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +63 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +16 -5
  113. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +5 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +0 -16
  115. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +16 -0
  116. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +21 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +76 -3
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +17 -0
  119. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +12 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +31 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/user_write_callback.h +29 -0
  122. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +4 -2
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +0 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +17 -8
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +2 -2
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +46 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +7 -0
  128. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  129. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -2
  130. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  131. package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
  132. package/deps/rocksdb/rocksdb/options/db_options.h +9 -5
  133. package/deps/rocksdb/rocksdb/options/options.cc +3 -0
  134. package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
  135. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  136. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +2 -2
  137. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -0
  138. package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
  139. package/deps/rocksdb/rocksdb/src.mk +4 -0
  140. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +1 -2
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -2
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +15 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -41
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +15 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -3
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -6
  147. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +31 -0
  148. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -0
  149. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +10 -5
  150. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +11 -15
  151. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +17 -11
  152. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +5 -2
  153. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -21
  154. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +9 -11
  155. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -16
  156. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -2
  157. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +14 -9
  158. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +4 -1
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +82 -41
  160. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +13 -14
  161. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +18 -22
  162. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +51 -13
  163. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +3 -11
  165. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -3
  166. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +9 -10
  167. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +3 -2
  168. package/deps/rocksdb/rocksdb/table/format.cc +1 -2
  169. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +18 -13
  170. package/deps/rocksdb/rocksdb/table/merging_iterator.h +5 -3
  171. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +2 -2
  172. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +1 -1
  173. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +3 -1
  174. package/deps/rocksdb/rocksdb/table/table_builder.h +8 -7
  175. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  176. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -0
  177. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -0
  178. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +19 -0
  179. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +434 -110
  180. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -1
  181. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +3 -0
  182. package/deps/rocksdb/rocksdb/util/aligned_storage.h +24 -0
  183. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  184. package/deps/rocksdb/rocksdb/util/random.cc +2 -1
  185. package/deps/rocksdb/rocksdb/util/stderr_logger.h +1 -1
  186. package/deps/rocksdb/rocksdb/util/udt_util.cc +33 -0
  187. package/deps/rocksdb/rocksdb/util/udt_util.h +7 -0
  188. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +33 -0
  189. package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/xxhash.h +10 -3
  191. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +13 -13
  192. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +104 -48
  193. package/deps/rocksdb/rocksdb/utilities/debug.cc +16 -4
  194. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +647 -235
  195. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -157
  196. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +144 -0
  197. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +45 -0
  198. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector_test.cc +139 -0
  199. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +12 -0
  200. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +3 -0
  201. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +105 -6
  202. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +64 -8
  203. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
  204. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +43 -5
  205. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +5 -0
  206. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +154 -6
  207. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +1 -1
  208. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +158 -2
  209. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +16 -11
  210. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +4 -4
  211. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +9 -8
  212. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +2 -1
  213. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +43 -7
  214. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -0
  215. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +1 -1
  216. package/package.json +1 -1
  217. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  218. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  219. package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
  220. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  221. package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
  222. package/.tap/test-results/test/batch-test.js.tap +0 -12
  223. package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
  224. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
  225. package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
  226. package/.tap/test-results/test/column-test.js.tap +0 -55
  227. package/.tap/test-results/test/common.js.tap +0 -0
  228. package/.tap/test-results/test/compression-test.js.tap +0 -30
  229. package/.tap/test-results/test/db-identity.js.tap +0 -12
  230. package/.tap/test-results/test/electron.js.tap +0 -0
  231. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
  232. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  233. package/.tap/test-results/test/gc.js.tap +0 -0
  234. package/.tap/test-results/test/getproperty-test.js.tap +0 -29
  235. package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
  236. package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
  237. package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
  238. package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
  239. package/.tap/test-results/test/iterator-test.js.tap +0 -6
  240. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  241. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  242. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  243. package/.tap/test-results/test/lock-test.js.tap +0 -18
  244. package/.tap/test-results/test/lock.js.tap +0 -0
  245. package/.tap/test-results/test/make.js.tap +0 -0
  246. package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
  247. package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
  248. package/.tap/test-results/test/mkdir-test.js.tap +0 -15
  249. package/.tap/test-results/test/segfault-test.js.tap +0 -76
  250. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  251. package/deps/rocksdb/rocksdb/README.md +0 -29
  252. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  253. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  254. package/deps/rocksdb/rocksdb/port/README +0 -10
  255. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
@@ -351,6 +351,24 @@ Status TransactionBaseImpl::GetForUpdate(const ReadOptions& read_options,
351
351
  return s;
352
352
  }
353
353
 
354
+ Status TransactionBaseImpl::GetEntityForUpdate(
355
+ const ReadOptions& read_options, ColumnFamilyHandle* column_family,
356
+ const Slice& key, PinnableWideColumns* columns, bool exclusive,
357
+ bool do_validate) {
358
+ if (!do_validate && read_options.snapshot != nullptr) {
359
+ return Status::InvalidArgument(
360
+ "Snapshot must not be set if validation is disabled");
361
+ }
362
+
363
+ const Status s =
364
+ TryLock(column_family, key, true /* read_only */, exclusive, do_validate);
365
+ if (!s.ok()) {
366
+ return s;
367
+ }
368
+
369
+ return GetEntityImpl(read_options, column_family, key, columns);
370
+ }
371
+
354
372
  std::vector<Status> TransactionBaseImpl::MultiGet(
355
373
  const ReadOptions& _read_options,
356
374
  const std::vector<ColumnFamilyHandle*>& column_family,
@@ -814,11 +832,13 @@ Status TransactionBaseImpl::RebuildFromWriteBatch(WriteBatch* src_batch) {
814
832
  }
815
833
 
816
834
  Status PutCF(uint32_t cf, const Slice& key, const Slice& val) override {
817
- return txn_->Put(db_->GetColumnFamilyHandle(cf), key, val);
835
+ Slice user_key = GetUserKey(cf, key);
836
+ return txn_->Put(db_->GetColumnFamilyHandle(cf), user_key, val);
818
837
  }
819
838
 
820
839
  Status PutEntityCF(uint32_t cf, const Slice& key,
821
840
  const Slice& entity) override {
841
+ Slice user_key = GetUserKey(cf, key);
822
842
  Slice entity_copy = entity;
823
843
  WideColumns columns;
824
844
  const Status s =
@@ -827,19 +847,22 @@ Status TransactionBaseImpl::RebuildFromWriteBatch(WriteBatch* src_batch) {
827
847
  return s;
828
848
  }
829
849
 
830
- return txn_->PutEntity(db_->GetColumnFamilyHandle(cf), key, columns);
850
+ return txn_->PutEntity(db_->GetColumnFamilyHandle(cf), user_key, columns);
831
851
  }
832
852
 
833
853
  Status DeleteCF(uint32_t cf, const Slice& key) override {
834
- return txn_->Delete(db_->GetColumnFamilyHandle(cf), key);
854
+ Slice user_key = GetUserKey(cf, key);
855
+ return txn_->Delete(db_->GetColumnFamilyHandle(cf), user_key);
835
856
  }
836
857
 
837
858
  Status SingleDeleteCF(uint32_t cf, const Slice& key) override {
838
- return txn_->SingleDelete(db_->GetColumnFamilyHandle(cf), key);
859
+ Slice user_key = GetUserKey(cf, key);
860
+ return txn_->SingleDelete(db_->GetColumnFamilyHandle(cf), user_key);
839
861
  }
840
862
 
841
863
  Status MergeCF(uint32_t cf, const Slice& key, const Slice& val) override {
842
- return txn_->Merge(db_->GetColumnFamilyHandle(cf), key, val);
864
+ Slice user_key = GetUserKey(cf, key);
865
+ return txn_->Merge(db_->GetColumnFamilyHandle(cf), user_key, val);
843
866
  }
844
867
 
845
868
  // this is used for reconstructing prepared transactions upon
@@ -862,6 +885,21 @@ Status TransactionBaseImpl::RebuildFromWriteBatch(WriteBatch* src_batch) {
862
885
  Status MarkRollback(const Slice&) override {
863
886
  return Status::InvalidArgument();
864
887
  }
888
+ size_t GetTimestampSize(uint32_t cf_id) {
889
+ auto cfd = db_->versions_->GetColumnFamilySet()->GetColumnFamily(cf_id);
890
+ const Comparator* ucmp = cfd->user_comparator();
891
+ assert(ucmp);
892
+ return ucmp->timestamp_size();
893
+ }
894
+
895
+ Slice GetUserKey(uint32_t cf_id, const Slice& key) {
896
+ size_t ts_sz = GetTimestampSize(cf_id);
897
+ if (ts_sz == 0) {
898
+ return key;
899
+ }
900
+ assert(key.size() >= ts_sz);
901
+ return Slice(key.data(), key.size() - ts_sz);
902
+ }
865
903
  };
866
904
 
867
905
  IndexedWriteBatchBuilder copycat(this, dbimpl_);
@@ -95,6 +95,11 @@ class TransactionBaseImpl : public Transaction {
95
95
  exclusive, do_validate);
96
96
  }
97
97
 
98
+ Status GetEntityForUpdate(const ReadOptions& read_options,
99
+ ColumnFamilyHandle* column_family, const Slice& key,
100
+ PinnableWideColumns* columns, bool exclusive = true,
101
+ bool do_validate = true) override;
102
+
98
103
  using Transaction::MultiGet;
99
104
  std::vector<Status> MultiGet(
100
105
  const ReadOptions& _read_options,
@@ -7025,9 +7025,10 @@ TEST_P(TransactionTest, PutEntitySuccess) {
7025
7025
  }
7026
7026
 
7027
7027
  {
7028
- PinnableSlice value;
7029
- ASSERT_OK(txn->GetForUpdate(ReadOptions(), foo, &value));
7030
- ASSERT_EQ(value, foo_columns[0].value());
7028
+ PinnableWideColumns columns;
7029
+ ASSERT_OK(txn->GetEntityForUpdate(
7030
+ ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
7031
+ ASSERT_EQ(columns.columns(), foo_columns);
7031
7032
  }
7032
7033
 
7033
7034
  ASSERT_OK(txn->PutEntity(db->DefaultColumnFamily(), foo, foo_new_columns));
@@ -7042,9 +7043,10 @@ TEST_P(TransactionTest, PutEntitySuccess) {
7042
7043
  }
7043
7044
 
7044
7045
  {
7045
- PinnableSlice value;
7046
- ASSERT_OK(txn->GetForUpdate(ReadOptions(), foo, &value));
7047
- ASSERT_EQ(value, foo_new_columns[0].value());
7046
+ PinnableWideColumns columns;
7047
+ ASSERT_OK(txn->GetEntityForUpdate(
7048
+ ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
7049
+ ASSERT_EQ(columns.columns(), foo_new_columns);
7048
7050
  }
7049
7051
 
7050
7052
  ASSERT_OK(txn->Commit());
@@ -7227,6 +7229,67 @@ TEST_P(TransactionTest, PutEntityWriteConflict) {
7227
7229
  }
7228
7230
  }
7229
7231
 
7232
+ TEST_P(TransactionTest, PutEntityReadConflict) {
7233
+ const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
7234
+ if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
7235
+ ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
7236
+ return;
7237
+ }
7238
+
7239
+ constexpr char foo[] = "foo";
7240
+ const WideColumns foo_columns{
7241
+ {kDefaultWideColumnName, "bar"}, {"col1", "val1"}, {"col2", "val2"}};
7242
+
7243
+ ASSERT_OK(db->PutEntity(WriteOptions(), db->DefaultColumnFamily(), foo,
7244
+ foo_columns));
7245
+
7246
+ std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
7247
+ ASSERT_NE(txn, nullptr);
7248
+
7249
+ txn->SetSnapshot();
7250
+
7251
+ ReadOptions snapshot_read_options;
7252
+ snapshot_read_options.snapshot = txn->GetSnapshot();
7253
+
7254
+ {
7255
+ PinnableWideColumns columns;
7256
+ ASSERT_OK(txn->GetEntityForUpdate(
7257
+ snapshot_read_options, db->DefaultColumnFamily(), foo, &columns));
7258
+ ASSERT_EQ(columns.columns(), foo_columns);
7259
+ }
7260
+
7261
+ // This PutEntity outside of a transaction will conflict with the previous
7262
+ // write
7263
+ const WideColumns foo_conflict_columns{{kDefaultWideColumnName, "X"},
7264
+ {"conflicting", "write"}};
7265
+ ASSERT_TRUE(db->PutEntity(WriteOptions(), db->DefaultColumnFamily(), foo,
7266
+ foo_conflict_columns)
7267
+ .IsTimedOut());
7268
+
7269
+ {
7270
+ PinnableWideColumns columns;
7271
+ ASSERT_OK(
7272
+ db->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
7273
+ ASSERT_EQ(columns.columns(), foo_columns);
7274
+ }
7275
+
7276
+ {
7277
+ PinnableWideColumns columns;
7278
+ ASSERT_OK(txn->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo,
7279
+ &columns));
7280
+ ASSERT_EQ(columns.columns(), foo_columns);
7281
+ }
7282
+
7283
+ ASSERT_OK(txn->Commit());
7284
+
7285
+ {
7286
+ PinnableWideColumns columns;
7287
+ ASSERT_OK(
7288
+ db->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
7289
+ ASSERT_EQ(columns.columns(), foo_columns);
7290
+ }
7291
+ }
7292
+
7230
7293
  TEST_P(TransactionTest, EntityReadSanityChecks) {
7231
7294
  constexpr char foo[] = "foo";
7232
7295
  constexpr char bar[] = "bar";
@@ -7314,6 +7377,91 @@ TEST_P(TransactionTest, EntityReadSanityChecks) {
7314
7377
  ASSERT_TRUE(statuses[0].IsInvalidArgument());
7315
7378
  ASSERT_TRUE(statuses[1].IsInvalidArgument());
7316
7379
  }
7380
+
7381
+ {
7382
+ constexpr ColumnFamilyHandle* column_family = nullptr;
7383
+ PinnableWideColumns columns;
7384
+ ASSERT_TRUE(
7385
+ txn->GetEntityForUpdate(ReadOptions(), column_family, foo, &columns)
7386
+ .IsInvalidArgument());
7387
+ }
7388
+
7389
+ {
7390
+ constexpr PinnableWideColumns* columns = nullptr;
7391
+ ASSERT_TRUE(txn->GetEntityForUpdate(ReadOptions(),
7392
+ db->DefaultColumnFamily(), foo, columns)
7393
+ .IsInvalidArgument());
7394
+ }
7395
+
7396
+ {
7397
+ ReadOptions read_options;
7398
+ read_options.io_activity = Env::IOActivity::kGet;
7399
+
7400
+ PinnableWideColumns columns;
7401
+ ASSERT_TRUE(txn->GetEntityForUpdate(read_options, db->DefaultColumnFamily(),
7402
+ foo, &columns)
7403
+ .IsInvalidArgument());
7404
+ }
7405
+
7406
+ {
7407
+ txn->SetSnapshot();
7408
+
7409
+ ReadOptions read_options;
7410
+ read_options.snapshot = txn->GetSnapshot();
7411
+
7412
+ PinnableWideColumns columns;
7413
+ constexpr bool exclusive = true;
7414
+ constexpr bool do_validate = false;
7415
+
7416
+ ASSERT_TRUE(txn->GetEntityForUpdate(read_options, db->DefaultColumnFamily(),
7417
+ foo, &columns, exclusive, do_validate)
7418
+ .IsInvalidArgument());
7419
+ }
7420
+ }
7421
+
7422
+ TEST_P(TransactionTest, PutEntityRecovery) {
7423
+ const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
7424
+ if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
7425
+ ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
7426
+ return;
7427
+ }
7428
+
7429
+ constexpr char foo[] = "foo";
7430
+ const WideColumns foo_columns{
7431
+ {kDefaultWideColumnName, "bar"}, {"col1", "val1"}, {"col2", "val2"}};
7432
+
7433
+ constexpr char xid[] = "xid";
7434
+
7435
+ {
7436
+ WriteOptions write_options;
7437
+ write_options.sync = true;
7438
+ write_options.disableWAL = false;
7439
+
7440
+ std::unique_ptr<Transaction> txn(db->BeginTransaction(write_options));
7441
+ ASSERT_NE(txn, nullptr);
7442
+
7443
+ ASSERT_OK(txn->SetName(xid));
7444
+
7445
+ ASSERT_OK(txn->PutEntity(db->DefaultColumnFamily(), foo, foo_columns));
7446
+
7447
+ ASSERT_OK(txn->Prepare());
7448
+ }
7449
+
7450
+ ASSERT_OK(ReOpenNoDelete());
7451
+
7452
+ {
7453
+ std::unique_ptr<Transaction> txn(db->GetTransactionByName(xid));
7454
+ ASSERT_NE(txn, nullptr);
7455
+
7456
+ ASSERT_OK(txn->Commit());
7457
+ }
7458
+
7459
+ {
7460
+ PinnableWideColumns columns;
7461
+ ASSERT_OK(
7462
+ db->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
7463
+ ASSERT_EQ(columns.columns(), foo_columns);
7464
+ }
7317
7465
  }
7318
7466
 
7319
7467
  TEST_F(TransactionDBTest, CollapseKey) {
@@ -463,7 +463,7 @@ class TransactionTestBase : public ::testing::Test {
463
463
  }
464
464
  db_impl = static_cast_with_check<DBImpl>(db->GetRootDB());
465
465
  // Check that WAL is empty
466
- VectorLogPtr log_files;
466
+ VectorWalPtr log_files;
467
467
  ASSERT_OK(db_impl->GetSortedWalFiles(log_files));
468
468
  ASSERT_EQ(0, log_files.size());
469
469
 
@@ -288,12 +288,25 @@ TEST_P(WriteCommittedTxnWithTsTest, RecoverFromWal) {
288
288
 
289
289
  txn0.reset();
290
290
 
291
+ std::unique_ptr<Transaction> txn3(
292
+ NewTxn(WriteOptions(), TransactionOptions()));
293
+ assert(txn3);
294
+ ASSERT_OK(txn3->Put(handles_[1], "baz", "baz_value"));
295
+ ASSERT_OK(txn3->SetName("txn3"));
296
+ ASSERT_OK(txn3->Prepare());
297
+ txn3.reset();
298
+
291
299
  ASSERT_OK(ReOpenNoDelete(cf_descs, &handles_));
292
300
 
293
301
  {
302
+ Transaction* recovered_txn0 = db->GetTransactionByName("txn0");
303
+ ASSERT_OK(recovered_txn0->SetCommitTimestamp(23));
304
+ ASSERT_OK(recovered_txn0->Commit());
305
+ delete recovered_txn0;
294
306
  std::string value;
295
307
  Status s = GetFromDb(ReadOptions(), handles_[1], "foo", /*ts=*/23, &value);
296
- ASSERT_TRUE(s.IsNotFound());
308
+ ASSERT_OK(s);
309
+ ASSERT_EQ("foo_value", value);
297
310
 
298
311
  s = db->Get(ReadOptions(), handles_[0], "bar", &value);
299
312
  ASSERT_OK(s);
@@ -314,6 +327,9 @@ TEST_P(WriteCommittedTxnWithTsTest, RecoverFromWal) {
314
327
  s = GetFromDb(ReadOptions(), handles_[1], "key1", /*ts=*/24, &value);
315
328
  ASSERT_OK(s);
316
329
  ASSERT_EQ("value_3", value);
330
+
331
+ s = GetFromDb(ReadOptions(), handles_[1], "baz", /*ts=*/24, &value);
332
+ ASSERT_TRUE(s.IsNotFound());
317
333
  }
318
334
  }
319
335
 
@@ -717,6 +733,147 @@ TEST_P(WriteCommittedTxnWithTsTest, CheckKeysForConflicts) {
717
733
  SyncPoint::GetInstance()->ClearAllCallBacks();
718
734
  }
719
735
 
736
+ TEST_P(WriteCommittedTxnWithTsTest, GetEntityForUpdate) {
737
+ ASSERT_OK(ReOpenNoDelete());
738
+
739
+ ColumnFamilyOptions cf_options;
740
+ cf_options.comparator = test::BytewiseComparatorWithU64TsWrapper();
741
+
742
+ const std::string test_cf_name = "test_cf";
743
+
744
+ ColumnFamilyHandle* cfh = nullptr;
745
+ ASSERT_OK(db->CreateColumnFamily(cf_options, test_cf_name, &cfh));
746
+ std::unique_ptr<ColumnFamilyHandle> cfh_guard(cfh);
747
+
748
+ constexpr char foo[] = "foo";
749
+ constexpr char bar[] = "bar";
750
+ constexpr char baz[] = "baz";
751
+ constexpr char quux[] = "quux";
752
+
753
+ {
754
+ std::unique_ptr<Transaction> txn0(
755
+ NewTxn(WriteOptions(), TransactionOptions()));
756
+
757
+ {
758
+ std::unique_ptr<Transaction> txn1(
759
+ NewTxn(WriteOptions(), TransactionOptions()));
760
+ ASSERT_OK(txn1->Put(cfh, foo, bar));
761
+ ASSERT_OK(txn1->Put(cfh, baz, quux));
762
+ ASSERT_OK(txn1->SetCommitTimestamp(24));
763
+ ASSERT_OK(txn1->Commit());
764
+ }
765
+
766
+ ASSERT_OK(txn0->SetReadTimestampForValidation(23));
767
+
768
+ // Validation fails: timestamp from db(24) > validation timestamp(23)
769
+ PinnableWideColumns columns;
770
+ ASSERT_TRUE(
771
+ txn0->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns).IsBusy());
772
+
773
+ ASSERT_OK(txn0->Rollback());
774
+ }
775
+
776
+ {
777
+ std::unique_ptr<Transaction> txn2(
778
+ NewTxn(WriteOptions(), TransactionOptions()));
779
+
780
+ ASSERT_OK(txn2->SetReadTimestampForValidation(25));
781
+
782
+ // Validation successful: timestamp from db(24) < validation timestamp (25)
783
+ {
784
+ PinnableWideColumns columns;
785
+ ASSERT_OK(txn2->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns));
786
+ }
787
+
788
+ // Using a different read timestamp in ReadOptions while doing validation is
789
+ // not allowed
790
+ {
791
+ ReadOptions read_options;
792
+ std::string read_timestamp;
793
+ Slice diff_read_ts = EncodeU64Ts(24, &read_timestamp);
794
+ read_options.timestamp = &diff_read_ts;
795
+
796
+ PinnableWideColumns columns;
797
+ ASSERT_TRUE(txn2->GetEntityForUpdate(read_options, cfh, foo, &columns)
798
+ .IsInvalidArgument());
799
+
800
+ ASSERT_OK(txn2->SetCommitTimestamp(26));
801
+ ASSERT_OK(txn2->Commit());
802
+ }
803
+ }
804
+
805
+ // GetEntityForUpdate with validation timestamp set but no validation is not
806
+ // allowed
807
+ {
808
+ std::unique_ptr<Transaction> txn3(
809
+ NewTxn(WriteOptions(), TransactionOptions()));
810
+
811
+ ASSERT_OK(txn3->SetReadTimestampForValidation(27));
812
+
813
+ PinnableWideColumns columns;
814
+ ASSERT_TRUE(txn3->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns,
815
+ /*exclusive=*/true,
816
+ /*do_validate=*/false)
817
+ .IsInvalidArgument());
818
+
819
+ ASSERT_OK(txn3->Rollback());
820
+ }
821
+
822
+ // GetEntityForUpdate with validation but no validation timestamp is not
823
+ // allowed
824
+ {
825
+ std::unique_ptr<Transaction> txn4(
826
+ NewTxn(WriteOptions(), TransactionOptions()));
827
+
828
+ // ReadOptions.timestamp is not set
829
+ {
830
+ PinnableWideColumns columns;
831
+ ASSERT_TRUE(txn4->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns)
832
+ .IsInvalidArgument());
833
+ }
834
+
835
+ // ReadOptions.timestamp is set
836
+ {
837
+ ReadOptions read_options;
838
+ std::string read_timestamp;
839
+ Slice read_ts = EncodeU64Ts(27, &read_timestamp);
840
+ read_options.timestamp = &read_ts;
841
+
842
+ PinnableWideColumns columns;
843
+ ASSERT_TRUE(txn4->GetEntityForUpdate(read_options, cfh, foo, &columns)
844
+ .IsInvalidArgument());
845
+ }
846
+
847
+ ASSERT_OK(txn4->Rollback());
848
+ }
849
+
850
+ // Validation disabled
851
+ {
852
+ std::unique_ptr<Transaction> txn5(
853
+ NewTxn(WriteOptions(), TransactionOptions()));
854
+
855
+ // ReadOptions.timestamp is not set => success
856
+ {
857
+ PinnableWideColumns columns;
858
+ ASSERT_OK(txn5->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns,
859
+ /*exclusive=*/true,
860
+ /*do_validate=*/false));
861
+ }
862
+
863
+ // ReadOptions.timestamp explicitly set to max timestamp => success
864
+ {
865
+ ReadOptions read_options;
866
+ Slice max_ts = MaxU64Ts();
867
+ read_options.timestamp = &max_ts;
868
+
869
+ PinnableWideColumns columns;
870
+ ASSERT_OK(txn5->GetEntityForUpdate(read_options, cfh, baz, &columns,
871
+ /*exclusive=*/true,
872
+ /*do_validate=*/false));
873
+ }
874
+ }
875
+ }
876
+
720
877
  } // namespace ROCKSDB_NAMESPACE
721
878
 
722
879
  int main(int argc, char** argv) {
@@ -724,4 +881,3 @@ int main(int argc, char** argv) {
724
881
  ::testing::InitGoogleTest(&argc, argv);
725
882
  return RUN_ALL_TESTS();
726
883
  }
727
-
@@ -154,8 +154,9 @@ Status WritePreparedTxn::PrepareInternal() {
154
154
  const bool DISABLE_MEMTABLE = true;
155
155
  uint64_t seq_used = kMaxSequenceNumber;
156
156
  s = db_impl_->WriteImpl(write_options, GetWriteBatch()->GetWriteBatch(),
157
- /*callback*/ nullptr, &log_number_, /*log ref*/ 0,
158
- !DISABLE_MEMTABLE, &seq_used, prepare_batch_cnt_,
157
+ /*callback*/ nullptr, /*user_write_cb=*/nullptr,
158
+ &log_number_, /*log ref*/ 0, !DISABLE_MEMTABLE,
159
+ &seq_used, prepare_batch_cnt_,
159
160
  &add_prepared_callback);
160
161
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
161
162
  auto prepare_seq = seq_used;
@@ -247,9 +248,10 @@ Status WritePreparedTxn::CommitInternal() {
247
248
  // TransactionOptions::use_only_the_last_commit_time_batch_for_recovery to
248
249
  // true. See the comments about GetCommitTimeWriteBatch() in
249
250
  // include/rocksdb/utilities/transaction.h.
250
- s = db_impl_->WriteImpl(write_options_, working_batch, nullptr, nullptr,
251
- zero_log_number, disable_memtable, &seq_used,
252
- batch_cnt, pre_release_callback);
251
+ s = db_impl_->WriteImpl(write_options_, working_batch, nullptr,
252
+ /*user_write_cb=*/nullptr, nullptr, zero_log_number,
253
+ disable_memtable, &seq_used, batch_cnt,
254
+ pre_release_callback);
253
255
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
254
256
  const SequenceNumber commit_batch_seq = seq_used;
255
257
  if (LIKELY(do_one_write || !s.ok())) {
@@ -284,8 +286,9 @@ Status WritePreparedTxn::CommitInternal() {
284
286
  const bool DISABLE_MEMTABLE = true;
285
287
  const size_t ONE_BATCH = 1;
286
288
  const uint64_t NO_REF_LOG = 0;
287
- s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr, nullptr,
288
- NO_REF_LOG, DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
289
+ s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr,
290
+ /*user_write_cb=*/nullptr, nullptr, NO_REF_LOG,
291
+ DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
289
292
  &update_commit_map_with_aux_batch);
290
293
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
291
294
  return s;
@@ -450,8 +453,9 @@ Status WritePreparedTxn::RollbackInternal() {
450
453
  // DB in one shot. min_uncommitted still works since it requires capturing
451
454
  // data that is written to DB but not yet committed, while
452
455
  // the rollback batch commits with PreReleaseCallback.
453
- s = db_impl_->WriteImpl(write_options_, &rollback_batch, nullptr, nullptr,
454
- NO_REF_LOG, !DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
456
+ s = db_impl_->WriteImpl(write_options_, &rollback_batch, nullptr,
457
+ /*user_write_cb=*/nullptr, nullptr, NO_REF_LOG,
458
+ !DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
455
459
  pre_release_callback);
456
460
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
457
461
  if (!s.ok()) {
@@ -476,8 +480,9 @@ Status WritePreparedTxn::RollbackInternal() {
476
480
  // In the absence of Prepare markers, use Noop as a batch separator
477
481
  s = WriteBatchInternal::InsertNoop(&empty_batch);
478
482
  assert(s.ok());
479
- s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr, nullptr,
480
- NO_REF_LOG, DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
483
+ s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr,
484
+ /*user_write_cb=*/nullptr, nullptr, NO_REF_LOG,
485
+ DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
481
486
  &update_commit_map_with_prepare);
482
487
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
483
488
  ROCKS_LOG_DETAILS(db_impl_->immutable_db_options().info_log,
@@ -213,8 +213,8 @@ Status WritePreparedTxnDB::WriteInternal(const WriteOptions& write_options_orig,
213
213
  } else {
214
214
  pre_release_callback = &add_prepared_callback;
215
215
  }
216
- s = db_impl_->WriteImpl(write_options, batch, nullptr, nullptr, no_log_ref,
217
- !DISABLE_MEMTABLE, &seq_used, batch_cnt,
216
+ s = db_impl_->WriteImpl(write_options, batch, nullptr, nullptr, nullptr,
217
+ no_log_ref, !DISABLE_MEMTABLE, &seq_used, batch_cnt,
218
218
  pre_release_callback);
219
219
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
220
220
  uint64_t prepare_seq = seq_used;
@@ -240,8 +240,8 @@ Status WritePreparedTxnDB::WriteInternal(const WriteOptions& write_options_orig,
240
240
  write_options.sync = false;
241
241
  const size_t ONE_BATCH = 1; // Just to inc the seq
242
242
  s = db_impl_->WriteImpl(write_options, &empty_batch, nullptr, nullptr,
243
- no_log_ref, DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
244
- &update_commit_map_with_prepare);
243
+ nullptr, no_log_ref, DISABLE_MEMTABLE, &seq_used,
244
+ ONE_BATCH, &update_commit_map_with_prepare);
245
245
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
246
246
  // Note: RemovePrepared is called from within PreReleaseCallback
247
247
  return s;
@@ -378,7 +378,8 @@ Status WriteUnpreparedTxn::FlushWriteBatchToDBInternal(bool prepared) {
378
378
  // WriteImpl should not overwrite that value, so set log_used to nullptr if
379
379
  // log_number_ is already set.
380
380
  s = db_impl_->WriteImpl(write_options, GetWriteBatch()->GetWriteBatch(),
381
- /*callback*/ nullptr, &last_log_number_,
381
+ /*callback*/ nullptr, /*user_write_cb=*/nullptr,
382
+ &last_log_number_,
382
383
  /*log ref*/ 0, !DISABLE_MEMTABLE, &seq_used,
383
384
  prepare_batch_cnt_, &add_prepared_callback);
384
385
  if (log_number_ == 0) {
@@ -595,7 +596,7 @@ Status WriteUnpreparedTxn::CommitInternal() {
595
596
  const uint64_t zero_log_number = 0ull;
596
597
  size_t batch_cnt = UNLIKELY(commit_batch_cnt) ? commit_batch_cnt : 1;
597
598
  s = db_impl_->WriteImpl(write_options_, working_batch, nullptr, nullptr,
598
- zero_log_number, disable_memtable, &seq_used,
599
+ nullptr, zero_log_number, disable_memtable, &seq_used,
599
600
  batch_cnt, pre_release_callback);
600
601
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
601
602
  const SequenceNumber commit_batch_seq = seq_used;
@@ -639,8 +640,8 @@ Status WriteUnpreparedTxn::CommitInternal() {
639
640
  const size_t ONE_BATCH = 1;
640
641
  const uint64_t NO_REF_LOG = 0;
641
642
  s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr, nullptr,
642
- NO_REF_LOG, DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
643
- &update_commit_map_with_commit_batch);
643
+ nullptr, NO_REF_LOG, DISABLE_MEMTABLE, &seq_used,
644
+ ONE_BATCH, &update_commit_map_with_commit_batch);
644
645
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
645
646
  // Note RemovePrepared should be called after WriteImpl that publishsed the
646
647
  // seq. Otherwise SmallestUnCommittedSeq optimization breaks.
@@ -771,8 +772,8 @@ Status WriteUnpreparedTxn::RollbackInternal() {
771
772
  // data that is written to DB but not yet committed, while the rollback
772
773
  // batch commits with PreReleaseCallback.
773
774
  s = db_impl_->WriteImpl(write_options_, rollback_batch.GetWriteBatch(),
774
- nullptr, nullptr, NO_REF_LOG, !DISABLE_MEMTABLE,
775
- &seq_used, rollback_batch_cnt,
775
+ nullptr, nullptr, nullptr, NO_REF_LOG,
776
+ !DISABLE_MEMTABLE, &seq_used, rollback_batch_cnt,
776
777
  do_one_write ? &update_commit_map : nullptr);
777
778
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
778
779
  if (!s.ok()) {
@@ -807,8 +808,8 @@ Status WriteUnpreparedTxn::RollbackInternal() {
807
808
  s = WriteBatchInternal::InsertNoop(&empty_batch);
808
809
  assert(s.ok());
809
810
  s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr, nullptr,
810
- NO_REF_LOG, DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
811
- &update_commit_map_with_rollback_batch);
811
+ nullptr, NO_REF_LOG, DISABLE_MEMTABLE, &seq_used,
812
+ ONE_BATCH, &update_commit_map_with_rollback_batch);
812
813
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
813
814
  // Mark the txn as rolled back
814
815
  if (s.ok()) {
@@ -180,7 +180,8 @@ Status WriteUnpreparedTxnDB::RollbackRecoveredTransaction(
180
180
  const size_t kOneBatch = 1;
181
181
  uint64_t seq_used = kMaxSequenceNumber;
182
182
  s = db_impl_->WriteImpl(w_options, &rollback_batch, nullptr, nullptr,
183
- kNoLogRef, !kDisableMemtable, &seq_used, kOneBatch);
183
+ nullptr, kNoLogRef, !kDisableMemtable, &seq_used,
184
+ kOneBatch);
184
185
  if (!s.ok()) {
185
186
  return s;
186
187
  }