@nxtedition/rocksdb 13.5.8 → 13.5.9

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 (508) hide show
  1. package/binding.cc +209 -2
  2. package/deps/rocksdb/rocksdb/BUCK +12 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  4. package/deps/rocksdb/rocksdb/Makefile +28 -23
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  7. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  10. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  11. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  12. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  14. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  15. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  16. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  25. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  26. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  27. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  28. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  29. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  30. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  57. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  59. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  60. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  61. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  62. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  63. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  64. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  65. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  66. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  67. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  68. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  69. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  70. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  86. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  87. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  88. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  89. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  90. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  91. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  92. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  93. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  94. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  95. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  96. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  97. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  98. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  99. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  100. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  101. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  102. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  104. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  105. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  106. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  107. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  108. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  109. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  110. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  111. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  112. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  113. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  114. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  115. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  116. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  117. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  118. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  119. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  120. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  124. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  125. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  126. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  127. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  129. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  130. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  131. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  132. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  133. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  134. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  135. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  136. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  137. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  138. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  139. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  140. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  141. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  142. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  143. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  144. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  145. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  146. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  147. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  148. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  149. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  150. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  153. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  154. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  155. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  156. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  157. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  158. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  160. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  161. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  163. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  164. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  165. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  166. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  168. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  169. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  170. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  171. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  172. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  173. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  174. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  175. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  176. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  177. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  178. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  179. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  180. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  181. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  182. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  191. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  193. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  194. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  195. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  196. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  198. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  199. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  200. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  201. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  202. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  204. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  205. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  206. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  207. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  210. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  212. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  213. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  214. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  215. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  218. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  220. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  221. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  224. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  226. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  228. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  229. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  230. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  232. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  234. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  235. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  238. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  241. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  242. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  243. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  245. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  247. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  249. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  253. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  254. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  256. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  257. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  258. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  260. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  269. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  270. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  276. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  277. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  278. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  279. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  281. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  283. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  284. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  285. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  286. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  288. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  289. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  290. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  291. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  292. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  293. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  294. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  295. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  296. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  297. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  298. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  299. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  300. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  301. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  302. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  303. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  304. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  305. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  306. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  307. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  308. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  309. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  310. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  311. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  312. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  314. package/deps/rocksdb/rocksdb/src.mk +17 -11
  315. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  316. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  325. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  327. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  328. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  329. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  330. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  334. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  335. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  338. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  340. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  342. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  343. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  345. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  349. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  350. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  351. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  352. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  353. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  354. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  356. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  357. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  362. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  364. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  366. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  367. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  368. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  369. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  370. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  371. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  372. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  374. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  376. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  377. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  380. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  381. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  382. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  384. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  385. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  386. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  388. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  391. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  393. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  395. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  396. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  397. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  398. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  399. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  400. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  401. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  402. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  403. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  404. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  405. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  406. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  408. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  409. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  410. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  411. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  412. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  413. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  414. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  416. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  426. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  428. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  430. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  433. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  435. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  436. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  437. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  439. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  442. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  443. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  458. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  464. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  467. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  468. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  479. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  482. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  485. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  486. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  499. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  500. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  504. package/deps/rocksdb/rocksdb.gyp +5 -0
  505. package/index.js +47 -2
  506. package/package.json +8 -1
  507. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  508. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -19,6 +19,7 @@
19
19
  #include "rocksdb/options.h"
20
20
  #include "rocksdb/perf_context.h"
21
21
  #include "rocksdb/utilities/secondary_index.h"
22
+ #include "rocksdb/utilities/secondary_index_simple.h"
22
23
  #include "rocksdb/utilities/transaction.h"
23
24
  #include "rocksdb/utilities/transaction_db.h"
24
25
  #include "table/mock_table.h"
@@ -29,7 +30,7 @@
29
30
  #include "util/random.h"
30
31
  #include "util/string_util.h"
31
32
  #include "utilities/merge_operators.h"
32
- #include "utilities/merge_operators/string_append/stringappend.h"
33
+ #include "utilities/secondary_index/secondary_index_helper.h"
33
34
  #include "utilities/transactions/pessimistic_transaction_db.h"
34
35
 
35
36
  namespace ROCKSDB_NAMESPACE {
@@ -3911,16 +3912,16 @@ TEST_P(TransactionTest, LockLimitTest) {
3911
3912
 
3912
3913
  // lock limit reached
3913
3914
  s = txn->Put("W", "w");
3914
- ASSERT_TRUE(s.IsBusy());
3915
+ ASSERT_TRUE(s.IsLockLimit());
3915
3916
 
3916
3917
  // re-locking same key shouldn't put us over the limit
3917
3918
  s = txn->Put("X", "xx");
3918
3919
  ASSERT_OK(s);
3919
3920
 
3920
3921
  s = txn->GetForUpdate(read_options, "W", &value);
3921
- ASSERT_TRUE(s.IsBusy());
3922
+ ASSERT_TRUE(s.IsLockLimit());
3922
3923
  s = txn->GetForUpdate(read_options, "V", &value);
3923
- ASSERT_TRUE(s.IsBusy());
3924
+ ASSERT_TRUE(s.IsLockLimit());
3924
3925
 
3925
3926
  // re-locking same key shouldn't put us over the limit
3926
3927
  s = txn->GetForUpdate(read_options, "Y", &value);
@@ -3939,7 +3940,7 @@ TEST_P(TransactionTest, LockLimitTest) {
3939
3940
 
3940
3941
  // lock limit reached
3941
3942
  s = txn2->Put("M", "m");
3942
- ASSERT_TRUE(s.IsBusy());
3943
+ ASSERT_TRUE(s.IsLockLimit());
3943
3944
 
3944
3945
  s = txn->Commit();
3945
3946
  ASSERT_OK(s);
@@ -3966,7 +3967,7 @@ TEST_P(TransactionTest, LockLimitTest) {
3966
3967
 
3967
3968
  // lock limit reached
3968
3969
  s = txn2->Delete("Y");
3969
- ASSERT_TRUE(s.IsBusy());
3970
+ ASSERT_TRUE(s.IsLockLimit());
3970
3971
 
3971
3972
  s = txn2->Commit();
3972
3973
  ASSERT_OK(s);
@@ -3986,6 +3987,44 @@ TEST_P(TransactionTest, LockLimitTest) {
3986
3987
  delete txn2;
3987
3988
  }
3988
3989
 
3990
+ TEST_P(TransactionTest, LockLimitWithTimeoutHangTest) {
3991
+ // Tests a bug where transaction can infinite-loop during lock acquiry.
3992
+ // This happens when lock limit is reached and user specifies a positive
3993
+ // timeout which is reached before the transaction start waiting for it.
3994
+ WriteOptions write_options;
3995
+ TransactionOptions txn_options;
3996
+
3997
+ txn_db_options.max_num_locks = 3;
3998
+ txn_db_options.transaction_lock_timeout = 10; // 10ms
3999
+ ASSERT_OK(ReOpen());
4000
+
4001
+ Transaction* txn = db->BeginTransaction(write_options, txn_options);
4002
+ ASSERT_TRUE(txn);
4003
+
4004
+ ASSERT_OK(txn->Put("X", "x"));
4005
+ ASSERT_OK(txn->Put("Y", "y"));
4006
+ ASSERT_OK(txn->Put("Z", "z"));
4007
+
4008
+ TransactionOptions txn2_options;
4009
+ txn2_options.lock_timeout = 1; // 1ms short timeout
4010
+ Transaction* txn2 = db->BeginTransaction(write_options, txn2_options);
4011
+
4012
+ SyncPoint::GetInstance()->SetCallBack(
4013
+ "PointLockManager::AcquireWithTimeout:WaitingTxn", [&](void*) {
4014
+ // Sleep for 2ms, so timeout is already passed for txn2 before waiting.
4015
+ // txn2 should fail instead of waiting forever.
4016
+ env->SleepForMicroseconds(2 * 1000);
4017
+ });
4018
+ SyncPoint::GetInstance()->EnableProcessing();
4019
+
4020
+ // This lock attempt should fail and return
4021
+ ASSERT_TRUE(txn2->Put("W", "w").IsLockLimit());
4022
+ SyncPoint::GetInstance()->DisableProcessing();
4023
+
4024
+ delete txn;
4025
+ delete txn2;
4026
+ }
4027
+
3989
4028
  TEST_P(TransactionTest, IteratorTest) {
3990
4029
  // This test does writes without snapshot validation, and then tries to create
3991
4030
  // iterator later, which is unsupported in write unprepared.
@@ -5651,13 +5690,13 @@ TEST_P(TransactionTest, ToggleAutoCompactionTest) {
5651
5690
  ASSERT_OK(s);
5652
5691
 
5653
5692
  auto cfh_default = static_cast_with_check<ColumnFamilyHandleImpl>(handles[0]);
5654
- auto opt_default = *cfh_default->cfd()->GetLatestMutableCFOptions();
5693
+ auto& opt_default = cfh_default->cfd()->GetLatestMutableCFOptions();
5655
5694
 
5656
5695
  auto cfh_a = static_cast_with_check<ColumnFamilyHandleImpl>(handles[1]);
5657
- auto opt_a = *cfh_a->cfd()->GetLatestMutableCFOptions();
5696
+ auto& opt_a = cfh_a->cfd()->GetLatestMutableCFOptions();
5658
5697
 
5659
5698
  auto cfh_b = static_cast_with_check<ColumnFamilyHandleImpl>(handles[2]);
5660
- auto opt_b = *cfh_b->cfd()->GetLatestMutableCFOptions();
5699
+ auto& opt_b = cfh_b->cfd()->GetLatestMutableCFOptions();
5661
5700
 
5662
5701
  ASSERT_EQ(opt_default.disable_auto_compactions, false);
5663
5702
  ASSERT_EQ(opt_a.disable_auto_compactions, true);
@@ -6291,8 +6330,8 @@ TEST_P(TransactionTest, DuplicateKeys) {
6291
6330
  }
6292
6331
  delete cf_handle;
6293
6332
  } // with_commit_batch
6294
- } // do_rollback
6295
- } // do_prepare
6333
+ } // do_rollback
6334
+ } // do_prepare
6296
6335
 
6297
6336
  if (!options.unordered_write) {
6298
6337
  // Also test with max_successive_merges > 0. max_successive_merges will not
@@ -8008,7 +8047,270 @@ TEST_P(TransactionTest, AttributeGroupIteratorSanityChecks) {
8008
8047
  }
8009
8048
  }
8010
8049
 
8011
- TEST_P(TransactionTest, SecondaryIndex) {
8050
+ TEST_P(TransactionTest, SecondaryIndexPutDelete) {
8051
+ const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
8052
+ if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
8053
+ ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
8054
+ return;
8055
+ }
8056
+
8057
+ txn_db_options.secondary_indices.emplace_back(
8058
+ std::make_shared<SimpleSecondaryIndex>(
8059
+ kDefaultWideColumnName.ToString()));
8060
+
8061
+ ASSERT_OK(ReOpen());
8062
+
8063
+ ColumnFamilyOptions cf1_opts;
8064
+ ColumnFamilyHandle* cfh1 = nullptr;
8065
+ ASSERT_OK(db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
8066
+ std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
8067
+
8068
+ ColumnFamilyOptions cf2_opts;
8069
+ ColumnFamilyHandle* cfh2 = nullptr;
8070
+ ASSERT_OK(db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
8071
+ std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
8072
+
8073
+ auto& index = txn_db_options.secondary_indices.back();
8074
+ index->SetPrimaryColumnFamily(cfh1);
8075
+ index->SetSecondaryColumnFamily(cfh2);
8076
+
8077
+ {
8078
+ std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
8079
+
8080
+ // Default CF => OK but not indexed
8081
+ ASSERT_OK(txn->Put(db->DefaultColumnFamily(), "key0", "foo"));
8082
+
8083
+ // CF1 but no default column => OK but not indexed
8084
+ ASSERT_OK(txn->PutEntity(cfh1, "key1", {{"hello", "world"}}));
8085
+
8086
+ // CF1, "bar" in the default column => OK and indexed
8087
+ ASSERT_OK(txn->Put(cfh1, "key2", "bar"));
8088
+
8089
+ // CF1, "baz" in the default column => OK and indexed
8090
+ ASSERT_OK(txn->Put(cfh1, "key3", "baz"));
8091
+
8092
+ ASSERT_OK(txn->Commit());
8093
+ }
8094
+
8095
+ // Expected keys: "key0" in the default CF; "key1", "key2", "key3" in CF1;
8096
+ // secondary index entries for "key2" and "key3" in CF2
8097
+ {
8098
+ std::unique_ptr<Iterator> it(
8099
+ db->NewIterator(ReadOptions(), db->DefaultColumnFamily()));
8100
+
8101
+ it->SeekToFirst();
8102
+ ASSERT_TRUE(it->Valid());
8103
+ ASSERT_EQ(it->key(), "key0");
8104
+ ASSERT_EQ(it->value(), "foo");
8105
+
8106
+ it->Next();
8107
+ ASSERT_FALSE(it->Valid());
8108
+ ASSERT_OK(it->status());
8109
+ }
8110
+
8111
+ {
8112
+ std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh1));
8113
+
8114
+ it->SeekToFirst();
8115
+ ASSERT_TRUE(it->Valid());
8116
+ ASSERT_EQ(it->key(), "key1");
8117
+ WideColumns expected1{{"hello", "world"}};
8118
+ ASSERT_EQ(it->columns(), expected1);
8119
+
8120
+ it->Next();
8121
+ ASSERT_TRUE(it->Valid());
8122
+ ASSERT_EQ(it->key(), "key2");
8123
+ ASSERT_EQ(it->value(), "bar");
8124
+
8125
+ it->Next();
8126
+ ASSERT_TRUE(it->Valid());
8127
+ ASSERT_EQ(it->key(), "key3");
8128
+ ASSERT_EQ(it->value(), "baz");
8129
+
8130
+ it->Next();
8131
+ ASSERT_FALSE(it->Valid());
8132
+ ASSERT_OK(it->status());
8133
+ }
8134
+
8135
+ {
8136
+ // Read the raw secondary index entries from CF2
8137
+ std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
8138
+
8139
+ it->SeekToFirst();
8140
+ ASSERT_TRUE(it->Valid());
8141
+ ASSERT_EQ(it->key(), "\3barkey2");
8142
+ ASSERT_TRUE(it->value().empty());
8143
+
8144
+ it->Next();
8145
+ ASSERT_TRUE(it->Valid());
8146
+ ASSERT_EQ(it->key(), "\3bazkey3");
8147
+ ASSERT_TRUE(it->value().empty());
8148
+
8149
+ it->Next();
8150
+ ASSERT_FALSE(it->Valid());
8151
+ ASSERT_OK(it->status());
8152
+ }
8153
+
8154
+ {
8155
+ // Query the secondary index
8156
+ std::unique_ptr<Iterator> underlying_it(
8157
+ db->NewIterator(ReadOptions(), cfh2));
8158
+ auto it = std::make_unique<SecondaryIndexIterator>(
8159
+ index.get(), std::move(underlying_it));
8160
+
8161
+ it->Seek("bar");
8162
+ ASSERT_TRUE(it->Valid());
8163
+ ASSERT_OK(it->status());
8164
+ ASSERT_EQ(it->key(), "key2");
8165
+ ASSERT_TRUE(it->value().empty());
8166
+
8167
+ it->Next();
8168
+ ASSERT_FALSE(it->Valid());
8169
+ ASSERT_OK(it->status());
8170
+
8171
+ it->Seek("baz");
8172
+ ASSERT_TRUE(it->Valid());
8173
+ ASSERT_OK(it->status());
8174
+ ASSERT_EQ(it->key(), "key3");
8175
+ ASSERT_TRUE(it->value().empty());
8176
+
8177
+ it->Next();
8178
+ ASSERT_FALSE(it->Valid());
8179
+ ASSERT_OK(it->status());
8180
+ }
8181
+
8182
+ // Make some updates to the key-values indexed above through the database
8183
+ // interface (i.e. using implicit transactions)
8184
+
8185
+ // Add a default column to "key1" which previously had none
8186
+ ASSERT_OK(
8187
+ db->PutEntity(WriteOptions(), cfh1, "key1",
8188
+ {{"hello", "world"}, {kDefaultWideColumnName, "quux"}}));
8189
+
8190
+ // Change the value of the default column in "key2"
8191
+ ASSERT_OK(db->Put(WriteOptions(), cfh1, "key2", "quux"));
8192
+
8193
+ // Remove the default column from "key3"
8194
+ ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key3", {{"1", "2"}}));
8195
+
8196
+ // Expected keys: "key0" in the default CF; "key1", "key2", "key3" in CF1;
8197
+ // secondary index entries for "key1" and "key2" in CF2
8198
+ {
8199
+ std::unique_ptr<Iterator> it(
8200
+ db->NewIterator(ReadOptions(), db->DefaultColumnFamily()));
8201
+
8202
+ it->SeekToFirst();
8203
+ ASSERT_TRUE(it->Valid());
8204
+ ASSERT_EQ(it->key(), "key0");
8205
+ ASSERT_EQ(it->value(), "foo");
8206
+
8207
+ it->Next();
8208
+ ASSERT_FALSE(it->Valid());
8209
+ ASSERT_OK(it->status());
8210
+ }
8211
+
8212
+ {
8213
+ std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh1));
8214
+
8215
+ it->SeekToFirst();
8216
+ ASSERT_TRUE(it->Valid());
8217
+ ASSERT_EQ(it->key(), "key1");
8218
+ WideColumns expected1{{kDefaultWideColumnName, "quux"}, {"hello", "world"}};
8219
+ ASSERT_EQ(it->columns(), expected1);
8220
+
8221
+ it->Next();
8222
+ ASSERT_TRUE(it->Valid());
8223
+ ASSERT_EQ(it->key(), "key2");
8224
+ ASSERT_EQ(it->value(), "quux");
8225
+
8226
+ it->Next();
8227
+ ASSERT_TRUE(it->Valid());
8228
+ ASSERT_EQ(it->key(), "key3");
8229
+ WideColumns expected3{{"1", "2"}};
8230
+ ASSERT_EQ(it->columns(), expected3);
8231
+
8232
+ it->Next();
8233
+ ASSERT_FALSE(it->Valid());
8234
+ ASSERT_OK(it->status());
8235
+ }
8236
+
8237
+ {
8238
+ // Read the raw secondary index entries from CF2
8239
+ std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
8240
+
8241
+ it->SeekToFirst();
8242
+ ASSERT_TRUE(it->Valid());
8243
+ ASSERT_EQ(it->key(), "\4quuxkey1");
8244
+ ASSERT_TRUE(it->value().empty());
8245
+
8246
+ it->Next();
8247
+ ASSERT_TRUE(it->Valid());
8248
+ ASSERT_EQ(it->key(), "\4quuxkey2");
8249
+ ASSERT_TRUE(it->value().empty());
8250
+
8251
+ it->Next();
8252
+ ASSERT_FALSE(it->Valid());
8253
+ ASSERT_OK(it->status());
8254
+ }
8255
+
8256
+ {
8257
+ // Query the secondary index
8258
+ std::unique_ptr<Iterator> underlying_it(
8259
+ db->NewIterator(ReadOptions(), cfh2));
8260
+ auto it = std::make_unique<SecondaryIndexIterator>(
8261
+ index.get(), std::move(underlying_it));
8262
+
8263
+ it->Seek("quux");
8264
+ ASSERT_TRUE(it->Valid());
8265
+ ASSERT_OK(it->status());
8266
+ ASSERT_EQ(it->key(), "key1");
8267
+ ASSERT_TRUE(it->value().empty());
8268
+
8269
+ it->Next();
8270
+ ASSERT_TRUE(it->Valid());
8271
+ ASSERT_OK(it->status());
8272
+ ASSERT_EQ(it->key(), "key2");
8273
+ ASSERT_TRUE(it->value().empty());
8274
+
8275
+ it->Next();
8276
+ ASSERT_FALSE(it->Valid());
8277
+ ASSERT_OK(it->status());
8278
+ }
8279
+
8280
+ // Delete/SingleDelete "key1" and "key3" via an explicit transaction and
8281
+ // "key2" and a non-existing "key4" via the DB interface (i.e. an implicit
8282
+ // transaction)
8283
+ {
8284
+ std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
8285
+
8286
+ ASSERT_OK(txn->Delete(cfh1, "key1"));
8287
+ ASSERT_OK(txn->SingleDelete(cfh1, "key3"));
8288
+
8289
+ ASSERT_OK(txn->Commit());
8290
+ }
8291
+
8292
+ ASSERT_OK(db->SingleDelete(WriteOptions(), cfh1, "key2"));
8293
+ ASSERT_OK(db->Delete(WriteOptions(), cfh1, "key4"));
8294
+
8295
+ // cfh1 and cfh2 are expected to be empty
8296
+ {
8297
+ std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh1));
8298
+
8299
+ it->SeekToFirst();
8300
+ ASSERT_FALSE(it->Valid());
8301
+ ASSERT_OK(it->status());
8302
+ }
8303
+
8304
+ {
8305
+ std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
8306
+
8307
+ it->SeekToFirst();
8308
+ ASSERT_FALSE(it->Valid());
8309
+ ASSERT_OK(it->status());
8310
+ }
8311
+ }
8312
+
8313
+ TEST_P(TransactionTest, SecondaryIndexPutEntity) {
8012
8314
  const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
8013
8315
  if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
8014
8316
  ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
@@ -8068,6 +8370,15 @@ TEST_P(TransactionTest, SecondaryIndex) {
8068
8370
  return Status::OK();
8069
8371
  }
8070
8372
 
8373
+ Status FinalizeSecondaryKeyPrefix(
8374
+ std::variant<Slice, std::string>* secondary_key_prefix) const override {
8375
+ if (SecondaryIndexHelper::AsSlice(*secondary_key_prefix) == "!") {
8376
+ return Status::Corruption();
8377
+ }
8378
+
8379
+ return Status::OK();
8380
+ }
8381
+
8071
8382
  Status GetSecondaryValue(const Slice& /* primary_key */,
8072
8383
  const Slice& primary_column_value,
8073
8384
  const Slice& previous_column_value,
@@ -8131,9 +8442,12 @@ TEST_P(TransactionTest, SecondaryIndex) {
8131
8442
  // CF1, empty value in the "foo" column => GetSecondaryKeyPrefix errors out
8132
8443
  ASSERT_TRUE(txn->PutEntity(cfh1, "key5", {{"foo", ""}}).IsNotFound());
8133
8444
 
8445
+ // CF1, "!!!" in the "foo" column => FinalizeSecondaryKeyPrefix errors out
8446
+ ASSERT_TRUE(txn->PutEntity(cfh1, "key6", {{"foo", "!!!"}}).IsCorruption());
8447
+
8134
8448
  // CF1, "corge" in the "foo" column => GetSecondaryValue errors out
8135
8449
  ASSERT_TRUE(
8136
- txn->PutEntity(cfh1, "key6", {{"foo", "corge"}}).IsNotSupported());
8450
+ txn->PutEntity(cfh1, "key7", {{"foo", "corge"}}).IsNotSupported());
8137
8451
 
8138
8452
  ASSERT_OK(txn->Commit());
8139
8453
  }
@@ -8182,6 +8496,7 @@ TEST_P(TransactionTest, SecondaryIndex) {
8182
8496
  }
8183
8497
 
8184
8498
  {
8499
+ // Read the raw secondary index entries from CF2
8185
8500
  std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
8186
8501
 
8187
8502
  it->SeekToFirst();
@@ -8199,34 +8514,74 @@ TEST_P(TransactionTest, SecondaryIndex) {
8199
8514
  ASSERT_OK(it->status());
8200
8515
  }
8201
8516
 
8202
- // Make some updates to the key-values indexed above through the database
8203
- // interface (i.e. using implicit transactions)
8204
-
8205
- // Add a "foo" column to "key1" which previously had none
8206
- ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key1",
8207
- {{"hello", "world"}, {"foo", "grault"}}));
8208
-
8209
- // Change the value of the "foo" column in "key3"
8210
- ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key3",
8211
- {{"foo", "garply"}, {"x", "y"}}));
8212
-
8213
- // Remove the "foo" column from "key4"
8214
- ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key4", {{"1", "2"}}));
8215
-
8216
- // Expected keys: "key0" in the default CF; "key1", "key3", "key4" in CF1;
8217
- // secondary index entries for "key1" and "key3" in CF2
8218
8517
  {
8219
- std::unique_ptr<Iterator> it(
8220
- db->NewIterator(ReadOptions(), db->DefaultColumnFamily()));
8518
+ // Query the secondary index
8519
+ std::unique_ptr<Iterator> underlying_it(
8520
+ db->NewIterator(ReadOptions(), cfh2));
8521
+ auto it = std::make_unique<SecondaryIndexIterator>(
8522
+ index.get(), std::move(underlying_it));
8221
8523
 
8222
- it->SeekToFirst();
8524
+ it->Seek("x");
8223
8525
  ASSERT_TRUE(it->Valid());
8224
- ASSERT_EQ(it->key(), "key0");
8225
- WideColumns expected0{{"a", "b"}, {"foo", "c"}};
8226
- ASSERT_EQ(it->columns(), expected0);
8526
+ ASSERT_OK(it->status());
8527
+ ASSERT_EQ(it->key(), "key3");
8528
+ ASSERT_EQ(it->value(), "zab");
8227
8529
 
8228
8530
  it->Next();
8229
- ASSERT_FALSE(it->Valid());
8531
+ ASSERT_TRUE(it->Valid());
8532
+ ASSERT_OK(it->status());
8533
+ ASSERT_EQ(it->key(), "key4");
8534
+ ASSERT_EQ(it->value(), "xuuq");
8535
+
8536
+ it->Prev();
8537
+ ASSERT_TRUE(it->Valid());
8538
+ ASSERT_OK(it->status());
8539
+ ASSERT_EQ(it->key(), "key3");
8540
+ ASSERT_EQ(it->value(), "zab");
8541
+
8542
+ it->Next();
8543
+ ASSERT_TRUE(it->Valid());
8544
+ ASSERT_OK(it->status());
8545
+ ASSERT_EQ(it->key(), "key4");
8546
+ ASSERT_EQ(it->value(), "xuuq");
8547
+
8548
+ it->Next();
8549
+ ASSERT_FALSE(it->Valid());
8550
+ ASSERT_OK(it->status());
8551
+
8552
+ it->Seek("y");
8553
+ ASSERT_FALSE(it->Valid());
8554
+ ASSERT_OK(it->status());
8555
+ }
8556
+
8557
+ // Make some updates to the key-values indexed above through the database
8558
+ // interface (i.e. using implicit transactions)
8559
+
8560
+ // Add a "foo" column to "key1" which previously had none
8561
+ ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key1",
8562
+ {{"hello", "world"}, {"foo", "grault"}}));
8563
+
8564
+ // Change the value of the "foo" column in "key3"
8565
+ ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key3",
8566
+ {{"foo", "garply"}, {"x", "y"}}));
8567
+
8568
+ // Remove the "foo" column from "key4"
8569
+ ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key4", {{"1", "2"}}));
8570
+
8571
+ // Expected keys: "key0" in the default CF; "key1", "key3", "key4" in CF1;
8572
+ // secondary index entries for "key1" and "key3" in CF2
8573
+ {
8574
+ std::unique_ptr<Iterator> it(
8575
+ db->NewIterator(ReadOptions(), db->DefaultColumnFamily()));
8576
+
8577
+ it->SeekToFirst();
8578
+ ASSERT_TRUE(it->Valid());
8579
+ ASSERT_EQ(it->key(), "key0");
8580
+ WideColumns expected0{{"a", "b"}, {"foo", "c"}};
8581
+ ASSERT_EQ(it->columns(), expected0);
8582
+
8583
+ it->Next();
8584
+ ASSERT_FALSE(it->Valid());
8230
8585
  ASSERT_OK(it->status());
8231
8586
  }
8232
8587
 
@@ -8257,6 +8612,7 @@ TEST_P(TransactionTest, SecondaryIndex) {
8257
8612
  }
8258
8613
 
8259
8614
  {
8615
+ // Read the raw secondary index entries from CF2
8260
8616
  std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
8261
8617
 
8262
8618
  it->SeekToFirst();
@@ -8273,6 +8629,227 @@ TEST_P(TransactionTest, SecondaryIndex) {
8273
8629
  ASSERT_FALSE(it->Valid());
8274
8630
  ASSERT_OK(it->status());
8275
8631
  }
8632
+
8633
+ {
8634
+ // Query the secondary index
8635
+ std::unique_ptr<Iterator> underlying_it(
8636
+ db->NewIterator(ReadOptions(), cfh2));
8637
+ auto it = std::make_unique<SecondaryIndexIterator>(
8638
+ index.get(), std::move(underlying_it));
8639
+
8640
+ it->Seek("t");
8641
+ ASSERT_TRUE(it->Valid());
8642
+ ASSERT_OK(it->status());
8643
+ ASSERT_EQ(it->key(), "key1");
8644
+ ASSERT_EQ(it->value(), "tluarg");
8645
+
8646
+ it->Next();
8647
+ ASSERT_FALSE(it->Valid());
8648
+ ASSERT_OK(it->status());
8649
+
8650
+ it->Seek("y");
8651
+ ASSERT_TRUE(it->Valid());
8652
+ ASSERT_OK(it->status());
8653
+ ASSERT_EQ(it->key(), "key3");
8654
+ ASSERT_EQ(it->value(), "ylprag");
8655
+
8656
+ it->Next();
8657
+ ASSERT_FALSE(it->Valid());
8658
+ ASSERT_OK(it->status());
8659
+ }
8660
+ }
8661
+
8662
+ TEST_P(TransactionTest, SecondaryIndexOnKey) {
8663
+ const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
8664
+ if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
8665
+ ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
8666
+ return;
8667
+ }
8668
+
8669
+ // A secondary index that removes the first three characters of the primary
8670
+ // key and indexes the rest.
8671
+ class KeySecondaryIndex : public SecondaryIndex {
8672
+ public:
8673
+ void SetPrimaryColumnFamily(ColumnFamilyHandle* cfh) override {
8674
+ primary_cfh_ = cfh;
8675
+ }
8676
+
8677
+ void SetSecondaryColumnFamily(ColumnFamilyHandle* cfh) override {
8678
+ secondary_cfh_ = cfh;
8679
+ }
8680
+
8681
+ ColumnFamilyHandle* GetPrimaryColumnFamily() const override {
8682
+ return primary_cfh_;
8683
+ }
8684
+
8685
+ ColumnFamilyHandle* GetSecondaryColumnFamily() const override {
8686
+ return secondary_cfh_;
8687
+ }
8688
+
8689
+ Slice GetPrimaryColumnName() const override {
8690
+ return kDefaultWideColumnName;
8691
+ }
8692
+
8693
+ Status UpdatePrimaryColumnValue(
8694
+ const Slice& /* primary_key */, const Slice& /* primary_column_value */,
8695
+ std::optional<
8696
+ std::variant<Slice, std::string>>* /* updated_column_value */)
8697
+ const override {
8698
+ return Status::OK();
8699
+ }
8700
+
8701
+ Status GetSecondaryKeyPrefix(
8702
+ const Slice& primary_key, const Slice& /* primary_column_value */,
8703
+ std::variant<Slice, std::string>* secondary_key_prefix) const override {
8704
+ assert(secondary_key_prefix);
8705
+
8706
+ constexpr size_t prefix_len = 3;
8707
+
8708
+ if (primary_key.size() < prefix_len) {
8709
+ return Status::InvalidArgument();
8710
+ }
8711
+
8712
+ Slice transformed_key = primary_key;
8713
+ transformed_key.remove_prefix(prefix_len);
8714
+
8715
+ *secondary_key_prefix = transformed_key;
8716
+
8717
+ return Status::OK();
8718
+ }
8719
+
8720
+ Status FinalizeSecondaryKeyPrefix(
8721
+ std::variant<Slice, std::string>* /* secondary_key_prefix */)
8722
+ const override {
8723
+ return Status::OK();
8724
+ }
8725
+
8726
+ Status GetSecondaryValue(const Slice& primary_key,
8727
+ const Slice& /* primary_column_value */,
8728
+ const Slice& /* previous_column_value */,
8729
+ std::optional<std::variant<Slice, std::string>>*
8730
+ secondary_value) const override {
8731
+ assert(secondary_value);
8732
+
8733
+ std::string index_value = primary_key.ToString();
8734
+ std::reverse(index_value.begin(), index_value.end());
8735
+
8736
+ *secondary_value = std::move(index_value);
8737
+
8738
+ return Status::OK();
8739
+ }
8740
+
8741
+ private:
8742
+ ColumnFamilyHandle* primary_cfh_{};
8743
+ ColumnFamilyHandle* secondary_cfh_{};
8744
+ };
8745
+
8746
+ txn_db_options.secondary_indices.emplace_back(
8747
+ std::make_shared<KeySecondaryIndex>());
8748
+
8749
+ ASSERT_OK(ReOpen());
8750
+
8751
+ ColumnFamilyOptions cf1_opts;
8752
+ ColumnFamilyHandle* cfh1 = nullptr;
8753
+ ASSERT_OK(db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
8754
+ std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
8755
+
8756
+ ColumnFamilyOptions cf2_opts;
8757
+ ColumnFamilyHandle* cfh2 = nullptr;
8758
+ ASSERT_OK(db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
8759
+ std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
8760
+
8761
+ auto& index = txn_db_options.secondary_indices.back();
8762
+ index->SetPrimaryColumnFamily(cfh1);
8763
+ index->SetSecondaryColumnFamily(cfh2);
8764
+
8765
+ {
8766
+ std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
8767
+
8768
+ ASSERT_OK(txn->Put(cfh1, "123foo", "a"));
8769
+ ASSERT_OK(txn->Put(cfh1, "123bar", "b"));
8770
+ ASSERT_OK(txn->Put(cfh1, "123baz", "c"));
8771
+ ASSERT_OK(txn->Put(cfh1, "456foo", "d"));
8772
+ ASSERT_OK(txn->Put(cfh1, "456bar", "e"));
8773
+ ASSERT_OK(txn->Put(cfh1, "456baz", "f"));
8774
+ ASSERT_OK(txn->Put(cfh1, "789foo", "g"));
8775
+ ASSERT_OK(txn->Put(cfh1, "789bar", "h"));
8776
+ ASSERT_OK(txn->Put(cfh1, "789baz", "i"));
8777
+
8778
+ ASSERT_OK(txn->Commit());
8779
+ }
8780
+
8781
+ {
8782
+ std::unique_ptr<Iterator> underlying_it(
8783
+ db->NewIterator(ReadOptions(), cfh2));
8784
+ auto it = std::make_unique<SecondaryIndexIterator>(
8785
+ index.get(), std::move(underlying_it));
8786
+
8787
+ it->Seek("foo");
8788
+ ASSERT_TRUE(it->Valid());
8789
+ ASSERT_OK(it->status());
8790
+ ASSERT_EQ(it->key(), "123foo");
8791
+ ASSERT_EQ(it->value(), "oof321");
8792
+
8793
+ it->Next();
8794
+ ASSERT_TRUE(it->Valid());
8795
+ ASSERT_OK(it->status());
8796
+ ASSERT_EQ(it->key(), "456foo");
8797
+ ASSERT_EQ(it->value(), "oof654");
8798
+
8799
+ it->Next();
8800
+ ASSERT_TRUE(it->Valid());
8801
+ ASSERT_OK(it->status());
8802
+ ASSERT_EQ(it->key(), "789foo");
8803
+ ASSERT_EQ(it->value(), "oof987");
8804
+
8805
+ it->Next();
8806
+ ASSERT_FALSE(it->Valid());
8807
+ ASSERT_OK(it->status());
8808
+
8809
+ it->Seek("bar");
8810
+ ASSERT_TRUE(it->Valid());
8811
+ ASSERT_OK(it->status());
8812
+ ASSERT_EQ(it->key(), "123bar");
8813
+ ASSERT_EQ(it->value(), "rab321");
8814
+
8815
+ it->Next();
8816
+ ASSERT_TRUE(it->Valid());
8817
+ ASSERT_OK(it->status());
8818
+ ASSERT_EQ(it->key(), "456bar");
8819
+ ASSERT_EQ(it->value(), "rab654");
8820
+
8821
+ it->Next();
8822
+ ASSERT_TRUE(it->Valid());
8823
+ ASSERT_OK(it->status());
8824
+ ASSERT_EQ(it->key(), "789bar");
8825
+ ASSERT_EQ(it->value(), "rab987");
8826
+
8827
+ it->Next();
8828
+ ASSERT_FALSE(it->Valid());
8829
+ ASSERT_OK(it->status());
8830
+
8831
+ it->Seek("baz");
8832
+ ASSERT_TRUE(it->Valid());
8833
+ ASSERT_OK(it->status());
8834
+ ASSERT_EQ(it->key(), "123baz");
8835
+ ASSERT_EQ(it->value(), "zab321");
8836
+
8837
+ it->Next();
8838
+ ASSERT_TRUE(it->Valid());
8839
+ ASSERT_OK(it->status());
8840
+ ASSERT_EQ(it->key(), "456baz");
8841
+ ASSERT_EQ(it->value(), "zab654");
8842
+
8843
+ it->Next();
8844
+ ASSERT_TRUE(it->Valid());
8845
+ ASSERT_OK(it->status());
8846
+ ASSERT_EQ(it->key(), "789baz");
8847
+ ASSERT_EQ(it->value(), "zab987");
8848
+
8849
+ it->Next();
8850
+ ASSERT_FALSE(it->Valid());
8851
+ ASSERT_OK(it->status());
8852
+ }
8276
8853
  }
8277
8854
 
8278
8855
  TEST_F(TransactionDBTest, CollapseKey) {
@@ -8381,13 +8958,15 @@ class CommitBypassMemtableTest : public DBTestBase,
8381
8958
  Options options;
8382
8959
  TransactionDBOptions txn_db_opts;
8383
8960
 
8384
- void SetUpTransactionDB() {
8961
+ void SetUpTransactionDB(
8962
+ bool atomic_flush = false) {
8385
8963
  options = CurrentOptions();
8386
8964
  options.create_if_missing = true;
8387
8965
  options.allow_2pc = true;
8388
8966
  options.two_write_queues = GetParam();
8389
8967
  // Avoid write stall
8390
8968
  options.max_write_buffer_number = 8;
8969
+ options.atomic_flush = atomic_flush;
8391
8970
  // Destroy the DB to recreate as a TransactionDB.
8392
8971
  Close();
8393
8972
  Destroy(options, true);
@@ -8848,6 +9427,508 @@ TEST_P(CommitBypassMemtableTest, Recovery) {
8848
9427
  VerifyDBFromMap(expected);
8849
9428
  }
8850
9429
 
9430
+ TEST_P(CommitBypassMemtableTest, OptimizeLargeTxnCommitThreshold) {
9431
+ // Tests TransactionOptions::large_txn_commit_optimize_threshold
9432
+ const uint32_t threshold = 10;
9433
+ SetUpTransactionDB();
9434
+ bool commit_bypass_memtable = false;
9435
+ // TODO: add and use stats for this
9436
+ SyncPoint::GetInstance()->SetCallBack(
9437
+ "WriteCommittedTxn::CommitInternal:bypass_memtable",
9438
+ [&](void* arg) { commit_bypass_memtable = *(static_cast<bool*>(arg)); });
9439
+ SyncPoint::GetInstance()->EnableProcessing();
9440
+
9441
+ WriteOptions wopts;
9442
+ // Test default (disabled)
9443
+ TransactionOptions txn_opts;
9444
+ auto txn1 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
9445
+ ASSERT_OK(txn1->SetName("xid0"));
9446
+ for (int i = 0; i < 100; ++i) {
9447
+ ASSERT_OK(
9448
+ txn1->Put("key" + std::to_string(i), "value" + std::to_string(i)));
9449
+ }
9450
+ ASSERT_OK(txn1->Prepare());
9451
+ ASSERT_OK(txn1->Commit());
9452
+ ASSERT_FALSE(commit_bypass_memtable);
9453
+ delete txn1;
9454
+
9455
+ // Test with transaction option only
9456
+ txn_opts.large_txn_commit_optimize_threshold = threshold;
9457
+
9458
+ // Test with transaction below threshold
9459
+ txn1 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
9460
+ ASSERT_OK(txn1->SetName("xid1"));
9461
+ ASSERT_OK(txn1->Put("k1", "v1"));
9462
+ ASSERT_OK(txn1->Prepare());
9463
+ ASSERT_OK(txn1->Commit());
9464
+ ASSERT_FALSE(commit_bypass_memtable);
9465
+ delete txn1;
9466
+
9467
+ // Test with transaction at threshold
9468
+ txn1 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
9469
+ ASSERT_OK(txn1->SetName("xid2"));
9470
+ for (uint32_t i = 0; i < threshold; ++i) {
9471
+ ASSERT_OK(
9472
+ txn1->Put("key" + std::to_string(i), "value" + std::to_string(i)));
9473
+ }
9474
+ ASSERT_OK(txn1->Prepare());
9475
+ ASSERT_OK(txn1->Commit());
9476
+ ASSERT_TRUE(commit_bypass_memtable);
9477
+ delete txn1;
9478
+
9479
+ SetUpTransactionDB();
9480
+ // Test with multiple column families
9481
+ std::vector<std::string> cfs = {"pk", "sk"};
9482
+ CreateColumnFamilies(cfs, options);
9483
+
9484
+ txn_opts.large_txn_commit_optimize_threshold = threshold;
9485
+
9486
+ // Below threshold
9487
+ auto txn_cf = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
9488
+ ASSERT_OK(txn_cf->SetName("xid_cf_below"));
9489
+ for (uint32_t i = 0; i < threshold - 1; ++i) {
9490
+ ASSERT_OK(txn_cf->Put(handles_[i % 2], "key" + std::to_string(i),
9491
+ "value" + std::to_string(i)));
9492
+ }
9493
+ ASSERT_OK(txn_cf->Prepare());
9494
+ commit_bypass_memtable = false;
9495
+ ASSERT_OK(txn_cf->Commit());
9496
+ ASSERT_FALSE(commit_bypass_memtable);
9497
+ delete txn_cf;
9498
+
9499
+ // At threshold
9500
+ txn_cf = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
9501
+ ASSERT_OK(txn_cf->SetName("xid_cf_at_threshold"));
9502
+ for (uint32_t i = 0; i < threshold; ++i) {
9503
+ ASSERT_OK(txn_cf->Put(handles_[i % 2], "key" + std::to_string(i),
9504
+ "value" + std::to_string(i)));
9505
+ }
9506
+ ASSERT_OK(txn_cf->Prepare());
9507
+ commit_bypass_memtable = false;
9508
+ ASSERT_OK(txn_cf->Commit());
9509
+ ASSERT_TRUE(commit_bypass_memtable);
9510
+ delete txn_cf;
9511
+
9512
+ // Test that commit_bypass_memtable takes precedence over
9513
+ // large_txn_commit_optimize_threshold
9514
+ txn_opts.large_txn_commit_optimize_threshold =
9515
+ threshold * 10; // High threshold
9516
+ txn_opts.commit_bypass_memtable = true; // Should override threshold
9517
+
9518
+ txn_cf = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
9519
+ ASSERT_OK(txn_cf->SetName("xid_cf_precedence"));
9520
+ ASSERT_OK(txn_cf->Put(handles_[0], "key1", "value1")); // Just one operation
9521
+ ASSERT_OK(txn_cf->Prepare());
9522
+ commit_bypass_memtable = false;
9523
+ ASSERT_OK(txn_cf->Commit());
9524
+ ASSERT_TRUE(commit_bypass_memtable); // Should be true because of
9525
+ // commit_bypass_memtable
9526
+ delete txn_cf;
9527
+ }
9528
+
9529
+ TEST_P(CommitBypassMemtableTest, AtomicFlushTest) {
9530
+ const uint32_t threshold = 10;
9531
+ SetUpTransactionDB(/*atomic_flush=*/true);
9532
+ SyncPoint::GetInstance()->EnableProcessing();
9533
+
9534
+ std::vector<std::string> cfs = {"cf0", "cf1", "cf2"};
9535
+ CreateColumnFamilies(cfs, options);
9536
+
9537
+ // Seed data in CF1 and 2 as atomic flush picks CFs with non-empty memtable
9538
+ ASSERT_OK(db_->Put({}, handles_[1], "key1", "val1"));
9539
+ ASSERT_OK(db_->Put({}, handles_[2], "key2", "val2"));
9540
+
9541
+ // Write to cf 0, should see cf1 and cf2 flushed too
9542
+ TransactionOptions txn_opts;
9543
+ txn_opts.large_txn_commit_optimize_threshold = threshold;
9544
+ auto txn = txn_db->BeginTransaction({}, txn_opts, nullptr);
9545
+ for (uint32_t i = 0; i <= threshold; ++i) {
9546
+ ASSERT_OK(txn->Put(handles_[0], "key" + std::to_string(i),
9547
+ "cf0" + std::to_string(i)));
9548
+ }
9549
+ ASSERT_OK(txn->SetName("cf0"));
9550
+ ASSERT_OK(txn->Prepare());
9551
+ ASSERT_OK(txn->Commit());
9552
+ delete txn;
9553
+
9554
+ ASSERT_OK(db_->WaitForCompact({}));
9555
+ for (size_t i = 0; i < 3; ++i) {
9556
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
9557
+ ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
9558
+ ASSERT_TRUE(cfh->cfd()->mem()->IsEmpty());
9559
+ }
9560
+ }
9561
+
9562
+ TEST_P(CommitBypassMemtableTest, MergeAndMultiCF) {
9563
+ // disable_flush allows testing Get path with memtables.
9564
+ for (bool disable_flush : {false, true}) {
9565
+ SCOPED_TRACE("disable_flush: " + std::to_string(disable_flush));
9566
+ SetUpTransactionDB();
9567
+ if (disable_flush) {
9568
+ ASSERT_OK(txn_db->PauseBackgroundWork());
9569
+ }
9570
+
9571
+ std::vector<std::string> cfs = {"appendmerge"};
9572
+ Options opts;
9573
+ opts.max_write_buffer_number = 8;
9574
+ opts.merge_operator = MergeOperators::CreateFromStringId("stringappend");
9575
+ CreateColumnFamilies(cfs, opts);
9576
+
9577
+ cfs = {"uint64addmerge"};
9578
+ opts.merge_operator = MergeOperators::CreateFromStringId("uint64add");
9579
+ CreateColumnFamilies(cfs, opts);
9580
+
9581
+ cfs = {"data"};
9582
+ opts.merge_operator = nullptr;
9583
+ CreateColumnFamilies(cfs, opts);
9584
+ ASSERT_TRUE(handles_.size() == 3);
9585
+
9586
+ std::string buf_count;
9587
+ PutFixed64(&buf_count, 1);
9588
+ // Some base data in SST or memtable
9589
+ ASSERT_OK(db_->Merge({}, handles_[1], "count", buf_count));
9590
+ ASSERT_OK(db_->Put({}, handles_[0], "k5", "5v1"));
9591
+ ASSERT_OK(db_->Merge({}, handles_[0], "k7", "7v1"));
9592
+ if (!disable_flush) {
9593
+ ASSERT_OK(db_->Flush({}, handles_[1]));
9594
+ }
9595
+
9596
+ WriteOptions wopts;
9597
+ TransactionOptions txn_opts;
9598
+ txn_opts.commit_bypass_memtable = true;
9599
+ Transaction* txn = txn_db->BeginTransaction(wopts, txn_opts);
9600
+ ASSERT_OK(txn->SetName("xid1"));
9601
+ ASSERT_OK(txn->Put(handles_[0], "k1", "v1"));
9602
+ ASSERT_OK(txn->Merge(handles_[0], "k1", "v2"));
9603
+
9604
+ ASSERT_OK(txn->Delete(handles_[0], "k2"));
9605
+ ASSERT_OK(txn->Merge(handles_[0], "k2", "v1"));
9606
+
9607
+ ASSERT_OK(txn->Merge(handles_[0], "k3", "v1"));
9608
+ ASSERT_OK(txn->Delete(handles_[0], "k3"));
9609
+
9610
+ ASSERT_OK(txn->Merge(handles_[0], "k4", "v1"));
9611
+ ASSERT_OK(txn->Put(handles_[0], "k4", "v4"));
9612
+
9613
+ ASSERT_OK(txn->Merge(handles_[0], "k5", "5v2"));
9614
+
9615
+ ASSERT_OK(txn->Merge(handles_[0], "k6", "6v1"));
9616
+ ASSERT_OK(txn->Merge(handles_[0], "k6", "6v2"));
9617
+
9618
+ ASSERT_OK(txn->Merge(handles_[0], "k7", "7v2"));
9619
+ ASSERT_OK(txn->Merge(handles_[0], "k7", "7v3"));
9620
+
9621
+ ASSERT_OK(txn->Merge(handles_[1], "count", buf_count));
9622
+ ASSERT_OK(txn->Merge(handles_[1], "count", buf_count));
9623
+
9624
+ ASSERT_OK(txn->Put(handles_[2], "a", "a1"));
9625
+ ASSERT_OK(txn->Put(handles_[2], "c", "c1"));
9626
+
9627
+ ASSERT_OK(txn->Prepare());
9628
+ ASSERT_OK(txn->Commit());
9629
+
9630
+ // Data in mutable memtable
9631
+ txn_opts.commit_bypass_memtable = false;
9632
+ txn = txn_db->BeginTransaction(wopts, txn_opts, txn);
9633
+ ASSERT_OK(txn->SetName("xid2"));
9634
+ ASSERT_OK(txn->Merge(handles_[0], "k1", "v3"));
9635
+ ASSERT_OK(txn->Merge(handles_[1], "count", buf_count));
9636
+ ASSERT_OK(txn->Prepare());
9637
+ ASSERT_OK(txn->Commit());
9638
+ delete txn;
9639
+
9640
+ std::map<std::string, std::string> expected_cf0 = {
9641
+ {"k1", "v1,v2,v3"}, {"k2", "v1"}, {"k4", "v4"},
9642
+ {"k5", "5v1,5v2"}, {"k6", "6v1,6v2"}, {"k7", "7v1,7v2,7v3"},
9643
+ };
9644
+ std::unordered_set<std::string> not_found_cf0 = {"k3"};
9645
+ VerifyDBFromMap(expected_cf0, nullptr, false, nullptr, handles_[0],
9646
+ &not_found_cf0);
9647
+
9648
+ std::string count;
9649
+ PutFixed64(&count, 4);
9650
+ std::map<std::string, std::string> expected_cf1 = {
9651
+ {"count", count},
9652
+ };
9653
+ VerifyDBFromMap(expected_cf1, nullptr, false, nullptr, handles_[1]);
9654
+
9655
+ std::map<std::string, std::string> expected_cf2 = {
9656
+ {"a", "a1"},
9657
+ {"c", "c1"},
9658
+ };
9659
+ VerifyDBFromMap(expected_cf2, nullptr, false, nullptr, handles_[2]);
9660
+
9661
+ // Verify all data is flushed
9662
+ if (disable_flush) {
9663
+ uint64_t num_imm_mems = 0;
9664
+ ASSERT_TRUE(txn_db->GetIntProperty(
9665
+ handles_[0], DB::Properties::kNumImmutableMemTable, &num_imm_mems));
9666
+ ASSERT_EQ(2,
9667
+ num_imm_mems); // 1 imm mem before WBWI, 1 imm is WBWI itself
9668
+
9669
+ // Test GetMergeOperands() for CF0
9670
+ std::vector<PinnableSlice> merge_operands(4);
9671
+ GetMergeOperandsOptions merge_operand_opts;
9672
+ merge_operand_opts.expected_max_number_of_operands = 4;
9673
+ int num_operands = 0;
9674
+ ASSERT_OK(db_->GetMergeOperands({}, handles_[0], "k1",
9675
+ merge_operands.data(),
9676
+ &merge_operand_opts, &num_operands));
9677
+ ASSERT_EQ(num_operands, 3);
9678
+ ASSERT_EQ(merge_operands[0], "v1");
9679
+ ASSERT_EQ(merge_operands[1], "v2");
9680
+ ASSERT_EQ(merge_operands[2], "v3");
9681
+
9682
+ ASSERT_OK(db_->ContinueBackgroundWork());
9683
+ ASSERT_OK(db_->Flush({}, {handles_[0], handles_[1], handles_[2]}));
9684
+ } else {
9685
+ ASSERT_OK(db_->WaitForCompact({}));
9686
+ }
9687
+
9688
+ VerifyDBFromMap(expected_cf0, nullptr, false, nullptr, handles_[0],
9689
+ &not_found_cf0);
9690
+ VerifyDBFromMap(expected_cf1, nullptr, false, nullptr, handles_[1]);
9691
+ VerifyDBFromMap(expected_cf2, nullptr, false, nullptr, handles_[2]);
9692
+ }
9693
+ }
9694
+
9695
+ TEST_P(CommitBypassMemtableTest, MergeMiniStress) {
9696
+ // To test the merge path with various LSM shapes
9697
+ std::string key_prefix = "key";
9698
+ std::string value_prefix = "val";
9699
+ Random* rnd = Random::GetTLSInstance();
9700
+ const int kBatchSize = 50;
9701
+ for (int num_memtable_to_merge : {1, 4}) {
9702
+ SetUpTransactionDB();
9703
+ std::vector<std::string> cfs = {"appendmerge"};
9704
+ Options opts;
9705
+ opts.max_write_buffer_number = 10;
9706
+ // Exercise read path of memtables.
9707
+ opts.min_write_buffer_number_to_merge = num_memtable_to_merge;
9708
+ opts.merge_operator = MergeOperators::CreateFromStringId("stringappend");
9709
+ CreateColumnFamilies(cfs, opts);
9710
+ ASSERT_TRUE(handles_.size() == 1);
9711
+
9712
+ std::map<std::string, std::string> expected_cf;
9713
+ std::unordered_set<std::string> not_found_cf;
9714
+ for (int i = 0; i < 10000; i += kBatchSize) {
9715
+ WriteOptions wopts;
9716
+ TransactionOptions txn_opts;
9717
+ txn_opts.commit_bypass_memtable = rnd->OneIn(2);
9718
+ std::unique_ptr<Transaction> txn{
9719
+ txn_db->BeginTransaction(wopts, txn_opts)};
9720
+ const int txn_count = i / kBatchSize;
9721
+ ASSERT_OK(txn->SetName("xid" + std::to_string(txn_count)));
9722
+
9723
+ const Snapshot* snapshot = txn_db->GetSnapshot();
9724
+ // Remember the state for the snapshot
9725
+ auto expected_cf_snapshot = expected_cf;
9726
+ auto not_found_cf_snapshot = not_found_cf;
9727
+
9728
+ for (int j = 0; j < kBatchSize; ++j) {
9729
+ std::string key = key_prefix + std::to_string(rnd->Uniform(1000));
9730
+ std::string value = value_prefix + std::to_string(i + j);
9731
+ int operation = rnd->Uniform(10);
9732
+ if (operation < 8) { // 80% probability for Merge
9733
+ ASSERT_OK(txn->Merge(handles_[0], key, value));
9734
+ if (expected_cf.find(key) != expected_cf.end()) {
9735
+ expected_cf[key] += "," + value;
9736
+ } else {
9737
+ expected_cf[key] = value;
9738
+ }
9739
+ not_found_cf.erase(key);
9740
+ } else if (operation == 8) { // 10% probability for PUT
9741
+ ASSERT_OK(txn->Put(handles_[0], key, value));
9742
+ expected_cf[key] = value;
9743
+ not_found_cf.erase(key);
9744
+ } else { // 10% probability for DEL
9745
+ ASSERT_OK(txn->Delete(handles_[0], key));
9746
+ expected_cf.erase(key);
9747
+ not_found_cf.insert(key);
9748
+ }
9749
+ }
9750
+ ASSERT_OK(txn->Prepare());
9751
+ ASSERT_OK(txn->Commit());
9752
+
9753
+ if (txn_count % 10 == 0) {
9754
+ VerifyDBFromMap(expected_cf, nullptr, false, nullptr, handles_[0],
9755
+ &not_found_cf);
9756
+ // Verify read at snapshot
9757
+ ReadOptions ro;
9758
+ ro.snapshot = snapshot;
9759
+ VerifyDBFromMap(expected_cf_snapshot, nullptr, false, &ro, handles_[0],
9760
+ &not_found_cf_snapshot);
9761
+ }
9762
+ txn_db->ReleaseSnapshot(snapshot);
9763
+ }
9764
+
9765
+ VerifyDBFromMap(expected_cf, nullptr, false, nullptr, handles_[0]);
9766
+ }
9767
+ }
9768
+
9769
+ TEST_F(TransactionDBTest, SelfDeadlockBug) {
9770
+ ASSERT_OK(ReOpen());
9771
+
9772
+ // Create two transactions
9773
+ WriteOptions write_options;
9774
+ TransactionOptions txn_options;
9775
+ txn_options.lock_timeout = 50; // 50ms
9776
+ txn_options.deadlock_detect = true;
9777
+
9778
+ ASSERT_OK(db->Put({}, "shared_key", "shared_value"));
9779
+
9780
+ // First transaction
9781
+ Transaction* txn1 = db->BeginTransaction(write_options, txn_options);
9782
+ ASSERT_TRUE(txn1);
9783
+ ASSERT_OK(txn1->SetName("txn1"));
9784
+
9785
+ // Second transaction
9786
+ Transaction* txn2 = db->BeginTransaction(write_options, txn_options);
9787
+ ASSERT_TRUE(txn2);
9788
+ ASSERT_OK(txn2->SetName("txn2"));
9789
+
9790
+ // Both transactions acquire shared lock on the same key.
9791
+ std::string value;
9792
+ ASSERT_OK(txn1->GetForUpdate(ReadOptions(), "shared_key", &value,
9793
+ /*exclusive=*/false));
9794
+ ASSERT_OK(txn2->GetForUpdate(ReadOptions(), "shared_key", &value,
9795
+ /*exclusive=*/false));
9796
+
9797
+ // Second transaction tries to upgrade to exclusive lock, which should
9798
+ // timeout.
9799
+ Status s = txn1->Put({}, "shared_key", "val");
9800
+ // Print out the deadlock info buffer
9801
+ ASSERT_TRUE(db->GetDeadlockInfoBuffer().empty());
9802
+ ASSERT_TRUE(s.IsTimedOut());
9803
+ ASSERT_EQ(s.ToString(), "Operation timed out: Timeout waiting to lock key");
9804
+
9805
+ // After release lock from txn2, txn1 should be able to proceed.
9806
+ ASSERT_OK(txn2->Rollback());
9807
+ ASSERT_OK(txn1->Put({}, "shared_key", "val"));
9808
+ ASSERT_OK(txn1->Rollback());
9809
+ delete txn1;
9810
+ delete txn2;
9811
+ }
9812
+
9813
+ TEST_P(CommitBypassMemtableTest,
9814
+ OptimizeLargeTxnCommitWriteBatchSizeThreshold) {
9815
+ // Tests TransactionOptions::large_txn_commit_optimize_byte_threshold
9816
+ const uint64_t threshold = 100;
9817
+ SetUpTransactionDB();
9818
+ bool commit_bypass_memtable = false;
9819
+ SyncPoint::GetInstance()->SetCallBack(
9820
+ "WriteCommittedTxn::CommitInternal:bypass_memtable",
9821
+ [&](void* arg) { commit_bypass_memtable = *(static_cast<bool*>(arg)); });
9822
+ SyncPoint::GetInstance()->EnableProcessing();
9823
+
9824
+ Random rnd(301);
9825
+
9826
+ WriteOptions wopts;
9827
+ TransactionOptions txn_opts;
9828
+ // Test default
9829
+ auto txn = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
9830
+ ASSERT_OK(txn->SetName("xid0"));
9831
+ ASSERT_OK(txn->Put("k1", rnd.RandomString(1000)));
9832
+ ASSERT_OK(txn->Prepare());
9833
+ ASSERT_OK(txn->Commit());
9834
+ ASSERT_FALSE(commit_bypass_memtable);
9835
+
9836
+ // Test with transaction option only
9837
+ txn_opts.large_txn_commit_optimize_byte_threshold = threshold;
9838
+ // Above threshold
9839
+ txn = txn_db->BeginTransaction(wopts, txn_opts, txn);
9840
+ ASSERT_OK(txn->SetName("xid1"));
9841
+ ASSERT_OK(txn->Put("k1", rnd.RandomString(threshold)));
9842
+ ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() >= threshold);
9843
+ ASSERT_OK(txn->Prepare());
9844
+ ASSERT_OK(txn->Commit());
9845
+ ASSERT_TRUE(commit_bypass_memtable);
9846
+
9847
+ // Below threshold
9848
+ txn = txn_db->BeginTransaction(wopts, txn_opts, txn);
9849
+ ASSERT_OK(txn->SetName("xid2"));
9850
+ ASSERT_OK(txn->Put("k2", "v2"));
9851
+ ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
9852
+ ASSERT_OK(txn->Prepare());
9853
+ ASSERT_OK(txn->Commit());
9854
+ ASSERT_FALSE(commit_bypass_memtable);
9855
+ delete txn;
9856
+
9857
+ // With commit_bypass_memtbale
9858
+ TransactionOptions txn_opts2;
9859
+ txn_opts2.commit_bypass_memtable = true;
9860
+ txn_opts2.large_txn_commit_optimize_byte_threshold = threshold;
9861
+ txn = txn_db->BeginTransaction(wopts, txn_opts2, nullptr);
9862
+ ASSERT_OK(txn->SetName("xid3"));
9863
+ ASSERT_OK(txn->Put("k3", "v3"));
9864
+ ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
9865
+ ASSERT_OK(txn->Prepare());
9866
+ ASSERT_OK(txn->Commit());
9867
+ ASSERT_TRUE(commit_bypass_memtable);
9868
+ delete txn;
9869
+
9870
+ // With count based threshold `large_txn_commit_optimize_threshold`
9871
+ TransactionOptions txn_opts3;
9872
+ txn_opts3.commit_bypass_memtable = false;
9873
+ txn_opts3.large_txn_commit_optimize_byte_threshold = threshold;
9874
+ txn_opts3.large_txn_commit_optimize_threshold = 3;
9875
+ txn = txn_db->BeginTransaction(wopts, txn_opts3, nullptr);
9876
+ ASSERT_OK(txn->SetName("xid4"));
9877
+ ASSERT_OK(txn->Put("k3", "v3"));
9878
+ ASSERT_OK(txn->Delete("k2"));
9879
+ ASSERT_OK(txn->Delete("k1"));
9880
+ ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
9881
+ ASSERT_OK(txn->Prepare());
9882
+ ASSERT_OK(txn->Commit());
9883
+ ASSERT_TRUE(commit_bypass_memtable);
9884
+
9885
+ txn = txn_db->BeginTransaction(wopts, txn_opts3, txn);
9886
+ ASSERT_OK(txn->SetName("xid4"));
9887
+ ASSERT_OK(txn->Put("k3", "v3"));
9888
+ ASSERT_OK(txn->Delete("k2"));
9889
+ ASSERT_OK(txn->Delete("k1"));
9890
+ ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
9891
+ ASSERT_OK(txn->Prepare());
9892
+ ASSERT_OK(txn->Commit());
9893
+ ASSERT_TRUE(commit_bypass_memtable);
9894
+
9895
+ txn = txn_db->BeginTransaction(wopts, txn_opts3, txn);
9896
+ ASSERT_OK(txn->SetName("xid5"));
9897
+ ASSERT_OK(txn->Put("k5", "v5"));
9898
+ ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
9899
+ ASSERT_OK(txn->Prepare());
9900
+ ASSERT_OK(txn->Commit());
9901
+ ASSERT_FALSE(commit_bypass_memtable);
9902
+ delete txn;
9903
+
9904
+ // Test with multiple column families
9905
+ std::vector<std::string> cfs = {"pk", "sk"};
9906
+ CreateColumnFamilies(cfs, options);
9907
+ TransactionOptions txn_opts_cf;
9908
+
9909
+ txn_opts_cf.large_txn_commit_optimize_byte_threshold = threshold;
9910
+
9911
+ // Below threshold
9912
+ auto txn_cf = txn_db->BeginTransaction(wopts, txn_opts_cf, nullptr);
9913
+ ASSERT_OK(txn_cf->SetName("xid_cf_above"));
9914
+ ASSERT_OK(txn_cf->Put(handles_[0], "k1", rnd.RandomString(threshold / 2)));
9915
+ ASSERT_OK(txn_cf->Put(handles_[1], "k2", rnd.RandomString(threshold / 2)));
9916
+ ASSERT_TRUE(txn_cf->GetWriteBatch()->GetDataSize() >= threshold);
9917
+ ASSERT_OK(txn_cf->Prepare());
9918
+ ASSERT_OK(txn_cf->Commit());
9919
+ ASSERT_TRUE(commit_bypass_memtable);
9920
+
9921
+ txn_cf = txn_db->BeginTransaction(wopts, txn_opts_cf, txn_cf);
9922
+ ASSERT_OK(txn_cf->SetName("xid_cf_below"));
9923
+ ASSERT_OK(txn_cf->Put(handles_[0], "k1", rnd.RandomString(10)));
9924
+ ASSERT_OK(txn_cf->Put(handles_[1], "k2", rnd.RandomString(10)));
9925
+ ASSERT_TRUE(txn_cf->GetWriteBatch()->GetDataSize() < threshold);
9926
+ ASSERT_OK(txn_cf->Prepare());
9927
+ ASSERT_OK(txn_cf->Commit());
9928
+ ASSERT_FALSE(commit_bypass_memtable);
9929
+
9930
+ delete txn_cf;
9931
+ }
8851
9932
  } // namespace ROCKSDB_NAMESPACE
8852
9933
 
8853
9934
  int main(int argc, char** argv) {