@nxtedition/rocksdb 8.2.8 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/binding.cc +0 -21
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +20 -10
  3. package/deps/rocksdb/rocksdb/Makefile +37 -25
  4. package/deps/rocksdb/rocksdb/README.md +29 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +25 -2
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +229 -74
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
  9. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
  10. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -95
  11. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
  12. package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2683 -496
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.h +580 -159
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +145 -42
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +20 -1
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +391 -17
  18. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
  19. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +309 -212
  20. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -32
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +439 -12
  22. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +44 -2
  23. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +11 -1
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -3
  25. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
  26. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
  27. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
  28. package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
  29. package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
  30. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +28 -12
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
  32. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
  33. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
  34. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
  35. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  36. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +20 -22
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
  41. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
  42. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
  43. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
  44. package/deps/rocksdb/rocksdb/db/builder.cc +35 -10
  45. package/deps/rocksdb/rocksdb/db/c.cc +233 -6
  46. package/deps/rocksdb/rocksdb/db/c_test.c +140 -6
  47. package/deps/rocksdb/rocksdb/db/column_family.cc +110 -51
  48. package/deps/rocksdb/rocksdb/db/column_family.h +34 -2
  49. package/deps/rocksdb/rocksdb/db/column_family_test.cc +314 -7
  50. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +106 -23
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +47 -9
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +10 -11
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +148 -60
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +22 -7
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -4
  60. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +33 -23
  61. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +14 -5
  62. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
  63. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
  64. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +90 -4
  65. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +170 -95
  66. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
  67. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +32 -58
  68. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +3 -1
  69. package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
  70. package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
  71. package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
  72. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  73. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +46 -10
  74. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -3
  75. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -15
  76. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
  77. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +850 -44
  78. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
  79. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +275 -1
  80. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +52 -19
  81. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +733 -320
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +155 -66
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +516 -155
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -4
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
  87. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -4
  88. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +100 -35
  89. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +95 -50
  90. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -9
  91. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +136 -79
  92. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +6 -95
  93. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +31 -22
  94. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
  95. package/deps/rocksdb/rocksdb/db/db_iter.cc +85 -57
  96. package/deps/rocksdb/rocksdb/db/db_iter.h +11 -2
  97. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
  98. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
  99. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
  100. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
  101. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +193 -7
  102. package/deps/rocksdb/rocksdb/db/db_options_test.cc +294 -26
  103. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
  104. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +364 -0
  105. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +13 -3
  106. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
  107. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
  108. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
  109. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
  110. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
  111. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +282 -167
  112. package/deps/rocksdb/rocksdb/db/db_test.cc +180 -49
  113. package/deps/rocksdb/rocksdb/db/db_test2.cc +84 -12
  114. package/deps/rocksdb/rocksdb/db/db_test_util.cc +25 -12
  115. package/deps/rocksdb/rocksdb/db/db_test_util.h +45 -2
  116. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +14 -1
  117. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +245 -0
  118. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +480 -1
  119. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
  120. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
  121. package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
  122. package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
  123. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
  124. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
  125. package/deps/rocksdb/rocksdb/db/error_handler.cc +67 -34
  126. package/deps/rocksdb/rocksdb/db/error_handler.h +13 -9
  127. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  128. package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
  129. package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
  130. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
  131. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
  132. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +144 -4
  133. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
  134. package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
  135. package/deps/rocksdb/rocksdb/db/flush_job.cc +105 -17
  136. package/deps/rocksdb/rocksdb/db/flush_job.h +27 -4
  137. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -12
  138. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
  139. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
  140. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
  141. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
  142. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
  143. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  144. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
  145. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
  146. package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
  147. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
  149. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -3
  150. package/deps/rocksdb/rocksdb/db/memtable.cc +70 -83
  151. package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
  152. package/deps/rocksdb/rocksdb/db/memtable_list.cc +45 -11
  153. package/deps/rocksdb/rocksdb/db/memtable_list.h +43 -2
  154. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +91 -5
  155. package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
  156. package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
  157. package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
  158. package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
  159. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -2
  160. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
  161. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -0
  162. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
  164. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
  165. package/deps/rocksdb/rocksdb/db/repair.cc +25 -7
  166. package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
  167. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +459 -74
  168. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
  169. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
  170. package/deps/rocksdb/rocksdb/db/table_cache.cc +76 -54
  171. package/deps/rocksdb/rocksdb/db/table_cache.h +18 -12
  172. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  173. package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
  174. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
  175. package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
  176. package/deps/rocksdb/rocksdb/db/version_edit.h +58 -10
  177. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
  178. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
  179. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
  180. package/deps/rocksdb/rocksdb/db/version_set.cc +207 -110
  181. package/deps/rocksdb/rocksdb/db/version_set.h +36 -15
  182. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
  183. package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -26
  184. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
  185. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
  186. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
  187. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
  188. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
  189. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
  190. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
  191. package/deps/rocksdb/rocksdb/db/write_batch.cc +55 -20
  192. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
  193. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
  194. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  195. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
  196. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
  197. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
  198. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +37 -13
  199. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +110 -58
  200. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
  201. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +68 -17
  202. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
  203. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -1
  204. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +429 -237
  205. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +13 -6
  206. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +21 -14
  207. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
  208. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
  209. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
  210. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
  211. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +29 -38
  212. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +302 -101
  213. package/deps/rocksdb/rocksdb/env/env.cc +6 -2
  214. package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
  215. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
  216. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
  217. package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
  218. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  219. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +79 -0
  220. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
  221. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
  222. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
  223. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +100 -70
  224. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +64 -18
  225. package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
  226. package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
  227. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1225 -97
  228. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +72 -33
  229. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
  230. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
  231. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
  232. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +40 -14
  233. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +163 -91
  234. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +112 -2
  235. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +108 -16
  236. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
  238. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +42 -2
  239. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
  240. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +92 -12
  241. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +34 -4
  242. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
  243. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +91 -13
  244. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
  245. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
  246. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  248. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
  249. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +130 -22
  250. package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
  251. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
  252. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +92 -9
  253. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
  254. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
  255. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +37 -2
  256. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
  257. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
  258. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
  259. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +20 -3
  260. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +7 -0
  261. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +42 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
  268. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  269. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
  270. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -2
  271. package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
  272. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +4 -3
  273. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
  274. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  275. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
  276. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  277. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +22 -1
  278. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
  279. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
  280. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  281. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
  282. package/deps/rocksdb/rocksdb/options/customizable_test.cc +6 -1
  283. package/deps/rocksdb/rocksdb/options/db_options.cc +54 -2
  284. package/deps/rocksdb/rocksdb/options/db_options.h +4 -0
  285. package/deps/rocksdb/rocksdb/options/options.cc +15 -1
  286. package/deps/rocksdb/rocksdb/options/options_helper.cc +18 -0
  287. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +14 -4
  288. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -1
  289. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  290. package/deps/rocksdb/rocksdb/port/README +10 -0
  291. package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
  292. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  293. package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
  294. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
  295. package/deps/rocksdb/rocksdb/port/stack_trace.cc +32 -12
  296. package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
  297. package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
  298. package/deps/rocksdb/rocksdb/src.mk +10 -1
  299. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  300. package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
  301. package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
  302. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +116 -43
  303. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +9 -6
  304. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +321 -49
  305. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +98 -4
  306. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +233 -98
  307. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +58 -23
  308. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
  309. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +52 -24
  310. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
  311. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
  312. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
  313. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
  314. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
  315. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -18
  316. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +20 -8
  317. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +232 -71
  318. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
  319. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
  320. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
  321. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  322. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
  323. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
  324. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -2
  325. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
  326. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +36 -19
  327. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
  328. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
  329. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
  330. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +11 -7
  331. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
  332. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
  333. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
  334. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +14 -13
  335. package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
  336. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +9 -2
  337. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
  338. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
  339. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
  340. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
  341. package/deps/rocksdb/rocksdb/table/format.cc +175 -33
  342. package/deps/rocksdb/rocksdb/table/format.h +63 -10
  343. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
  344. package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
  345. package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
  346. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
  347. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +22 -2
  348. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
  349. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
  350. package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
  351. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
  352. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
  353. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
  354. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
  355. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +45 -9
  356. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
  357. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +24 -1
  358. package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
  359. package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
  360. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
  361. package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
  362. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
  363. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
  364. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
  365. package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
  366. package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
  367. package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
  368. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
  369. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +87 -65
  370. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +221 -33
  371. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
  372. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  373. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  374. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -11
  375. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
  376. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
  377. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
  378. package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
  379. package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
  380. package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
  381. package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
  382. package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
  383. package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
  384. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
  385. package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
  386. package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
  387. package/deps/rocksdb/rocksdb/util/cast_util.h +24 -0
  388. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
  389. package/deps/rocksdb/rocksdb/util/comparator.cc +55 -8
  390. package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
  391. package/deps/rocksdb/rocksdb/util/compression.h +119 -35
  392. package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
  393. package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
  394. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
  395. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
  396. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
  397. package/deps/rocksdb/rocksdb/util/hash.h +7 -3
  398. package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
  399. package/deps/rocksdb/rocksdb/util/math.h +58 -6
  400. package/deps/rocksdb/rocksdb/util/math128.h +29 -7
  401. package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
  402. package/deps/rocksdb/rocksdb/util/overload.h +23 -0
  403. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
  404. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
  405. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
  406. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
  407. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
  408. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  409. package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +10 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +385 -0
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +192 -1
  415. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +461 -0
  416. package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
  417. package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
  418. package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
  419. package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
  420. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +71 -26
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
  426. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
  427. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
  428. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  429. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +20 -16
  430. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
  431. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
  432. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +7 -1
  433. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
  434. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +12 -3
  435. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  436. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
  437. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
  438. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
  439. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  440. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  441. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
  442. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
  443. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
  444. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +272 -33
  445. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
  446. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -1
  447. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
  448. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
  449. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +195 -23
  450. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +19 -12
  451. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +88 -1
  452. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
  453. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +43 -17
  454. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
  455. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +73 -24
  456. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
  457. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
  458. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +41 -12
  459. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
  460. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +15 -8
  461. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
  462. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
  463. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  464. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
  465. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +59 -28
  466. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
  467. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
  468. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +111 -14
  469. package/deps/rocksdb/rocksdb.gyp +6 -2
  470. package/index.js +0 -8
  471. package/package.json +1 -1
  472. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  473. package/prebuilds/linux-x64/node.napi.node +0 -0
  474. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  475. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  476. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  477. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  478. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  479. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  480. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  481. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  482. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  483. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
@@ -182,9 +182,8 @@ class LogTest
182
182
 
183
183
  Slice* get_reader_contents() { return &reader_contents_; }
184
184
 
185
- void Write(
186
- const std::string& msg,
187
- const std::unordered_map<uint32_t, size_t>* cf_to_ts_sz = nullptr) {
185
+ void Write(const std::string& msg,
186
+ const UnorderedMap<uint32_t, size_t>* cf_to_ts_sz = nullptr) {
188
187
  if (cf_to_ts_sz != nullptr && !cf_to_ts_sz->empty()) {
189
188
  ASSERT_OK(writer_->MaybeAddUserDefinedTimestampSizeRecord(*cf_to_ts_sz));
190
189
  }
@@ -193,10 +192,9 @@ class LogTest
193
192
 
194
193
  size_t WrittenBytes() const { return dest_contents().size(); }
195
194
 
196
- std::string Read(
197
- const WALRecoveryMode wal_recovery_mode =
198
- WALRecoveryMode::kTolerateCorruptedTailRecords,
199
- std::unordered_map<uint32_t, size_t>* cf_to_ts_sz = nullptr) {
195
+ std::string Read(const WALRecoveryMode wal_recovery_mode =
196
+ WALRecoveryMode::kTolerateCorruptedTailRecords,
197
+ UnorderedMap<uint32_t, size_t>* cf_to_ts_sz = nullptr) {
200
198
  std::string scratch;
201
199
  Slice record;
202
200
  bool ret = false;
@@ -270,9 +268,8 @@ class LogTest
270
268
  }
271
269
 
272
270
  void CheckRecordAndTimestampSize(
273
- std::string record,
274
- std::unordered_map<uint32_t, size_t>& expected_ts_sz) {
275
- std::unordered_map<uint32_t, size_t> recorded_ts_sz;
271
+ std::string record, UnorderedMap<uint32_t, size_t>& expected_ts_sz) {
272
+ UnorderedMap<uint32_t, size_t> recorded_ts_sz;
276
273
  ASSERT_EQ(record,
277
274
  Read(WALRecoveryMode::
278
275
  kTolerateCorruptedTailRecords /* wal_recovery_mode */,
@@ -297,18 +294,18 @@ TEST_P(LogTest, ReadWrite) {
297
294
  }
298
295
 
299
296
  TEST_P(LogTest, ReadWriteWithTimestampSize) {
300
- std::unordered_map<uint32_t, size_t> ts_sz_one = {
297
+ UnorderedMap<uint32_t, size_t> ts_sz_one = {
301
298
  {1, sizeof(uint64_t)},
302
299
  };
303
300
  Write("foo", &ts_sz_one);
304
301
  Write("bar");
305
- std::unordered_map<uint32_t, size_t> ts_sz_two = {{2, sizeof(char)}};
302
+ UnorderedMap<uint32_t, size_t> ts_sz_two = {{2, sizeof(char)}};
306
303
  Write("", &ts_sz_two);
307
304
  Write("xxxx");
308
305
 
309
306
  CheckRecordAndTimestampSize("foo", ts_sz_one);
310
307
  CheckRecordAndTimestampSize("bar", ts_sz_one);
311
- std::unordered_map<uint32_t, size_t> expected_ts_sz_two;
308
+ UnorderedMap<uint32_t, size_t> expected_ts_sz_two;
312
309
  // User-defined timestamp size records are accumulated and applied to
313
310
  // subsequent records.
314
311
  expected_ts_sz_two.insert(ts_sz_one.begin(), ts_sz_one.end());
@@ -320,10 +317,9 @@ TEST_P(LogTest, ReadWriteWithTimestampSize) {
320
317
  }
321
318
 
322
319
  TEST_P(LogTest, ReadWriteWithTimestampSizeZeroTimestampIgnored) {
323
- std::unordered_map<uint32_t, size_t> ts_sz_one = {{1, sizeof(uint64_t)}};
320
+ UnorderedMap<uint32_t, size_t> ts_sz_one = {{1, sizeof(uint64_t)}};
324
321
  Write("foo", &ts_sz_one);
325
- std::unordered_map<uint32_t, size_t> ts_sz_two(ts_sz_one.begin(),
326
- ts_sz_one.end());
322
+ UnorderedMap<uint32_t, size_t> ts_sz_two(ts_sz_one.begin(), ts_sz_one.end());
327
323
  ts_sz_two.insert(std::make_pair(2, 0));
328
324
  Write("bar", &ts_sz_two);
329
325
 
@@ -749,7 +745,7 @@ TEST_P(LogTest, RecycleWithTimestampSize) {
749
745
  if (!recyclable_log) {
750
746
  return; // test is only valid for recycled logs
751
747
  }
752
- std::unordered_map<uint32_t, size_t> ts_sz_one = {
748
+ UnorderedMap<uint32_t, size_t> ts_sz_one = {
753
749
  {1, sizeof(uint32_t)},
754
750
  };
755
751
  Write("foo", &ts_sz_one);
@@ -765,7 +761,7 @@ TEST_P(LogTest, RecycleWithTimestampSize) {
765
761
  std::unique_ptr<WritableFileWriter> dest_holder(new WritableFileWriter(
766
762
  std::move(sink), "" /* don't care */, FileOptions()));
767
763
  Writer recycle_writer(std::move(dest_holder), 123, true);
768
- std::unordered_map<uint32_t, size_t> ts_sz_two = {
764
+ UnorderedMap<uint32_t, size_t> ts_sz_two = {
769
765
  {2, sizeof(uint64_t)},
770
766
  };
771
767
  ASSERT_OK(recycle_writer.MaybeAddUserDefinedTimestampSizeRecord(ts_sz_two));
@@ -1039,18 +1035,18 @@ TEST_P(CompressionLogTest, ReadWriteWithTimestampSize) {
1039
1035
  return;
1040
1036
  }
1041
1037
  ASSERT_OK(SetupTestEnv());
1042
- std::unordered_map<uint32_t, size_t> ts_sz_one = {
1038
+ UnorderedMap<uint32_t, size_t> ts_sz_one = {
1043
1039
  {1, sizeof(uint64_t)},
1044
1040
  };
1045
1041
  Write("foo", &ts_sz_one);
1046
1042
  Write("bar");
1047
- std::unordered_map<uint32_t, size_t> ts_sz_two = {{2, sizeof(char)}};
1043
+ UnorderedMap<uint32_t, size_t> ts_sz_two = {{2, sizeof(char)}};
1048
1044
  Write("", &ts_sz_two);
1049
1045
  Write("xxxx");
1050
1046
 
1051
1047
  CheckRecordAndTimestampSize("foo", ts_sz_one);
1052
1048
  CheckRecordAndTimestampSize("bar", ts_sz_one);
1053
- std::unordered_map<uint32_t, size_t> expected_ts_sz_two;
1049
+ UnorderedMap<uint32_t, size_t> expected_ts_sz_two;
1054
1050
  // User-defined timestamp size records are accumulated and applied to
1055
1051
  // subsequent records.
1056
1052
  expected_ts_sz_two.insert(ts_sz_one.begin(), ts_sz_one.end());
@@ -197,7 +197,7 @@ IOStatus Writer::AddCompressionTypeRecord() {
197
197
  }
198
198
 
199
199
  IOStatus Writer::MaybeAddUserDefinedTimestampSizeRecord(
200
- const std::unordered_map<uint32_t, size_t>& cf_to_ts_sz,
200
+ const UnorderedMap<uint32_t, size_t>& cf_to_ts_sz,
201
201
  Env::IOPriority rate_limiter_priority) {
202
202
  std::vector<std::pair<uint32_t, size_t>> ts_sz_to_record;
203
203
  for (const auto& [cf_id, ts_sz] : cf_to_ts_sz) {
@@ -20,6 +20,7 @@
20
20
  #include "rocksdb/slice.h"
21
21
  #include "rocksdb/status.h"
22
22
  #include "util/compression.h"
23
+ #include "util/hash_containers.h"
23
24
 
24
25
  namespace ROCKSDB_NAMESPACE {
25
26
 
@@ -95,7 +96,7 @@ class Writer {
95
96
  // kRecyclableUserDefinedTimestampSizeType for these column families.
96
97
  // This timestamp size record applies to all subsequent records.
97
98
  IOStatus MaybeAddUserDefinedTimestampSizeRecord(
98
- const std::unordered_map<uint32_t, size_t>& cf_to_ts_sz,
99
+ const UnorderedMap<uint32_t, size_t>& cf_to_ts_sz,
99
100
  Env::IOPriority rate_limiter_priority = Env::IO_TOTAL);
100
101
 
101
102
  WritableFileWriter* file() { return dest_.get(); }
@@ -137,7 +138,7 @@ class Writer {
137
138
  // The recorded user-defined timestamp size that have been written so far.
138
139
  // Since the user-defined timestamp size cannot be changed while the DB is
139
140
  // running, existing entry in this map cannot be updated.
140
- std::unordered_map<uint32_t, size_t> recorded_cf_to_ts_sz_;
141
+ UnorderedMap<uint32_t, size_t> recorded_cf_to_ts_sz_;
141
142
  };
142
143
 
143
144
  } // namespace log
@@ -124,6 +124,7 @@ TEST_F(ManualCompactionTest, CompactTouchesAllKeys) {
124
124
  ASSERT_EQ("key3", itr->key().ToString());
125
125
  itr->Next();
126
126
  ASSERT_TRUE(!itr->Valid());
127
+ ASSERT_OK(itr->status());
127
128
  delete itr;
128
129
 
129
130
  delete options.compaction_filter;
@@ -179,6 +180,7 @@ TEST_F(ManualCompactionTest, Test) {
179
180
  for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
180
181
  num_keys++;
181
182
  }
183
+ ASSERT_OK(iter->status());
182
184
  delete iter;
183
185
  ASSERT_EQ(kNumKeys, num_keys) << "Bad number of keys";
184
186
 
@@ -190,6 +192,7 @@ TEST_F(ManualCompactionTest, Test) {
190
192
  TEST_F(ManualCompactionTest, SkipLevel) {
191
193
  DB* db;
192
194
  Options options;
195
+ options.level_compaction_dynamic_level_bytes = false;
193
196
  options.num_levels = 3;
194
197
  // Initially, flushed L0 files won't exceed 100.
195
198
  options.level0_file_num_compaction_trigger = 100;
@@ -286,9 +289,9 @@ TEST_F(ManualCompactionTest, SkipLevel) {
286
289
  filter->Reset();
287
290
  ASSERT_OK(db->CompactRange(CompactRangeOptions(), &start, nullptr));
288
291
  ASSERT_EQ(4, filter->NumKeys());
289
- // 1 is first compacted to L1 and then further compacted into [2, 4, 8],
290
- // so finally the logged level for 1 is L1.
291
- ASSERT_EQ(1, filter->KeyLevel("1"));
292
+ // 1 is first compacted from L0 to L1, and then L1 intra level compaction
293
+ // compacts [2, 4, 8] only.
294
+ ASSERT_EQ(0, filter->KeyLevel("1"));
292
295
  ASSERT_EQ(1, filter->KeyLevel("2"));
293
296
  ASSERT_EQ(1, filter->KeyLevel("4"));
294
297
  ASSERT_EQ(1, filter->KeyLevel("8"));
@@ -95,6 +95,7 @@ MemTable::MemTable(const InternalKeyComparator& cmp,
95
95
  data_size_(0),
96
96
  num_entries_(0),
97
97
  num_deletes_(0),
98
+ num_range_deletes_(0),
98
99
  write_buffer_size_(mutable_cf_options.write_buffer_size),
99
100
  flush_in_progress_(false),
100
101
  flush_completed_(false),
@@ -114,7 +115,9 @@ MemTable::MemTable(const InternalKeyComparator& cmp,
114
115
  ioptions.memtable_insert_with_hint_prefix_extractor.get()),
115
116
  oldest_key_time_(std::numeric_limits<uint64_t>::max()),
116
117
  atomic_flush_seqno_(kMaxSequenceNumber),
117
- approximate_memory_usage_(0) {
118
+ approximate_memory_usage_(0),
119
+ memtable_max_range_deletions_(
120
+ mutable_cf_options.memtable_max_range_deletions) {
118
121
  UpdateFlushState();
119
122
  // something went wrong if we need to flush before inserting anything
120
123
  assert(!ShouldScheduleFlush());
@@ -143,6 +146,10 @@ MemTable::MemTable(const InternalKeyComparator& cmp,
143
146
  new_cache.get()),
144
147
  std::memory_order_relaxed);
145
148
  }
149
+ const Comparator* ucmp = cmp.user_comparator();
150
+ assert(ucmp);
151
+ ts_sz_ = ucmp->timestamp_size();
152
+ persist_user_defined_timestamps_ = ioptions.persist_user_defined_timestamps;
146
153
  }
147
154
 
148
155
  MemTable::~MemTable() {
@@ -170,6 +177,14 @@ size_t MemTable::ApproximateMemoryUsage() {
170
177
  }
171
178
 
172
179
  bool MemTable::ShouldFlushNow() {
180
+ // This is set if memtable_max_range_deletions is > 0,
181
+ // and that many range deletions are done
182
+ if (memtable_max_range_deletions_ > 0 &&
183
+ num_range_deletes_.load(std::memory_order_relaxed) >=
184
+ static_cast<uint64_t>(memtable_max_range_deletions_)) {
185
+ return true;
186
+ }
187
+
173
188
  size_t write_buffer_size = write_buffer_size_.load(std::memory_order_relaxed);
174
189
  // In a lot of times, we cannot allocate arena blocks that exactly matches the
175
190
  // buffer size. Thus we have to decide if we should over-allocate or
@@ -357,7 +372,8 @@ class MemTableIterator : public InternalIterator {
357
372
  !mem.GetImmutableMemTableOptions()->inplace_update_support),
358
373
  protection_bytes_per_key_(mem.moptions_.protection_bytes_per_key),
359
374
  status_(Status::OK()),
360
- logger_(mem.moptions_.info_log) {
375
+ logger_(mem.moptions_.info_log),
376
+ ts_sz_(mem.ts_sz_) {
361
377
  if (use_range_del_table) {
362
378
  iter_ = mem.range_del_table_->GetIterator(arena);
363
379
  } else if (prefix_extractor_ != nullptr && !read_options.total_order_seek &&
@@ -400,8 +416,7 @@ class MemTableIterator : public InternalIterator {
400
416
  PERF_COUNTER_ADD(seek_on_memtable_count, 1);
401
417
  if (bloom_) {
402
418
  // iterator should only use prefix bloom filter
403
- auto ts_sz = comparator_.comparator.user_comparator()->timestamp_size();
404
- Slice user_k_without_ts(ExtractUserKeyAndStripTimestamp(k, ts_sz));
419
+ Slice user_k_without_ts(ExtractUserKeyAndStripTimestamp(k, ts_sz_));
405
420
  if (prefix_extractor_->InDomain(user_k_without_ts)) {
406
421
  if (!bloom_->MayContain(
407
422
  prefix_extractor_->Transform(user_k_without_ts))) {
@@ -421,8 +436,7 @@ class MemTableIterator : public InternalIterator {
421
436
  PERF_TIMER_GUARD(seek_on_memtable_time);
422
437
  PERF_COUNTER_ADD(seek_on_memtable_count, 1);
423
438
  if (bloom_) {
424
- auto ts_sz = comparator_.comparator.user_comparator()->timestamp_size();
425
- Slice user_k_without_ts(ExtractUserKeyAndStripTimestamp(k, ts_sz));
439
+ Slice user_k_without_ts(ExtractUserKeyAndStripTimestamp(k, ts_sz_));
426
440
  if (prefix_extractor_->InDomain(user_k_without_ts)) {
427
441
  if (!bloom_->MayContain(
428
442
  prefix_extractor_->Transform(user_k_without_ts))) {
@@ -512,6 +526,7 @@ class MemTableIterator : public InternalIterator {
512
526
  uint32_t protection_bytes_per_key_;
513
527
  Status status_;
514
528
  Logger* logger_;
529
+ size_t ts_sz_;
515
530
 
516
531
  void VerifyEntryChecksum() {
517
532
  if (protection_bytes_per_key_ > 0 && Valid()) {
@@ -625,8 +640,7 @@ Status MemTable::VerifyEncodedEntry(Slice encoded,
625
640
  if (!GetVarint32(&encoded, &ikey_len)) {
626
641
  return Status::Corruption("Unable to parse internal key length");
627
642
  }
628
- size_t ts_sz = GetInternalKeyComparator().user_comparator()->timestamp_size();
629
- if (ikey_len < 8 + ts_sz) {
643
+ if (ikey_len < 8 + ts_sz_) {
630
644
  return Status::Corruption("Internal key length too short");
631
645
  }
632
646
  if (ikey_len > encoded.size()) {
@@ -725,8 +739,7 @@ Status MemTable::Add(SequenceNumber s, ValueType type,
725
739
  }
726
740
  }
727
741
 
728
- size_t ts_sz = GetInternalKeyComparator().user_comparator()->timestamp_size();
729
- Slice key_without_ts = StripTimestampFromUserKey(key, ts_sz);
742
+ Slice key_without_ts = StripTimestampFromUserKey(key, ts_sz_);
730
743
 
731
744
  if (!allow_concurrent) {
732
745
  // Extract prefix for insert with hint.
@@ -754,6 +767,9 @@ Status MemTable::Add(SequenceNumber s, ValueType type,
754
767
  type == kTypeDeletionWithTimestamp) {
755
768
  num_deletes_.store(num_deletes_.load(std::memory_order_relaxed) + 1,
756
769
  std::memory_order_relaxed);
770
+ } else if (type == kTypeRangeDeletion) {
771
+ uint64_t val = num_range_deletes_.load(std::memory_order_relaxed) + 1;
772
+ num_range_deletes_.store(val, std::memory_order_relaxed);
757
773
  }
758
774
 
759
775
  if (bloom_filter_ && prefix_extractor_ &&
@@ -776,6 +792,9 @@ Status MemTable::Add(SequenceNumber s, ValueType type,
776
792
  assert(first_seqno_.load() >= earliest_seqno_.load());
777
793
  }
778
794
  assert(post_process_info == nullptr);
795
+ // TODO(yuzhangyu): support updating newest UDT for when `allow_concurrent`
796
+ // is true.
797
+ MaybeUpdateNewestUDT(key_slice);
779
798
  UpdateFlushState();
780
799
  } else {
781
800
  bool res = (hint == nullptr)
@@ -810,13 +829,14 @@ Status MemTable::Add(SequenceNumber s, ValueType type,
810
829
  earliest_seqno_.load(std::memory_order_relaxed);
811
830
  while (
812
831
  (cur_earliest_seqno == kMaxSequenceNumber || s < cur_earliest_seqno) &&
813
- !first_seqno_.compare_exchange_weak(cur_earliest_seqno, s)) {
832
+ !earliest_seqno_.compare_exchange_weak(cur_earliest_seqno, s)) {
814
833
  }
815
834
  }
816
835
  if (type == kTypeRangeDeletion) {
817
836
  auto new_cache = std::make_shared<FragmentedRangeTombstoneListCache>();
818
837
  size_t size = cached_range_tombstone_.Size();
819
838
  if (allow_concurrent) {
839
+ post_process_info->num_range_deletes++;
820
840
  range_del_mutex_.lock();
821
841
  }
822
842
  for (size_t i = 0; i < size; ++i) {
@@ -835,6 +855,7 @@ Status MemTable::Add(SequenceNumber s, ValueType type,
835
855
  new_local_cache_ref, new_cache.get()),
836
856
  std::memory_order_relaxed);
837
857
  }
858
+
838
859
  if (allow_concurrent) {
839
860
  range_del_mutex_.unlock();
840
861
  }
@@ -1033,25 +1054,15 @@ static bool SaveValue(void* arg, const char* entry) {
1033
1054
  assert(s->do_merge);
1034
1055
 
1035
1056
  if (s->value || s->columns) {
1036
- std::string result;
1037
1057
  // `op_failure_scope` (an output parameter) is not provided (set to
1038
1058
  // nullptr) since a failure must be propagated regardless of its
1039
1059
  // value.
1040
1060
  *(s->status) = MergeHelper::TimedFullMerge(
1041
- merge_operator, s->key->user_key(), &v,
1042
- merge_context->GetOperands(), &result, s->logger, s->statistics,
1043
- s->clock, /* result_operand */ nullptr,
1044
- /* update_num_ops_stats */ true,
1061
+ merge_operator, s->key->user_key(),
1062
+ MergeHelper::kPlainBaseValue, v, merge_context->GetOperands(),
1063
+ s->logger, s->statistics, s->clock,
1064
+ /* update_num_ops_stats */ true, s->value, s->columns,
1045
1065
  /* op_failure_scope */ nullptr);
1046
-
1047
- if (s->status->ok()) {
1048
- if (s->value) {
1049
- *(s->value) = std::move(result);
1050
- } else {
1051
- assert(s->columns);
1052
- s->columns->SetPlainValue(std::move(result));
1053
- }
1054
- }
1055
1066
  }
1056
1067
  } else if (s->value) {
1057
1068
  s->value->assign(v.data(), v.size());
@@ -1096,35 +1107,15 @@ static bool SaveValue(void* arg, const char* entry) {
1096
1107
  } else if (*(s->merge_in_progress)) {
1097
1108
  assert(s->do_merge);
1098
1109
 
1099
- if (s->value) {
1100
- Slice value_of_default;
1101
- *(s->status) = WideColumnSerialization::GetValueOfDefaultColumn(
1102
- v, value_of_default);
1103
- if (s->status->ok()) {
1104
- // `op_failure_scope` (an output parameter) is not provided (set
1105
- // to nullptr) since a failure must be propagated regardless of
1106
- // its value.
1107
- *(s->status) = MergeHelper::TimedFullMerge(
1108
- merge_operator, s->key->user_key(), &value_of_default,
1109
- merge_context->GetOperands(), s->value, s->logger,
1110
- s->statistics, s->clock, /* result_operand */ nullptr,
1111
- /* update_num_ops_stats */ true,
1112
- /* op_failure_scope */ nullptr);
1113
- }
1114
- } else if (s->columns) {
1115
- std::string result;
1116
- // `op_failure_scope` (an output parameter) is not provided (set to
1117
- // nullptr) since a failure must be propagated regardless of its
1118
- // value.
1119
- *(s->status) = MergeHelper::TimedFullMergeWithEntity(
1120
- merge_operator, s->key->user_key(), v,
1121
- merge_context->GetOperands(), &result, s->logger, s->statistics,
1122
- s->clock, /* update_num_ops_stats */ true,
1110
+ if (s->value || s->columns) {
1111
+ // `op_failure_scope` (an output parameter) is not provided (set
1112
+ // to nullptr) since a failure must be propagated regardless of
1113
+ // its value.
1114
+ *(s->status) = MergeHelper::TimedFullMerge(
1115
+ merge_operator, s->key->user_key(), MergeHelper::kWideBaseValue,
1116
+ v, merge_context->GetOperands(), s->logger, s->statistics,
1117
+ s->clock, /* update_num_ops_stats */ true, s->value, s->columns,
1123
1118
  /* op_failure_scope */ nullptr);
1124
-
1125
- if (s->status->ok()) {
1126
- *(s->status) = s->columns->SetWideColumnValue(std::move(result));
1127
- }
1128
1119
  }
1129
1120
  } else if (s->value) {
1130
1121
  Slice value_of_default;
@@ -1155,25 +1146,14 @@ static bool SaveValue(void* arg, const char* entry) {
1155
1146
  case kTypeRangeDeletion: {
1156
1147
  if (*(s->merge_in_progress)) {
1157
1148
  if (s->value || s->columns) {
1158
- std::string result;
1159
1149
  // `op_failure_scope` (an output parameter) is not provided (set to
1160
1150
  // nullptr) since a failure must be propagated regardless of its
1161
1151
  // value.
1162
1152
  *(s->status) = MergeHelper::TimedFullMerge(
1163
- merge_operator, s->key->user_key(), nullptr,
1164
- merge_context->GetOperands(), &result, s->logger, s->statistics,
1165
- s->clock, /* result_operand */ nullptr,
1166
- /* update_num_ops_stats */ true,
1153
+ merge_operator, s->key->user_key(), MergeHelper::kNoBaseValue,
1154
+ merge_context->GetOperands(), s->logger, s->statistics,
1155
+ s->clock, /* update_num_ops_stats */ true, s->value, s->columns,
1167
1156
  /* op_failure_scope */ nullptr);
1168
-
1169
- if (s->status->ok()) {
1170
- if (s->value) {
1171
- *(s->value) = std::move(result);
1172
- } else {
1173
- assert(s->columns);
1174
- s->columns->SetPlainValue(std::move(result));
1175
- }
1176
- }
1177
1157
  } else {
1178
1158
  // We have found a final value (a base deletion) and have newer
1179
1159
  // merge operands that we do not intend to merge. Nothing remains
@@ -1206,25 +1186,14 @@ static bool SaveValue(void* arg, const char* entry) {
1206
1186
  if (s->do_merge && merge_operator->ShouldMerge(
1207
1187
  merge_context->GetOperandsDirectionBackward())) {
1208
1188
  if (s->value || s->columns) {
1209
- std::string result;
1210
1189
  // `op_failure_scope` (an output parameter) is not provided (set to
1211
1190
  // nullptr) since a failure must be propagated regardless of its
1212
1191
  // value.
1213
1192
  *(s->status) = MergeHelper::TimedFullMerge(
1214
- merge_operator, s->key->user_key(), nullptr,
1215
- merge_context->GetOperands(), &result, s->logger, s->statistics,
1216
- s->clock, /* result_operand */ nullptr,
1217
- /* update_num_ops_stats */ true,
1193
+ merge_operator, s->key->user_key(), MergeHelper::kNoBaseValue,
1194
+ merge_context->GetOperands(), s->logger, s->statistics,
1195
+ s->clock, /* update_num_ops_stats */ true, s->value, s->columns,
1218
1196
  /* op_failure_scope */ nullptr);
1219
-
1220
- if (s->status->ok()) {
1221
- if (s->value) {
1222
- *(s->value) = std::move(result);
1223
- } else {
1224
- assert(s->columns);
1225
- s->columns->SetPlainValue(std::move(result));
1226
- }
1227
- }
1228
1197
  }
1229
1198
 
1230
1199
  *(s->found_final_value) = true;
@@ -1263,6 +1232,7 @@ bool MemTable::Get(const LookupKey& key, std::string* value,
1263
1232
  // Avoiding recording stats for speed.
1264
1233
  return false;
1265
1234
  }
1235
+
1266
1236
  PERF_TIMER_GUARD(get_from_memtable_time);
1267
1237
 
1268
1238
  std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
@@ -1286,8 +1256,7 @@ bool MemTable::Get(const LookupKey& key, std::string* value,
1286
1256
  bool found_final_value = false;
1287
1257
  bool merge_in_progress = s->IsMergeInProgress();
1288
1258
  bool may_contain = true;
1289
- size_t ts_sz = GetInternalKeyComparator().user_comparator()->timestamp_size();
1290
- Slice user_key_without_ts = StripTimestampFromUserKey(key.user_key(), ts_sz);
1259
+ Slice user_key_without_ts = StripTimestampFromUserKey(key.user_key(), ts_sz_);
1291
1260
  bool bloom_checked = false;
1292
1261
  if (bloom_filter_) {
1293
1262
  // when both memtable_whole_key_filtering and prefix_extractor_ are set,
@@ -1672,4 +1641,22 @@ uint64_t MemTable::GetMinLogContainingPrepSection() {
1672
1641
  return min_prep_log_referenced_.load();
1673
1642
  }
1674
1643
 
1644
+ void MemTable::MaybeUpdateNewestUDT(const Slice& user_key) {
1645
+ if (ts_sz_ == 0 || persist_user_defined_timestamps_) {
1646
+ return;
1647
+ }
1648
+ const Comparator* ucmp = GetInternalKeyComparator().user_comparator();
1649
+ Slice udt = ExtractTimestampFromUserKey(user_key, ts_sz_);
1650
+ if (newest_udt_.empty() || ucmp->CompareTimestamp(udt, newest_udt_) > 0) {
1651
+ newest_udt_ = udt;
1652
+ }
1653
+ }
1654
+
1655
+ const Slice& MemTable::GetNewestUDT() const {
1656
+ // This path should not be invoked for MemTables that does not enable the UDT
1657
+ // in Memtable only feature.
1658
+ assert(ts_sz_ > 0 && !persist_user_defined_timestamps_);
1659
+ return newest_udt_;
1660
+ }
1661
+
1675
1662
  } // namespace ROCKSDB_NAMESPACE
@@ -68,6 +68,7 @@ struct MemTablePostProcessInfo {
68
68
  uint64_t data_size = 0;
69
69
  uint64_t num_entries = 0;
70
70
  uint64_t num_deletes = 0;
71
+ uint64_t num_range_deletes = 0;
71
72
  };
72
73
 
73
74
  using MultiGetRange = MultiGetContext::Range;
@@ -332,6 +333,10 @@ class MemTable {
332
333
  num_deletes_.fetch_add(update_counters.num_deletes,
333
334
  std::memory_order_relaxed);
334
335
  }
336
+ if (update_counters.num_range_deletes > 0) {
337
+ num_range_deletes_.fetch_add(update_counters.num_range_deletes,
338
+ std::memory_order_relaxed);
339
+ }
335
340
  UpdateFlushState();
336
341
  }
337
342
 
@@ -349,10 +354,21 @@ class MemTable {
349
354
  return num_deletes_.load(std::memory_order_relaxed);
350
355
  }
351
356
 
357
+ // Get total number of range deletions in the mem table.
358
+ // REQUIRES: external synchronization to prevent simultaneous
359
+ // operations on the same MemTable (unless this Memtable is immutable).
360
+ uint64_t num_range_deletes() const {
361
+ return num_range_deletes_.load(std::memory_order_relaxed);
362
+ }
363
+
352
364
  uint64_t get_data_size() const {
353
365
  return data_size_.load(std::memory_order_relaxed);
354
366
  }
355
367
 
368
+ size_t write_buffer_size() const {
369
+ return write_buffer_size_.load(std::memory_order_relaxed);
370
+ }
371
+
356
372
  // Dynamically change the memtable's capacity. If set below the current usage,
357
373
  // the next key added will trigger a flush. Can only increase size when
358
374
  // memtable prefix bloom is disabled, since we can't easily allocate more
@@ -527,6 +543,14 @@ class MemTable {
527
543
  }
528
544
  }
529
545
 
546
+ // Get the newest user-defined timestamp contained in this MemTable. Check
547
+ // `newest_udt_` for what newer means. This method should only be invoked for
548
+ // an MemTable that has enabled user-defined timestamp feature and set
549
+ // `persist_user_defined_timestamps` to false. The tracked newest UDT will be
550
+ // used by flush job in the background to help check the MemTable's
551
+ // eligibility for Flush.
552
+ const Slice& GetNewestUDT() const;
553
+
530
554
  // Returns Corruption status if verification fails.
531
555
  static Status VerifyEntryChecksum(const char* entry,
532
556
  uint32_t protection_bytes_per_key,
@@ -553,6 +577,7 @@ class MemTable {
553
577
  std::atomic<uint64_t> data_size_;
554
578
  std::atomic<uint64_t> num_entries_;
555
579
  std::atomic<uint64_t> num_deletes_;
580
+ std::atomic<uint64_t> num_range_deletes_;
556
581
 
557
582
  // Dynamically changeable memtable option
558
583
  std::atomic<size_t> write_buffer_size_;
@@ -596,7 +621,7 @@ class MemTable {
596
621
  const SliceTransform* insert_with_hint_prefix_extractor_;
597
622
 
598
623
  // Insert hints for each prefix.
599
- UnorderedMapH<Slice, void*, SliceHasher> insert_hints_;
624
+ UnorderedMapH<Slice, void*, SliceHasher32> insert_hints_;
600
625
 
601
626
  // Timestamp of oldest key
602
627
  std::atomic<uint64_t> oldest_key_time_;
@@ -614,9 +639,26 @@ class MemTable {
614
639
  // Gets refreshed inside `ApproximateMemoryUsage()` or `ShouldFlushNow`
615
640
  std::atomic<uint64_t> approximate_memory_usage_;
616
641
 
642
+ // max range deletions in a memtable, before automatic flushing, 0 for
643
+ // unlimited.
644
+ uint32_t memtable_max_range_deletions_ = 0;
645
+
617
646
  // Flush job info of the current memtable.
618
647
  std::unique_ptr<FlushJobInfo> flush_job_info_;
619
648
 
649
+ // Size in bytes for the user-defined timestamps.
650
+ size_t ts_sz_;
651
+
652
+ // Whether to persist user-defined timestamps
653
+ bool persist_user_defined_timestamps_;
654
+
655
+ // Newest user-defined timestamp contained in this MemTable. For ts1, and ts2
656
+ // if Comparator::CompareTimestamp(ts1, ts2) > 0, ts1 is considered newer than
657
+ // ts2. We track this field for a MemTable if its column family has UDT
658
+ // feature enabled and the `persist_user_defined_timestamp` flag is false.
659
+ // Otherwise, this field just contains an empty Slice.
660
+ Slice newest_udt_;
661
+
620
662
  // Updates flush_state_ using ShouldFlushNow()
621
663
  void UpdateFlushState();
622
664
 
@@ -653,6 +695,8 @@ class MemTable {
653
695
  void UpdateEntryChecksum(const ProtectionInfoKVOS64* kv_prot_info,
654
696
  const Slice& key, const Slice& value, ValueType type,
655
697
  SequenceNumber s, char* checksum_ptr);
698
+
699
+ void MaybeUpdateNewestUDT(const Slice& user_key);
656
700
  };
657
701
 
658
702
  extern const char* EncodeKey(std::string* scratch, const Slice& target);