@nxtedition/rocksdb 13.1.4 → 13.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 (237) hide show
  1. package/binding.cc +43 -16
  2. package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
  4. package/deps/rocksdb/rocksdb/Makefile +2 -2
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
  7. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
  8. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
  9. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
  10. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
  11. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  12. package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
  13. package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
  14. package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
  15. package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
  16. package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
  39. package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
  41. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
  42. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
  52. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
  53. package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
  54. package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
  55. package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
  56. package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
  57. package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
  58. package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
  59. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
  60. package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
  61. package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
  62. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
  64. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
  65. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
  67. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
  68. package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
  69. package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
  70. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
  71. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
  72. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
  74. package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
  75. package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
  76. package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
  77. package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
  78. package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
  79. package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
  80. package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
  81. package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
  82. package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
  83. package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
  84. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
  85. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
  86. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
  87. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
  88. package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
  89. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
  90. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
  91. package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
  92. package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
  93. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
  94. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
  96. package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
  98. package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
  99. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
  100. package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
  101. package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
  102. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
  103. package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
  104. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
  105. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
  106. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
  107. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
  108. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
  109. package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
  110. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
  111. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
  113. package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
  114. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
  115. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
  120. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
  121. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
  122. package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
  123. package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
  124. package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
  125. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  126. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
  127. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
  128. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
  129. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
  130. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
  131. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
  132. package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
  134. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
  135. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
  136. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
  137. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
  139. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
  140. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
  142. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
  144. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
  147. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
  148. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
  150. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
  152. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  153. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
  154. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
  155. package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
  156. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
  157. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
  158. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
  159. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
  160. package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
  161. package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
  162. package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
  163. package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
  164. package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
  165. package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
  166. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
  167. package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
  168. package/deps/rocksdb/rocksdb/port/port.h +5 -9
  169. package/deps/rocksdb/rocksdb/src.mk +8 -0
  170. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
  171. package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
  172. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
  174. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
  175. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
  177. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
  178. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
  181. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  182. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  183. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
  184. package/deps/rocksdb/rocksdb/table/format.cc +3 -3
  185. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
  186. package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
  187. package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
  188. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
  189. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  190. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
  191. package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
  192. package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
  193. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
  194. package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
  196. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
  197. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
  198. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  199. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
  200. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
  201. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
  202. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
  203. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
  204. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
  205. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
  206. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
  207. package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
  208. package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
  209. package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
  210. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
  211. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
  212. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
  213. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
  214. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
  215. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
  216. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
  217. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
  218. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
  219. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
  220. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
  221. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
  222. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
  223. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
  224. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
  225. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
  226. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
  227. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
  228. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
  229. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
  230. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
  231. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
  232. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
  233. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
  234. package/deps/rocksdb/rocksdb.gyp +2 -0
  235. package/package.json +1 -1
  236. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  237. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -2222,6 +2222,443 @@ TEST_P(OptimisticTransactionTest, EntityReadSanityChecks) {
2222
2222
  }
2223
2223
  }
2224
2224
 
2225
+ TEST_P(OptimisticTransactionTest, CoalescingIterator) {
2226
+ ColumnFamilyOptions cf_opts;
2227
+ cf_opts.enable_blob_files = true;
2228
+
2229
+ ColumnFamilyHandle* cfh1 = nullptr;
2230
+ ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf1", &cfh1));
2231
+ std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
2232
+
2233
+ ColumnFamilyHandle* cfh2 = nullptr;
2234
+ ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf2", &cfh2));
2235
+ std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
2236
+
2237
+ // Note: "cf1" keys are present only in CF1; "cf2" keys are only present in
2238
+ // CF2; "cf12" keys are present in both CFs. "a" keys are present only in the
2239
+ // database; "b" keys are present only in the transaction; "c" keys are
2240
+ // present in both the database and the transaction. The values indicate the
2241
+ // column family as well as whether the entry came from the database or the
2242
+ // transaction.
2243
+
2244
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_a", "cf1_a_db_cf1"));
2245
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_c", "cf1_c_db_cf1"));
2246
+
2247
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_a", "cf2_a_db_cf2"));
2248
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_c", "cf2_c_db_cf2"));
2249
+
2250
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_a", "cf12_a_db_cf1"));
2251
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_a", "cf12_a_db_cf2"));
2252
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_c", "cf12_c_db_cf1"));
2253
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_c", "cf12_c_db_cf2"));
2254
+
2255
+ ASSERT_OK(txn_db->Flush(FlushOptions(), cfh1));
2256
+ ASSERT_OK(txn_db->Flush(FlushOptions(), cfh2));
2257
+
2258
+ std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
2259
+
2260
+ ASSERT_OK(txn->Put(cfh1, "cf1_b", "cf1_b_txn_cf1"));
2261
+ ASSERT_OK(txn->Put(cfh1, "cf1_c", "cf1_c_txn_cf1"));
2262
+
2263
+ ASSERT_OK(txn->Put(cfh2, "cf2_b", "cf2_b_txn_cf2"));
2264
+ ASSERT_OK(txn->Put(cfh2, "cf2_c", "cf2_c_txn_cf2"));
2265
+
2266
+ ASSERT_OK(txn->Put(cfh1, "cf12_b", "cf12_b_txn_cf1"));
2267
+ ASSERT_OK(txn->Put(cfh2, "cf12_b", "cf12_b_txn_cf2"));
2268
+ ASSERT_OK(txn->Put(cfh1, "cf12_c", "cf12_c_txn_cf1"));
2269
+ ASSERT_OK(txn->Put(cfh2, "cf12_c", "cf12_c_txn_cf2"));
2270
+
2271
+ auto verify = [&](bool allow_unprepared_value, auto prepare_if_needed) {
2272
+ ReadOptions read_options;
2273
+ read_options.allow_unprepared_value = allow_unprepared_value;
2274
+
2275
+ std::unique_ptr<Iterator> iter(
2276
+ txn->GetCoalescingIterator(read_options, {cfh1, cfh2}));
2277
+
2278
+ {
2279
+ iter->SeekToFirst();
2280
+ ASSERT_TRUE(iter->Valid());
2281
+ ASSERT_OK(iter->status());
2282
+ ASSERT_EQ(iter->key(), "cf12_a");
2283
+
2284
+ prepare_if_needed(iter.get());
2285
+
2286
+ ASSERT_EQ(iter->value(), "cf12_a_db_cf2");
2287
+ }
2288
+
2289
+ {
2290
+ iter->Next();
2291
+ ASSERT_TRUE(iter->Valid());
2292
+ ASSERT_OK(iter->status());
2293
+ ASSERT_EQ(iter->key(), "cf12_b");
2294
+
2295
+ prepare_if_needed(iter.get());
2296
+
2297
+ ASSERT_EQ(iter->value(), "cf12_b_txn_cf2");
2298
+ }
2299
+
2300
+ {
2301
+ iter->Next();
2302
+ ASSERT_TRUE(iter->Valid());
2303
+ ASSERT_OK(iter->status());
2304
+ ASSERT_EQ(iter->key(), "cf12_c");
2305
+
2306
+ prepare_if_needed(iter.get());
2307
+
2308
+ ASSERT_EQ(iter->value(), "cf12_c_txn_cf2");
2309
+ }
2310
+
2311
+ {
2312
+ iter->Next();
2313
+ ASSERT_TRUE(iter->Valid());
2314
+ ASSERT_OK(iter->status());
2315
+ ASSERT_EQ(iter->key(), "cf1_a");
2316
+
2317
+ prepare_if_needed(iter.get());
2318
+
2319
+ ASSERT_EQ(iter->value(), "cf1_a_db_cf1");
2320
+ }
2321
+
2322
+ {
2323
+ iter->Next();
2324
+ ASSERT_TRUE(iter->Valid());
2325
+ ASSERT_OK(iter->status());
2326
+ ASSERT_EQ(iter->key(), "cf1_b");
2327
+
2328
+ prepare_if_needed(iter.get());
2329
+
2330
+ ASSERT_EQ(iter->value(), "cf1_b_txn_cf1");
2331
+ }
2332
+
2333
+ {
2334
+ iter->Next();
2335
+ ASSERT_TRUE(iter->Valid());
2336
+ ASSERT_OK(iter->status());
2337
+ ASSERT_EQ(iter->key(), "cf1_c");
2338
+
2339
+ prepare_if_needed(iter.get());
2340
+
2341
+ ASSERT_EQ(iter->value(), "cf1_c_txn_cf1");
2342
+ }
2343
+
2344
+ {
2345
+ iter->Next();
2346
+ ASSERT_TRUE(iter->Valid());
2347
+ ASSERT_OK(iter->status());
2348
+ ASSERT_EQ(iter->key(), "cf2_a");
2349
+
2350
+ prepare_if_needed(iter.get());
2351
+
2352
+ ASSERT_EQ(iter->value(), "cf2_a_db_cf2");
2353
+ }
2354
+
2355
+ {
2356
+ iter->Next();
2357
+ ASSERT_TRUE(iter->Valid());
2358
+ ASSERT_OK(iter->status());
2359
+ ASSERT_EQ(iter->key(), "cf2_b");
2360
+
2361
+ prepare_if_needed(iter.get());
2362
+
2363
+ ASSERT_EQ(iter->value(), "cf2_b_txn_cf2");
2364
+ }
2365
+
2366
+ {
2367
+ iter->Next();
2368
+ ASSERT_TRUE(iter->Valid());
2369
+ ASSERT_OK(iter->status());
2370
+ ASSERT_EQ(iter->key(), "cf2_c");
2371
+
2372
+ prepare_if_needed(iter.get());
2373
+
2374
+ ASSERT_EQ(iter->value(), "cf2_c_txn_cf2");
2375
+ }
2376
+
2377
+ {
2378
+ iter->Next();
2379
+ ASSERT_FALSE(iter->Valid());
2380
+ ASSERT_OK(iter->status());
2381
+ }
2382
+ };
2383
+
2384
+ verify(/* allow_unprepared_value */ false, [](Iterator*) {});
2385
+ verify(/* allow_unprepared_value */ true, [](Iterator* iter) {
2386
+ ASSERT_TRUE(iter->value().empty());
2387
+ ASSERT_TRUE(iter->PrepareValue());
2388
+ });
2389
+ }
2390
+
2391
+ TEST_P(OptimisticTransactionTest, CoalescingIteratorSanityChecks) {
2392
+ ColumnFamilyOptions cf1_opts;
2393
+ ColumnFamilyHandle* cfh1 = nullptr;
2394
+ ASSERT_OK(txn_db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
2395
+ std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
2396
+
2397
+ ColumnFamilyOptions cf2_opts;
2398
+ cf2_opts.comparator = ReverseBytewiseComparator();
2399
+ ColumnFamilyHandle* cfh2 = nullptr;
2400
+ ASSERT_OK(txn_db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
2401
+ std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
2402
+
2403
+ std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
2404
+
2405
+ {
2406
+ std::unique_ptr<Iterator> iter(
2407
+ txn->GetCoalescingIterator(ReadOptions(), {}));
2408
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
2409
+ }
2410
+
2411
+ {
2412
+ std::unique_ptr<Iterator> iter(
2413
+ txn->GetCoalescingIterator(ReadOptions(), {cfh1, cfh2}));
2414
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
2415
+ }
2416
+
2417
+ {
2418
+ ReadOptions read_options;
2419
+ read_options.io_activity = Env::IOActivity::kCompaction;
2420
+
2421
+ std::unique_ptr<Iterator> iter(
2422
+ txn->GetCoalescingIterator(read_options, {cfh1}));
2423
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
2424
+ }
2425
+ }
2426
+
2427
+ TEST_P(OptimisticTransactionTest, AttributeGroupIterator) {
2428
+ ColumnFamilyOptions cf_opts;
2429
+ cf_opts.enable_blob_files = true;
2430
+
2431
+ ColumnFamilyHandle* cfh1 = nullptr;
2432
+ ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf1", &cfh1));
2433
+ std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
2434
+
2435
+ ColumnFamilyHandle* cfh2 = nullptr;
2436
+ ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf2", &cfh2));
2437
+ std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
2438
+
2439
+ // Note: "cf1" keys are present only in CF1; "cf2" keys are only present in
2440
+ // CF2; "cf12" keys are present in both CFs. "a" keys are present only in the
2441
+ // database; "b" keys are present only in the transaction; "c" keys are
2442
+ // present in both the database and the transaction. The values indicate the
2443
+ // column family as well as whether the entry came from the database or the
2444
+ // transaction.
2445
+
2446
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_a", "cf1_a_db_cf1"));
2447
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_c", "cf1_c_db_cf1"));
2448
+
2449
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_a", "cf2_a_db_cf2"));
2450
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_c", "cf2_c_db_cf2"));
2451
+
2452
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_a", "cf12_a_db_cf1"));
2453
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_a", "cf12_a_db_cf2"));
2454
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_c", "cf12_c_db_cf1"));
2455
+ ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_c", "cf12_c_db_cf2"));
2456
+
2457
+ ASSERT_OK(txn_db->Flush(FlushOptions(), cfh1));
2458
+ ASSERT_OK(txn_db->Flush(FlushOptions(), cfh2));
2459
+
2460
+ std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
2461
+
2462
+ ASSERT_OK(txn->Put(cfh1, "cf1_b", "cf1_b_txn_cf1"));
2463
+ ASSERT_OK(txn->Put(cfh1, "cf1_c", "cf1_c_txn_cf1"));
2464
+
2465
+ ASSERT_OK(txn->Put(cfh2, "cf2_b", "cf2_b_txn_cf2"));
2466
+ ASSERT_OK(txn->Put(cfh2, "cf2_c", "cf2_c_txn_cf2"));
2467
+
2468
+ ASSERT_OK(txn->Put(cfh1, "cf12_b", "cf12_b_txn_cf1"));
2469
+ ASSERT_OK(txn->Put(cfh2, "cf12_b", "cf12_b_txn_cf2"));
2470
+ ASSERT_OK(txn->Put(cfh1, "cf12_c", "cf12_c_txn_cf1"));
2471
+ ASSERT_OK(txn->Put(cfh2, "cf12_c", "cf12_c_txn_cf2"));
2472
+
2473
+ auto verify = [&](bool allow_unprepared_value, auto prepare_if_needed) {
2474
+ ReadOptions read_options;
2475
+ read_options.allow_unprepared_value = allow_unprepared_value;
2476
+
2477
+ std::unique_ptr<AttributeGroupIterator> iter(
2478
+ txn->GetAttributeGroupIterator(read_options, {cfh1, cfh2}));
2479
+
2480
+ {
2481
+ iter->SeekToFirst();
2482
+ ASSERT_TRUE(iter->Valid());
2483
+ ASSERT_OK(iter->status());
2484
+ ASSERT_EQ(iter->key(), "cf12_a");
2485
+
2486
+ prepare_if_needed(iter.get());
2487
+
2488
+ WideColumns cf1_columns{{kDefaultWideColumnName, "cf12_a_db_cf1"}};
2489
+ WideColumns cf2_columns{{kDefaultWideColumnName, "cf12_a_db_cf2"}};
2490
+ IteratorAttributeGroups expected{
2491
+ IteratorAttributeGroup{cfh1, &cf1_columns},
2492
+ IteratorAttributeGroup{cfh2, &cf2_columns}};
2493
+ ASSERT_EQ(iter->attribute_groups(), expected);
2494
+ }
2495
+
2496
+ {
2497
+ iter->Next();
2498
+ ASSERT_TRUE(iter->Valid());
2499
+ ASSERT_OK(iter->status());
2500
+ ASSERT_EQ(iter->key(), "cf12_b");
2501
+
2502
+ prepare_if_needed(iter.get());
2503
+
2504
+ WideColumns cf1_columns{{kDefaultWideColumnName, "cf12_b_txn_cf1"}};
2505
+ WideColumns cf2_columns{{kDefaultWideColumnName, "cf12_b_txn_cf2"}};
2506
+ IteratorAttributeGroups expected{
2507
+ IteratorAttributeGroup{cfh1, &cf1_columns},
2508
+ IteratorAttributeGroup{cfh2, &cf2_columns}};
2509
+ ASSERT_EQ(iter->attribute_groups(), expected);
2510
+ }
2511
+
2512
+ {
2513
+ iter->Next();
2514
+ ASSERT_TRUE(iter->Valid());
2515
+ ASSERT_OK(iter->status());
2516
+ ASSERT_EQ(iter->key(), "cf12_c");
2517
+
2518
+ prepare_if_needed(iter.get());
2519
+
2520
+ WideColumns cf1_columns{{kDefaultWideColumnName, "cf12_c_txn_cf1"}};
2521
+ WideColumns cf2_columns{{kDefaultWideColumnName, "cf12_c_txn_cf2"}};
2522
+ IteratorAttributeGroups expected{
2523
+ IteratorAttributeGroup{cfh1, &cf1_columns},
2524
+ IteratorAttributeGroup{cfh2, &cf2_columns}};
2525
+ ASSERT_EQ(iter->attribute_groups(), expected);
2526
+ }
2527
+
2528
+ {
2529
+ iter->Next();
2530
+ ASSERT_TRUE(iter->Valid());
2531
+ ASSERT_OK(iter->status());
2532
+ ASSERT_EQ(iter->key(), "cf1_a");
2533
+
2534
+ prepare_if_needed(iter.get());
2535
+
2536
+ WideColumns cf1_columns{{kDefaultWideColumnName, "cf1_a_db_cf1"}};
2537
+ IteratorAttributeGroups expected{
2538
+ IteratorAttributeGroup{cfh1, &cf1_columns}};
2539
+ ASSERT_EQ(iter->attribute_groups(), expected);
2540
+ }
2541
+
2542
+ {
2543
+ iter->Next();
2544
+ ASSERT_TRUE(iter->Valid());
2545
+ ASSERT_OK(iter->status());
2546
+ ASSERT_EQ(iter->key(), "cf1_b");
2547
+
2548
+ prepare_if_needed(iter.get());
2549
+
2550
+ WideColumns cf1_columns{{kDefaultWideColumnName, "cf1_b_txn_cf1"}};
2551
+ IteratorAttributeGroups expected{
2552
+ IteratorAttributeGroup{cfh1, &cf1_columns}};
2553
+ ASSERT_EQ(iter->attribute_groups(), expected);
2554
+ }
2555
+
2556
+ {
2557
+ iter->Next();
2558
+ ASSERT_TRUE(iter->Valid());
2559
+ ASSERT_OK(iter->status());
2560
+ ASSERT_EQ(iter->key(), "cf1_c");
2561
+
2562
+ prepare_if_needed(iter.get());
2563
+
2564
+ WideColumns cf1_columns{{kDefaultWideColumnName, "cf1_c_txn_cf1"}};
2565
+ IteratorAttributeGroups expected{
2566
+ IteratorAttributeGroup{cfh1, &cf1_columns}};
2567
+ ASSERT_EQ(iter->attribute_groups(), expected);
2568
+ }
2569
+
2570
+ {
2571
+ iter->Next();
2572
+ ASSERT_TRUE(iter->Valid());
2573
+ ASSERT_OK(iter->status());
2574
+ ASSERT_EQ(iter->key(), "cf2_a");
2575
+
2576
+ prepare_if_needed(iter.get());
2577
+
2578
+ WideColumns cf2_columns{{kDefaultWideColumnName, "cf2_a_db_cf2"}};
2579
+ IteratorAttributeGroups expected{
2580
+ IteratorAttributeGroup{cfh2, &cf2_columns}};
2581
+ ASSERT_EQ(iter->attribute_groups(), expected);
2582
+ }
2583
+
2584
+ {
2585
+ iter->Next();
2586
+ ASSERT_TRUE(iter->Valid());
2587
+ ASSERT_OK(iter->status());
2588
+ ASSERT_EQ(iter->key(), "cf2_b");
2589
+
2590
+ prepare_if_needed(iter.get());
2591
+
2592
+ WideColumns cf2_columns{{kDefaultWideColumnName, "cf2_b_txn_cf2"}};
2593
+ IteratorAttributeGroups expected{
2594
+ IteratorAttributeGroup{cfh2, &cf2_columns}};
2595
+ ASSERT_EQ(iter->attribute_groups(), expected);
2596
+ }
2597
+
2598
+ {
2599
+ iter->Next();
2600
+ ASSERT_TRUE(iter->Valid());
2601
+ ASSERT_OK(iter->status());
2602
+ ASSERT_EQ(iter->key(), "cf2_c");
2603
+
2604
+ prepare_if_needed(iter.get());
2605
+
2606
+ WideColumns cf2_columns{{kDefaultWideColumnName, "cf2_c_txn_cf2"}};
2607
+ IteratorAttributeGroups expected{
2608
+ IteratorAttributeGroup{cfh2, &cf2_columns}};
2609
+ ASSERT_EQ(iter->attribute_groups(), expected);
2610
+ }
2611
+
2612
+ {
2613
+ iter->Next();
2614
+ ASSERT_FALSE(iter->Valid());
2615
+ ASSERT_OK(iter->status());
2616
+ }
2617
+ };
2618
+
2619
+ verify(/* allow_unprepared_value */ false, [](AttributeGroupIterator*) {});
2620
+ verify(/* allow_unprepared_value */ true, [](AttributeGroupIterator* iter) {
2621
+ ASSERT_TRUE(iter->attribute_groups().empty());
2622
+ ASSERT_TRUE(iter->PrepareValue());
2623
+ });
2624
+ }
2625
+
2626
+ TEST_P(OptimisticTransactionTest, AttributeGroupIteratorSanityChecks) {
2627
+ ColumnFamilyOptions cf1_opts;
2628
+ ColumnFamilyHandle* cfh1 = nullptr;
2629
+ ASSERT_OK(txn_db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
2630
+ std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
2631
+
2632
+ ColumnFamilyOptions cf2_opts;
2633
+ cf2_opts.comparator = ReverseBytewiseComparator();
2634
+ ColumnFamilyHandle* cfh2 = nullptr;
2635
+ ASSERT_OK(txn_db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
2636
+ std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
2637
+
2638
+ std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
2639
+
2640
+ {
2641
+ std::unique_ptr<AttributeGroupIterator> iter(
2642
+ txn->GetAttributeGroupIterator(ReadOptions(), {}));
2643
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
2644
+ }
2645
+
2646
+ {
2647
+ std::unique_ptr<AttributeGroupIterator> iter(
2648
+ txn->GetAttributeGroupIterator(ReadOptions(), {cfh1, cfh2}));
2649
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
2650
+ }
2651
+
2652
+ {
2653
+ ReadOptions read_options;
2654
+ read_options.io_activity = Env::IOActivity::kCompaction;
2655
+
2656
+ std::unique_ptr<AttributeGroupIterator> iter(
2657
+ txn->GetAttributeGroupIterator(read_options, {cfh1}));
2658
+ ASSERT_TRUE(iter->status().IsInvalidArgument());
2659
+ }
2660
+ }
2661
+
2225
2662
  INSTANTIATE_TEST_CASE_P(
2226
2663
  InstanceOccGroup, OptimisticTransactionTest,
2227
2664
  testing::Values(OccValidationPolicy::kValidateSerial,
@@ -103,6 +103,9 @@ void PessimisticTransaction::Initialize(const TransactionOptions& txn_options) {
103
103
 
104
104
  read_timestamp_ = kMaxTxnTimestamp;
105
105
  commit_timestamp_ = kMaxTxnTimestamp;
106
+
107
+ commit_bypass_memtable_ = txn_options.commit_bypass_memtable;
108
+ write_batch_.SetTrackPerCFStat(txn_options.commit_bypass_memtable);
106
109
  }
107
110
 
108
111
  PessimisticTransaction::~PessimisticTransaction() {
@@ -843,6 +846,7 @@ Status WriteCommittedTxn::CommitInternal() {
843
846
  if (!needs_ts) {
844
847
  s = WriteBatchInternal::MarkCommit(working_batch, name_);
845
848
  } else {
849
+ assert(!commit_bypass_memtable_);
846
850
  assert(commit_timestamp_ != kMaxTxnTimestamp);
847
851
  char commit_ts_buf[sizeof(kMaxTxnTimestamp)];
848
852
  EncodeFixed64(commit_ts_buf, commit_timestamp_);
@@ -878,11 +882,14 @@ Status WriteCommittedTxn::CommitInternal() {
878
882
  // any operations appended to this working_batch will be ignored from WAL
879
883
  working_batch->MarkWalTerminationPoint();
880
884
 
881
- // insert prepared batch into Memtable only skipping WAL.
882
- // Memtable will ignore BeginPrepare/EndPrepare markers
883
- // in non recovery mode and simply insert the values
884
- s = WriteBatchInternal::Append(working_batch, wb);
885
- assert(s.ok());
885
+ const bool bypass_memtable = commit_bypass_memtable_ && wb->Count() > 0;
886
+ if (!bypass_memtable) {
887
+ // insert prepared batch into Memtable only skipping WAL.
888
+ // Memtable will ignore BeginPrepare/EndPrepare markers
889
+ // in non recovery mode and simply insert the values
890
+ s = WriteBatchInternal::Append(working_batch, wb);
891
+ assert(s.ok());
892
+ }
886
893
 
887
894
  uint64_t seq_used = kMaxSequenceNumber;
888
895
  SnapshotCreationCallback snapshot_creation_cb(db_impl_, commit_timestamp_,
@@ -896,12 +903,28 @@ Status WriteCommittedTxn::CommitInternal() {
896
903
  post_mem_cb = &snapshot_creation_cb;
897
904
  }
898
905
  }
899
- s = db_impl_->WriteImpl(write_options_, working_batch, /*callback*/ nullptr,
900
- /*user_write_cb=*/nullptr,
901
- /*log_used*/ nullptr, /*log_ref*/ log_number_,
902
- /*disable_memtable*/ false, &seq_used,
903
- /*batch_cnt=*/0, /*pre_release_callback=*/nullptr,
904
- post_mem_cb);
906
+ assert(log_number_ > 0);
907
+ if (bypass_memtable) {
908
+ s = db_impl_->WriteImpl(
909
+ write_options_, working_batch, /*callback*/ nullptr,
910
+ /*user_write_cb=*/nullptr,
911
+ /*log_used*/ nullptr, /*log_ref*/ log_number_,
912
+ /*disable_memtable*/ false, &seq_used,
913
+ /*batch_cnt=*/0, /*pre_release_callback=*/nullptr, post_mem_cb,
914
+ /*wbwi=*/std::make_shared<WriteBatchWithIndex>(std::move(write_batch_)),
915
+ /*min_prep_log=*/log_number_);
916
+ // Reset write_batch_ since it's accessed in transaction clean up and
917
+ // might be used for transaction reuse.
918
+ write_batch_ = WriteBatchWithIndex(cmp_, 0, true, 0,
919
+ write_options_.protection_bytes_per_key);
920
+ } else {
921
+ s = db_impl_->WriteImpl(write_options_, working_batch, /*callback*/ nullptr,
922
+ /*user_write_cb=*/nullptr,
923
+ /*log_used*/ nullptr, /*log_ref*/ log_number_,
924
+ /*disable_memtable*/ false, &seq_used,
925
+ /*batch_cnt=*/0, /*pre_release_callback=*/nullptr,
926
+ post_mem_cb);
927
+ }
905
928
  assert(!s.ok() || seq_used != kMaxSequenceNumber);
906
929
  if (s.ok()) {
907
930
  SetId(seq_used);
@@ -122,13 +122,6 @@ class PessimisticTransaction : public TransactionBaseImpl {
122
122
  ColumnFamilyHandle* column_family = nullptr) override;
123
123
 
124
124
  protected:
125
- // Refer to
126
- // TransactionOptions::use_only_the_last_commit_time_batch_for_recovery
127
- bool use_only_the_last_commit_time_batch_for_recovery_ = false;
128
- // Refer to
129
- // TransactionOptions::skip_prepare
130
- bool skip_prepare_ = false;
131
-
132
125
  virtual Status PrepareInternal() = 0;
133
126
 
134
127
  virtual Status CommitWithoutPrepareInternal() = 0;
@@ -167,6 +160,16 @@ class PessimisticTransaction : public TransactionBaseImpl {
167
160
  TxnTimestamp read_timestamp_{kMaxTxnTimestamp};
168
161
  TxnTimestamp commit_timestamp_{kMaxTxnTimestamp};
169
162
 
163
+ // Refer to
164
+ // TransactionOptions::use_only_the_last_commit_time_batch_for_recovery
165
+ bool use_only_the_last_commit_time_batch_for_recovery_ = false;
166
+ // Refer to
167
+ // TransactionOptions::skip_prepare
168
+ bool skip_prepare_ = false;
169
+ // Refer to
170
+ // TransactionOptions::commit_bypass_memtable
171
+ bool commit_bypass_memtable_ = false;
172
+
170
173
  private:
171
174
  friend class TransactionTest_ValidateSnapshotTest_Test;
172
175
  // Used to create unique ids for transactions.
@@ -304,6 +307,10 @@ class WriteCommittedTxn : public PessimisticTransaction {
304
307
  Status SetCommitTimestamp(TxnTimestamp ts) override;
305
308
  TxnTimestamp GetCommitTimestamp() const override { return commit_timestamp_; }
306
309
 
310
+ bool GetCommitBypassMemTable() const override {
311
+ return commit_bypass_memtable_;
312
+ }
313
+
307
314
  private:
308
315
  template <typename TValue>
309
316
  Status GetForUpdateImpl(const ReadOptions& read_options,
@@ -20,6 +20,7 @@
20
20
  #include "test_util/sync_point.h"
21
21
  #include "util/cast_util.h"
22
22
  #include "util/mutexlock.h"
23
+ #include "utilities/secondary_index/secondary_index_mixin.h"
23
24
  #include "utilities/transactions/pessimistic_transaction.h"
24
25
  #include "utilities/transactions/transaction_db_mutex_impl.h"
25
26
  #include "utilities/transactions/write_prepared_txn_db.h"
@@ -183,7 +184,12 @@ Transaction* WriteCommittedTxnDB::BeginTransaction(
183
184
  ReinitializeTransaction(old_txn, write_options, txn_options);
184
185
  return old_txn;
185
186
  } else {
186
- return new WriteCommittedTxn(this, write_options, txn_options);
187
+ if (!txn_db_options_.secondary_indices.empty()) {
188
+ return new SecondaryIndexMixin<WriteCommittedTxn>(
189
+ &txn_db_options_.secondary_indices, this, write_options, txn_options);
190
+ } else {
191
+ return new WriteCommittedTxn(this, write_options, txn_options);
192
+ }
187
193
  }
188
194
  }
189
195
 
@@ -34,4 +34,21 @@ DisableGCSnapshotChecker* DisableGCSnapshotChecker::Instance() {
34
34
  STATIC_AVOID_DESTRUCTION(DisableGCSnapshotChecker, instance);
35
35
  return &instance;
36
36
  }
37
+
38
+ bool DataIsDefinitelyInSnapshot(SequenceNumber seqno, SequenceNumber snapshot,
39
+ const SnapshotChecker* snapshot_checker) {
40
+ return ((seqno) <= (snapshot) &&
41
+ (snapshot_checker == nullptr ||
42
+ LIKELY(snapshot_checker->CheckInSnapshot((seqno), (snapshot)) ==
43
+ SnapshotCheckerResult::kInSnapshot)));
44
+ }
45
+
46
+ bool DataIsDefinitelyNotInSnapshot(SequenceNumber seqno,
47
+ SequenceNumber snapshot,
48
+ const SnapshotChecker* snapshot_checker) {
49
+ return ((seqno) > (snapshot) ||
50
+ (snapshot_checker != nullptr &&
51
+ UNLIKELY(snapshot_checker->CheckInSnapshot((seqno), (snapshot)) ==
52
+ SnapshotCheckerResult::kNotInSnapshot)));
53
+ }
37
54
  } // namespace ROCKSDB_NAMESPACE
@@ -7,6 +7,8 @@
7
7
 
8
8
  #include <cinttypes>
9
9
 
10
+ #include "db/attribute_group_iterator_impl.h"
11
+ #include "db/coalescing_iterator.h"
10
12
  #include "db/column_family.h"
11
13
  #include "db/db_impl/db_impl.h"
12
14
  #include "logging/logging.h"
@@ -486,6 +488,73 @@ Iterator* TransactionBaseImpl::GetIterator(const ReadOptions& read_options,
486
488
  &read_options);
487
489
  }
488
490
 
491
+ template <typename IterType, typename ImplType, typename ErrorIteratorFuncType>
492
+ std::unique_ptr<IterType> TransactionBaseImpl::NewMultiCfIterator(
493
+ const ReadOptions& read_options,
494
+ const std::vector<ColumnFamilyHandle*>& column_families,
495
+ ErrorIteratorFuncType error_iterator_func) {
496
+ if (column_families.empty()) {
497
+ return error_iterator_func(
498
+ Status::InvalidArgument("No Column Family was provided"));
499
+ }
500
+
501
+ const Comparator* const first_comparator =
502
+ column_families[0]->GetComparator();
503
+ assert(first_comparator);
504
+
505
+ for (size_t i = 1; i < column_families.size(); ++i) {
506
+ const Comparator* cf_comparator = column_families[i]->GetComparator();
507
+ assert(cf_comparator);
508
+
509
+ if (first_comparator != cf_comparator &&
510
+ first_comparator->GetId() != cf_comparator->GetId()) {
511
+ return error_iterator_func(Status::InvalidArgument(
512
+ "Different comparators are being used across CFs"));
513
+ }
514
+ }
515
+
516
+ std::vector<Iterator*> child_iterators;
517
+ const Status s =
518
+ db_->NewIterators(read_options, column_families, &child_iterators);
519
+ if (!s.ok()) {
520
+ return error_iterator_func(s);
521
+ }
522
+
523
+ assert(column_families.size() == child_iterators.size());
524
+
525
+ std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>
526
+ cfh_iter_pairs;
527
+ cfh_iter_pairs.reserve(column_families.size());
528
+ for (size_t i = 0; i < column_families.size(); ++i) {
529
+ cfh_iter_pairs.emplace_back(
530
+ column_families[i],
531
+ write_batch_.NewIteratorWithBase(column_families[i], child_iterators[i],
532
+ &read_options));
533
+ }
534
+
535
+ return std::make_unique<ImplType>(read_options,
536
+ column_families[0]->GetComparator(),
537
+ std::move(cfh_iter_pairs));
538
+ }
539
+
540
+ std::unique_ptr<Iterator> TransactionBaseImpl::GetCoalescingIterator(
541
+ const ReadOptions& read_options,
542
+ const std::vector<ColumnFamilyHandle*>& column_families) {
543
+ return NewMultiCfIterator<Iterator, CoalescingIterator>(
544
+ read_options, column_families, [](const Status& s) {
545
+ return std::unique_ptr<Iterator>(NewErrorIterator(s));
546
+ });
547
+ }
548
+
549
+ std::unique_ptr<AttributeGroupIterator>
550
+ TransactionBaseImpl::GetAttributeGroupIterator(
551
+ const ReadOptions& read_options,
552
+ const std::vector<ColumnFamilyHandle*>& column_families) {
553
+ return NewMultiCfIterator<AttributeGroupIterator, AttributeGroupIteratorImpl>(
554
+ read_options, column_families,
555
+ [](const Status& s) { return NewAttributeGroupErrorIterator(s); });
556
+ }
557
+
489
558
  Status TransactionBaseImpl::PutEntityImpl(ColumnFamilyHandle* column_family,
490
559
  const Slice& key,
491
560
  const WideColumns& columns,