@nxtedition/rocksdb 10.1.4 → 10.1.6

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 (266) hide show
  1. package/binding.cc +16 -12
  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/index.js +1 -2
  217. package/package.json +1 -1
  218. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  219. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  220. package/util.h +25 -2
  221. package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
  222. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  223. package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
  224. package/.tap/test-results/test/batch-test.js.tap +0 -12
  225. package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
  226. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
  227. package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
  228. package/.tap/test-results/test/column-test.js.tap +0 -55
  229. package/.tap/test-results/test/common.js.tap +0 -0
  230. package/.tap/test-results/test/compression-test.js.tap +0 -30
  231. package/.tap/test-results/test/db-identity.js.tap +0 -12
  232. package/.tap/test-results/test/electron.js.tap +0 -0
  233. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
  234. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  235. package/.tap/test-results/test/gc.js.tap +0 -0
  236. package/.tap/test-results/test/getproperty-test.js.tap +0 -29
  237. package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
  238. package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
  239. package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
  240. package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
  241. package/.tap/test-results/test/iterator-test.js.tap +0 -6
  242. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  243. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  244. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  245. package/.tap/test-results/test/lock-test.js.tap +0 -18
  246. package/.tap/test-results/test/lock.js.tap +0 -0
  247. package/.tap/test-results/test/make.js.tap +0 -0
  248. package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
  249. package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
  250. package/.tap/test-results/test/mkdir-test.js.tap +0 -15
  251. package/.tap/test-results/test/segfault-test.js.tap +0 -76
  252. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  253. package/deps/rocksdb/rocksdb/README.md +0 -29
  254. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  255. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  256. package/deps/rocksdb/rocksdb/port/README +0 -10
  257. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  258. package/tmp/000099.sst +0 -0
  259. package/tmp/000102.sst +0 -0
  260. package/tmp/000103.log +0 -0
  261. package/tmp/CURRENT +0 -1
  262. package/tmp/IDENTITY +0 -1
  263. package/tmp/LOCK +0 -0
  264. package/tmp/MANIFEST-000104 +0 -0
  265. package/tmp/OPTIONS-000098 +0 -207
  266. package/tmp/OPTIONS-000106 +0 -207
@@ -0,0 +1,144 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
7
+ #include "utilities/table_properties_collectors/compact_for_tiering_collector.h"
8
+
9
+ #include <sstream>
10
+
11
+ #include "db/seqno_to_time_mapping.h"
12
+ #include "rocksdb/status.h"
13
+ #include "rocksdb/types.h"
14
+ #include "rocksdb/utilities/customizable_util.h"
15
+ #include "rocksdb/utilities/object_registry.h"
16
+ #include "rocksdb/utilities/options_type.h"
17
+ #include "rocksdb/utilities/table_properties_collectors.h"
18
+ #include "util/string_util.h"
19
+
20
+ namespace ROCKSDB_NAMESPACE {
21
+ const std::string
22
+ CompactForTieringCollector::kNumEligibleLastLevelEntriesPropertyName =
23
+ "rocksdb.eligible.last.level.entries";
24
+
25
+ CompactForTieringCollector::CompactForTieringCollector(
26
+ SequenceNumber last_level_inclusive_max_seqno_threshold,
27
+ double compaction_trigger_ratio)
28
+ : last_level_inclusive_max_seqno_threshold_(
29
+ last_level_inclusive_max_seqno_threshold),
30
+ compaction_trigger_ratio_(compaction_trigger_ratio) {
31
+ assert(last_level_inclusive_max_seqno_threshold_ != kMaxSequenceNumber);
32
+ }
33
+
34
+ Status CompactForTieringCollector::AddUserKey(const Slice& /*key*/,
35
+ const Slice& value,
36
+ EntryType type,
37
+ SequenceNumber seq,
38
+ uint64_t /*file_size*/) {
39
+ SequenceNumber seq_for_check = seq;
40
+ if (type == kEntryTimedPut) {
41
+ seq_for_check = ParsePackedValueForSeqno(value);
42
+ }
43
+ if (seq_for_check < last_level_inclusive_max_seqno_threshold_) {
44
+ last_level_eligible_entries_counter_++;
45
+ }
46
+ total_entries_counter_ += 1;
47
+ return Status::OK();
48
+ }
49
+
50
+ Status CompactForTieringCollector::Finish(UserCollectedProperties* properties) {
51
+ assert(!finish_called_);
52
+ assert(compaction_trigger_ratio_ > 0);
53
+ if (last_level_eligible_entries_counter_ >=
54
+ compaction_trigger_ratio_ * total_entries_counter_) {
55
+ assert(compaction_trigger_ratio_ <= 1);
56
+ need_compaction_ = true;
57
+ }
58
+ if (last_level_eligible_entries_counter_ > 0) {
59
+ *properties = UserCollectedProperties{
60
+ {kNumEligibleLastLevelEntriesPropertyName,
61
+ std::to_string(last_level_eligible_entries_counter_)},
62
+ };
63
+ }
64
+ finish_called_ = true;
65
+ return Status::OK();
66
+ }
67
+
68
+ UserCollectedProperties CompactForTieringCollector::GetReadableProperties()
69
+ const {
70
+ return UserCollectedProperties{
71
+ {kNumEligibleLastLevelEntriesPropertyName,
72
+ std::to_string(last_level_eligible_entries_counter_)},
73
+ };
74
+ }
75
+
76
+ bool CompactForTieringCollector::NeedCompact() const {
77
+ return need_compaction_;
78
+ }
79
+
80
+ void CompactForTieringCollector::Reset() {
81
+ last_level_eligible_entries_counter_ = 0;
82
+ total_entries_counter_ = 0;
83
+ finish_called_ = false;
84
+ need_compaction_ = false;
85
+ }
86
+
87
+ TablePropertiesCollector*
88
+ CompactForTieringCollectorFactory::CreateTablePropertiesCollector(
89
+ TablePropertiesCollectorFactory::Context context) {
90
+ double compaction_trigger_ratio = GetCompactionTriggerRatio();
91
+ if (compaction_trigger_ratio <= 0 ||
92
+ context.level_at_creation == context.num_levels - 1 ||
93
+ context.last_level_inclusive_max_seqno_threshold == kMaxSequenceNumber) {
94
+ return nullptr;
95
+ }
96
+ return new CompactForTieringCollector(
97
+ context.last_level_inclusive_max_seqno_threshold,
98
+ compaction_trigger_ratio);
99
+ }
100
+
101
+ static std::unordered_map<std::string, OptionTypeInfo>
102
+ on_compact_for_tiering_type_info = {
103
+ {"compaction_trigger_ratio",
104
+ {0, OptionType::kUnknown, OptionVerificationType::kNormal,
105
+ OptionTypeFlags::kCompareNever | OptionTypeFlags::kMutable,
106
+ [](const ConfigOptions&, const std::string&, const std::string& value,
107
+ void* addr) {
108
+ auto* factory =
109
+ static_cast<CompactForTieringCollectorFactory*>(addr);
110
+ factory->SetCompactionTriggerRatio(ParseDouble(value));
111
+ return Status::OK();
112
+ },
113
+ [](const ConfigOptions&, const std::string&, const void* addr,
114
+ std::string* value) {
115
+ const auto* factory =
116
+ static_cast<const CompactForTieringCollectorFactory*>(addr);
117
+ *value = std::to_string(factory->GetCompactionTriggerRatio());
118
+ return Status::OK();
119
+ },
120
+ nullptr}},
121
+
122
+ };
123
+
124
+ CompactForTieringCollectorFactory::CompactForTieringCollectorFactory(
125
+ double compaction_trigger_ratio)
126
+ : compaction_trigger_ratio_(compaction_trigger_ratio) {
127
+ RegisterOptions("", this, &on_compact_for_tiering_type_info);
128
+ }
129
+
130
+ std::string CompactForTieringCollectorFactory::ToString() const {
131
+ std::ostringstream cfg;
132
+ cfg << Name()
133
+ << ", compaction trigger ratio:" << compaction_trigger_ratio_.load()
134
+ << std::endl;
135
+ return cfg.str();
136
+ }
137
+
138
+ std::shared_ptr<CompactForTieringCollectorFactory>
139
+ NewCompactForTieringCollectorFactory(double compaction_trigger_ratio) {
140
+ return std::make_shared<CompactForTieringCollectorFactory>(
141
+ compaction_trigger_ratio);
142
+ }
143
+
144
+ } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,45 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
7
+ #pragma once
8
+
9
+ #include "rocksdb/utilities/table_properties_collectors.h"
10
+
11
+ namespace ROCKSDB_NAMESPACE {
12
+
13
+ // A user property collector that marks a SST file as need-compaction when for
14
+ // the tiering use case. See documentation for
15
+ // `CompactForTieringCollectorFactory`.
16
+ class CompactForTieringCollector : public TablePropertiesCollector {
17
+ public:
18
+ static const std::string kNumEligibleLastLevelEntriesPropertyName;
19
+
20
+ CompactForTieringCollector(
21
+ SequenceNumber last_level_inclusive_max_seqno_threshold_,
22
+ double compaction_trigger_ratio);
23
+
24
+ Status AddUserKey(const Slice& key, const Slice& value, EntryType type,
25
+ SequenceNumber seq, uint64_t file_size) override;
26
+
27
+ Status Finish(UserCollectedProperties* properties) override;
28
+
29
+ UserCollectedProperties GetReadableProperties() const override;
30
+
31
+ const char* Name() const override { return "CompactForTieringCollector"; }
32
+
33
+ bool NeedCompact() const override;
34
+
35
+ private:
36
+ void Reset();
37
+
38
+ SequenceNumber last_level_inclusive_max_seqno_threshold_;
39
+ double compaction_trigger_ratio_;
40
+ size_t last_level_eligible_entries_counter_ = 0;
41
+ size_t total_entries_counter_ = 0;
42
+ bool finish_called_ = false;
43
+ bool need_compaction_ = false;
44
+ };
45
+ } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,139 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
7
+ #include "utilities/table_properties_collectors/compact_for_tiering_collector.h"
8
+
9
+ #include <algorithm>
10
+ #include <cmath>
11
+ #include <cstdio>
12
+ #include <iostream>
13
+ #include <vector>
14
+
15
+ #include "db/seqno_to_time_mapping.h"
16
+ #include "port/stack_trace.h"
17
+ #include "rocksdb/table.h"
18
+ #include "rocksdb/table_properties.h"
19
+ #include "rocksdb/utilities/table_properties_collectors.h"
20
+ #include "test_util/testharness.h"
21
+ #include "util/random.h"
22
+
23
+ namespace ROCKSDB_NAMESPACE {
24
+
25
+ TEST(CompactForTieringCollector, NotEnabled) {
26
+ TablePropertiesCollectorFactory::Context context;
27
+ context.column_family_id = 1;
28
+ context.level_at_creation = 1;
29
+ context.num_levels = 6;
30
+ context.last_level_inclusive_max_seqno_threshold = 50;
31
+
32
+ // Set compaction trigger ratio to 0 to disable it. No collector created.
33
+ auto factory = NewCompactForTieringCollectorFactory(0);
34
+ std::unique_ptr<TablePropertiesCollector> collector(
35
+ factory->CreateTablePropertiesCollector(context));
36
+ ASSERT_EQ(nullptr, collector);
37
+ }
38
+
39
+ TEST(CompactForTieringCollector, TieringDisabled) {
40
+ TablePropertiesCollectorFactory::Context context;
41
+ context.column_family_id = 1;
42
+ context.level_at_creation = 1;
43
+ context.num_levels = 6;
44
+ context.last_level_inclusive_max_seqno_threshold = kMaxSequenceNumber;
45
+
46
+ // Tiering is disabled on the column family. No collector created.
47
+ {
48
+ for (double compaction_trigger_ratio : {0.0, 0.1, 1.0, 1.5}) {
49
+ auto factory =
50
+ NewCompactForTieringCollectorFactory(compaction_trigger_ratio);
51
+ std::unique_ptr<TablePropertiesCollector> collector(
52
+ factory->CreateTablePropertiesCollector(context));
53
+ ASSERT_EQ(nullptr, collector);
54
+ }
55
+ }
56
+ }
57
+
58
+ TEST(CompactForTieringCollector, LastLevelFile) {
59
+ TablePropertiesCollectorFactory::Context context;
60
+ context.column_family_id = 1;
61
+ context.level_at_creation = 5;
62
+ context.num_levels = 6;
63
+ context.last_level_inclusive_max_seqno_threshold = 50;
64
+
65
+ // No collector created for a file that is already on the last level.
66
+ {
67
+ for (double compaction_trigger_ratio : {0.0, 0.1, 1.0, 1.5}) {
68
+ auto factory =
69
+ NewCompactForTieringCollectorFactory(compaction_trigger_ratio);
70
+ std::unique_ptr<TablePropertiesCollector> collector(
71
+ factory->CreateTablePropertiesCollector(context));
72
+ ASSERT_EQ(nullptr, collector);
73
+ }
74
+ }
75
+ }
76
+
77
+ TEST(CompactForTieringCollector, CollectorEnabled) {
78
+ TablePropertiesCollectorFactory::Context context;
79
+ context.column_family_id = 1;
80
+ context.level_at_creation = 1;
81
+ context.num_levels = 6;
82
+ context.last_level_inclusive_max_seqno_threshold = 50;
83
+ const size_t kTotalEntries = 100;
84
+
85
+ {
86
+ for (double compaction_trigger_ratio : {0.1, 0.33333333, 0.5, 1.0, 1.5}) {
87
+ auto factory =
88
+ NewCompactForTieringCollectorFactory(compaction_trigger_ratio);
89
+ std::unique_ptr<TablePropertiesCollector> collector(
90
+ factory->CreateTablePropertiesCollector(context));
91
+ for (size_t i = 0; i < kTotalEntries; i++) {
92
+ ASSERT_OK(collector->AddUserKey("hello", "rocksdb", kEntryPut, i, 0));
93
+ ASSERT_FALSE(collector->NeedCompact());
94
+ }
95
+ UserCollectedProperties user_properties;
96
+ ASSERT_OK(collector->Finish(&user_properties));
97
+ ASSERT_EQ(user_properties[CompactForTieringCollector::
98
+ kNumEligibleLastLevelEntriesPropertyName],
99
+ std::to_string(50));
100
+ if (compaction_trigger_ratio > 0.5) {
101
+ ASSERT_FALSE(collector->NeedCompact());
102
+ } else {
103
+ ASSERT_TRUE(collector->NeedCompact());
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ TEST(CompactForTieringCollector, TimedPutEntries) {
110
+ TablePropertiesCollectorFactory::Context context;
111
+ context.column_family_id = 1;
112
+ context.level_at_creation = 1;
113
+ context.num_levels = 6;
114
+ context.last_level_inclusive_max_seqno_threshold = 50;
115
+ const size_t kTotalEntries = 100;
116
+
117
+ auto factory = NewCompactForTieringCollectorFactory(0.1);
118
+ std::unique_ptr<TablePropertiesCollector> collector(
119
+ factory->CreateTablePropertiesCollector(context));
120
+ for (size_t i = 0; i < kTotalEntries; i++) {
121
+ std::string value;
122
+ PackValueAndSeqno("rocksdb", i, &value);
123
+ ASSERT_OK(collector->AddUserKey("hello", value, kEntryTimedPut, 0, 0));
124
+ ASSERT_FALSE(collector->NeedCompact());
125
+ }
126
+ UserCollectedProperties user_properties;
127
+ ASSERT_OK(collector->Finish(&user_properties));
128
+ ASSERT_EQ(user_properties[CompactForTieringCollector::
129
+ kNumEligibleLastLevelEntriesPropertyName],
130
+ std::to_string(50));
131
+ ASSERT_TRUE(collector->NeedCompact());
132
+ }
133
+ } // namespace ROCKSDB_NAMESPACE
134
+
135
+ int main(int argc, char** argv) {
136
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
137
+ ::testing::InitGoogleTest(&argc, argv);
138
+ return RUN_ALL_TESTS();
139
+ }
@@ -188,6 +188,7 @@ NewCompactOnDeletionCollectorFactory(size_t sliding_window_size,
188
188
  new CompactOnDeletionCollectorFactory(sliding_window_size,
189
189
  deletion_trigger, deletion_ratio));
190
190
  }
191
+
191
192
  namespace {
192
193
  static int RegisterTablePropertiesCollectorFactories(
193
194
  ObjectLibrary& library, const std::string& /*arg*/) {
@@ -202,6 +203,17 @@ static int RegisterTablePropertiesCollectorFactories(
202
203
  guard->reset(new CompactOnDeletionCollectorFactory(0, 0, 0));
203
204
  return guard->get();
204
205
  });
206
+ library.AddFactory<TablePropertiesCollectorFactory>(
207
+ CompactForTieringCollectorFactory::kClassName(),
208
+ [](const std::string& /*uri*/,
209
+ std::unique_ptr<TablePropertiesCollectorFactory>* guard,
210
+ std::string* /* errmsg */) {
211
+ // By default, create a `CompactForTieringCollectorFactory` that is
212
+ // disabled. Users will need to call corresponding setters to enable
213
+ // the factory.
214
+ guard->reset(new CompactForTieringCollectorFactory(0));
215
+ return guard->get();
216
+ });
205
217
  return 1;
206
218
  }
207
219
  } // namespace
@@ -14,6 +14,7 @@
14
14
  #include <cstdio>
15
15
  #include <vector>
16
16
 
17
+ #include "db/dbformat.h"
17
18
  #include "port/stack_trace.h"
18
19
  #include "rocksdb/table.h"
19
20
  #include "rocksdb/table_properties.h"
@@ -27,6 +28,7 @@ TEST(CompactOnDeletionCollector, DeletionRatio) {
27
28
  TablePropertiesCollectorFactory::Context context;
28
29
  context.column_family_id =
29
30
  TablePropertiesCollectorFactory::Context::kUnknownColumnFamily;
31
+ context.last_level_inclusive_max_seqno_threshold = kMaxSequenceNumber;
30
32
  const size_t kTotalEntries = 100;
31
33
 
32
34
  {
@@ -86,6 +88,7 @@ TEST(CompactOnDeletionCollector, SlidingWindow) {
86
88
  TablePropertiesCollectorFactory::Context context;
87
89
  context.column_family_id =
88
90
  TablePropertiesCollectorFactory::Context::kUnknownColumnFamily;
91
+ context.last_level_inclusive_max_seqno_threshold = kMaxSequenceNumber;
89
92
 
90
93
  std::vector<int> window_sizes;
91
94
  std::vector<int> deletion_triggers;
@@ -1719,9 +1719,10 @@ TEST_P(OptimisticTransactionTest, PutEntitySuccess) {
1719
1719
  }
1720
1720
 
1721
1721
  {
1722
- PinnableSlice value;
1723
- ASSERT_OK(txn->GetForUpdate(ReadOptions(), foo, &value));
1724
- ASSERT_EQ(value, foo_columns[0].value());
1722
+ PinnableWideColumns columns;
1723
+ ASSERT_OK(txn->GetEntityForUpdate(
1724
+ ReadOptions(), txn_db->DefaultColumnFamily(), foo, &columns));
1725
+ ASSERT_EQ(columns.columns(), foo_columns);
1725
1726
  }
1726
1727
 
1727
1728
  ASSERT_OK(
@@ -1737,9 +1738,10 @@ TEST_P(OptimisticTransactionTest, PutEntitySuccess) {
1737
1738
  }
1738
1739
 
1739
1740
  {
1740
- PinnableSlice value;
1741
- ASSERT_OK(txn->GetForUpdate(ReadOptions(), foo, &value));
1742
- ASSERT_EQ(value, foo_new_columns[0].value());
1741
+ PinnableWideColumns columns;
1742
+ ASSERT_OK(txn->GetEntityForUpdate(
1743
+ ReadOptions(), txn_db->DefaultColumnFamily(), foo, &columns));
1744
+ ASSERT_EQ(columns.columns(), foo_new_columns);
1743
1745
  }
1744
1746
 
1745
1747
  ASSERT_OK(txn->Commit());
@@ -2034,6 +2036,60 @@ TEST_P(OptimisticTransactionTest, PutEntityWriteConflictTxnTxn) {
2034
2036
  }
2035
2037
  }
2036
2038
 
2039
+ TEST_P(OptimisticTransactionTest, PutEntityReadConflict) {
2040
+ constexpr char foo[] = "foo";
2041
+ const WideColumns foo_columns{
2042
+ {kDefaultWideColumnName, "bar"}, {"col1", "val1"}, {"col2", "val2"}};
2043
+
2044
+ ASSERT_OK(txn_db->PutEntity(WriteOptions(), txn_db->DefaultColumnFamily(),
2045
+ foo, foo_columns));
2046
+
2047
+ std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
2048
+ ASSERT_NE(txn, nullptr);
2049
+
2050
+ txn->SetSnapshot();
2051
+
2052
+ ReadOptions snapshot_read_options;
2053
+ snapshot_read_options.snapshot = txn->GetSnapshot();
2054
+
2055
+ {
2056
+ PinnableWideColumns columns;
2057
+ ASSERT_OK(txn->GetEntityForUpdate(
2058
+ snapshot_read_options, txn_db->DefaultColumnFamily(), foo, &columns));
2059
+ ASSERT_EQ(columns.columns(), foo_columns);
2060
+ }
2061
+
2062
+ // This PutEntity outside of a transaction will conflict with the previous
2063
+ // write
2064
+ const WideColumns foo_conflict_columns{{kDefaultWideColumnName, "X"},
2065
+ {"conflicting", "write"}};
2066
+ ASSERT_OK(txn_db->PutEntity(WriteOptions(), txn_db->DefaultColumnFamily(),
2067
+ foo, foo_conflict_columns));
2068
+
2069
+ {
2070
+ PinnableWideColumns columns;
2071
+ ASSERT_OK(txn_db->GetEntity(ReadOptions(), txn_db->DefaultColumnFamily(),
2072
+ foo, &columns));
2073
+ ASSERT_EQ(columns.columns(), foo_conflict_columns);
2074
+ }
2075
+
2076
+ {
2077
+ PinnableWideColumns columns;
2078
+ ASSERT_OK(txn->GetEntity(ReadOptions(), txn_db->DefaultColumnFamily(), foo,
2079
+ &columns));
2080
+ ASSERT_EQ(columns.columns(), foo_conflict_columns);
2081
+ }
2082
+
2083
+ ASSERT_TRUE(txn->Commit().IsBusy()); // Txn should not commit
2084
+
2085
+ {
2086
+ PinnableWideColumns columns;
2087
+ ASSERT_OK(txn_db->GetEntity(ReadOptions(), txn_db->DefaultColumnFamily(),
2088
+ foo, &columns));
2089
+ ASSERT_EQ(columns.columns(), foo_conflict_columns);
2090
+ }
2091
+ }
2092
+
2037
2093
  TEST_P(OptimisticTransactionTest, EntityReadSanityChecks) {
2038
2094
  constexpr char foo[] = "foo";
2039
2095
  constexpr char bar[] = "bar";
@@ -2121,6 +2177,49 @@ TEST_P(OptimisticTransactionTest, EntityReadSanityChecks) {
2121
2177
  ASSERT_TRUE(statuses[0].IsInvalidArgument());
2122
2178
  ASSERT_TRUE(statuses[1].IsInvalidArgument());
2123
2179
  }
2180
+
2181
+ {
2182
+ constexpr ColumnFamilyHandle* column_family = nullptr;
2183
+ PinnableWideColumns columns;
2184
+ ASSERT_TRUE(
2185
+ txn->GetEntityForUpdate(ReadOptions(), column_family, foo, &columns)
2186
+ .IsInvalidArgument());
2187
+ }
2188
+
2189
+ {
2190
+ constexpr PinnableWideColumns* columns = nullptr;
2191
+ ASSERT_TRUE(txn->GetEntityForUpdate(ReadOptions(),
2192
+ txn_db->DefaultColumnFamily(), foo,
2193
+ columns)
2194
+ .IsInvalidArgument());
2195
+ }
2196
+
2197
+ {
2198
+ ReadOptions read_options;
2199
+ read_options.io_activity = Env::IOActivity::kGet;
2200
+
2201
+ PinnableWideColumns columns;
2202
+ ASSERT_TRUE(txn->GetEntityForUpdate(read_options,
2203
+ txn_db->DefaultColumnFamily(), foo,
2204
+ &columns)
2205
+ .IsInvalidArgument());
2206
+ }
2207
+
2208
+ {
2209
+ txn->SetSnapshot();
2210
+
2211
+ ReadOptions read_options;
2212
+ read_options.snapshot = txn->GetSnapshot();
2213
+
2214
+ PinnableWideColumns columns;
2215
+ constexpr bool exclusive = true;
2216
+ constexpr bool do_validate = false;
2217
+
2218
+ ASSERT_TRUE(txn->GetEntityForUpdate(read_options,
2219
+ txn_db->DefaultColumnFamily(), foo,
2220
+ &columns, exclusive, do_validate)
2221
+ .IsInvalidArgument());
2222
+ }
2124
2223
  }
2125
2224
 
2126
2225
  INSTANTIATE_TEST_CASE_P(
@@ -217,6 +217,60 @@ inline Status WriteCommittedTxn::GetForUpdateImpl(
217
217
  value, exclusive, do_validate);
218
218
  }
219
219
 
220
+ Status WriteCommittedTxn::GetEntityForUpdate(const ReadOptions& read_options,
221
+ ColumnFamilyHandle* column_family,
222
+ const Slice& key,
223
+ PinnableWideColumns* columns,
224
+ bool exclusive, bool do_validate) {
225
+ if (!column_family) {
226
+ return Status::InvalidArgument(
227
+ "Cannot call GetEntityForUpdate without a column family handle");
228
+ }
229
+
230
+ const Comparator* const ucmp = column_family->GetComparator();
231
+ assert(ucmp);
232
+ const size_t ts_sz = ucmp->timestamp_size();
233
+
234
+ if (ts_sz == 0) {
235
+ return TransactionBaseImpl::GetEntityForUpdate(
236
+ read_options, column_family, key, columns, exclusive, do_validate);
237
+ }
238
+
239
+ assert(ts_sz > 0);
240
+
241
+ if (!do_validate) {
242
+ if (read_timestamp_ != kMaxTxnTimestamp) {
243
+ return Status::InvalidArgument(
244
+ "Read timestamp must not be set if validation is disabled");
245
+ }
246
+ } else {
247
+ if (read_timestamp_ == kMaxTxnTimestamp) {
248
+ return Status::InvalidArgument(
249
+ "Read timestamp must be set for validation");
250
+ }
251
+ }
252
+
253
+ std::string ts_buf;
254
+ PutFixed64(&ts_buf, read_timestamp_);
255
+ Slice ts(ts_buf);
256
+
257
+ if (!read_options.timestamp) {
258
+ ReadOptions read_options_copy = read_options;
259
+ read_options_copy.timestamp = &ts;
260
+
261
+ return TransactionBaseImpl::GetEntityForUpdate(
262
+ read_options_copy, column_family, key, columns, exclusive, do_validate);
263
+ }
264
+
265
+ assert(read_options.timestamp);
266
+ if (*read_options.timestamp != ts) {
267
+ return Status::InvalidArgument("Must read from the same read timestamp");
268
+ }
269
+
270
+ return TransactionBaseImpl::GetEntityForUpdate(
271
+ read_options, column_family, key, columns, exclusive, do_validate);
272
+ }
273
+
220
274
  Status WriteCommittedTxn::PutEntityImpl(ColumnFamilyHandle* column_family,
221
275
  const Slice& key,
222
276
  const WideColumns& columns,
@@ -584,9 +638,9 @@ Status WriteCommittedTxn::PrepareInternal() {
584
638
  SequenceNumber* const KIgnoreSeqUsed = nullptr;
585
639
  const size_t kNoBatchCount = 0;
586
640
  s = db_impl_->WriteImpl(write_options, GetWriteBatch()->GetWriteBatch(),
587
- kNoWriteCallback, &log_number_, kRefNoLog,
588
- kDisableMemtable, KIgnoreSeqUsed, kNoBatchCount,
589
- &mark_log_callback);
641
+ kNoWriteCallback, /*user_write_cb=*/nullptr,
642
+ &log_number_, kRefNoLog, kDisableMemtable,
643
+ KIgnoreSeqUsed, kNoBatchCount, &mark_log_callback);
590
644
  return s;
591
645
  }
592
646
 
@@ -719,11 +773,11 @@ Status WriteCommittedTxn::CommitWithoutPrepareInternal() {
719
773
  post_mem_cb = &snapshot_creation_cb;
720
774
  }
721
775
  }
722
- auto s = db_impl_->WriteImpl(write_options_, wb,
723
- /*callback*/ nullptr, /*log_used*/ nullptr,
724
- /*log_ref*/ 0, /*disable_memtable*/ false,
725
- &seq_used, /*batch_cnt=*/0,
726
- /*pre_release_callback=*/nullptr, post_mem_cb);
776
+ auto s = db_impl_->WriteImpl(
777
+ write_options_, wb,
778
+ /*callback*/ nullptr, /*user_write_cb=*/nullptr, /*log_used*/ nullptr,
779
+ /*log_ref*/ 0, /*disable_memtable*/ false, &seq_used, /*batch_cnt=*/0,
780
+ /*pre_release_callback=*/nullptr, post_mem_cb);
727
781
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
728
782
  if (s.ok()) {
729
783
  SetId(seq_used);
@@ -734,6 +788,7 @@ Status WriteCommittedTxn::CommitWithoutPrepareInternal() {
734
788
  Status WriteCommittedTxn::CommitBatchInternal(WriteBatch* batch, size_t) {
735
789
  uint64_t seq_used = kMaxSequenceNumber;
736
790
  auto s = db_impl_->WriteImpl(write_options_, batch, /*callback*/ nullptr,
791
+ /*user_write_cb=*/nullptr,
737
792
  /*log_used*/ nullptr, /*log_ref*/ 0,
738
793
  /*disable_memtable*/ false, &seq_used);
739
794
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
@@ -807,6 +862,7 @@ Status WriteCommittedTxn::CommitInternal() {
807
862
  }
808
863
  }
809
864
  s = db_impl_->WriteImpl(write_options_, working_batch, /*callback*/ nullptr,
865
+ /*user_write_cb=*/nullptr,
810
866
  /*log_used*/ nullptr, /*log_ref*/ log_number_,
811
867
  /*disable_memtable*/ false, &seq_used,
812
868
  /*batch_cnt=*/0, /*pre_release_callback=*/nullptr,
@@ -234,6 +234,11 @@ class WriteCommittedTxn : public PessimisticTransaction {
234
234
  PinnableSlice* pinnable_val, bool exclusive,
235
235
  const bool do_validate) override;
236
236
 
237
+ Status GetEntityForUpdate(const ReadOptions& read_options,
238
+ ColumnFamilyHandle* column_family, const Slice& key,
239
+ PinnableWideColumns* columns, bool exclusive,
240
+ bool do_validate) override;
241
+
237
242
  using TransactionBaseImpl::Put;
238
243
  // `key` does NOT include timestamp even when it's enabled.
239
244
  Status Put(ColumnFamilyHandle* column_family, const Slice& key,