@nxtedition/rocksdb 15.4.0 → 15.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/binding.cc +24 -19
  2. package/cache.js +1 -1
  3. package/chained-batch.js +12 -3
  4. package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
  5. package/deps/rocksdb/rocksdb/BUCK +42 -0
  6. package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
  7. package/deps/rocksdb/rocksdb/Makefile +59 -32
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
  9. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
  10. package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
  11. package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
  12. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
  13. package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
  19. package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  25. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
  26. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
  28. package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
  29. package/deps/rocksdb/rocksdb/db/builder.h +7 -0
  30. package/deps/rocksdb/rocksdb/db/c.cc +373 -57
  31. package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
  32. package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
  33. package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
  34. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
  53. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  54. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
  55. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
  57. package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
  58. package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
  59. package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
  60. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
  61. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
  62. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
  63. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
  64. package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
  65. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
  66. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
  67. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
  68. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
  81. package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
  82. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
  83. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
  84. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
  85. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
  86. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
  87. package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
  88. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
  89. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
  91. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
  92. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
  93. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
  94. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
  95. package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
  96. package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
  97. package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
  98. package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
  99. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
  100. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
  101. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
  102. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
  103. package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
  104. package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
  105. package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
  106. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
  107. package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
  108. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
  110. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
  111. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
  112. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
  113. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
  114. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
  115. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
  116. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
  117. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  118. package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
  119. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
  120. package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
  121. package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
  122. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
  123. package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
  124. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
  125. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  126. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
  127. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
  128. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
  129. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
  130. package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
  131. package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
  132. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
  133. package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
  134. package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
  135. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
  136. package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
  137. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  138. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
  139. package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
  140. package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
  141. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
  142. package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
  143. package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
  144. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  145. package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
  146. package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
  147. package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
  148. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
  149. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
  150. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
  151. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
  152. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
  153. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
  159. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
  160. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
  161. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
  162. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
  163. package/deps/rocksdb/rocksdb/env/env.cc +1 -0
  164. package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
  165. package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
  166. package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
  167. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  168. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  169. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
  170. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
  171. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
  172. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
  173. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  174. package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
  175. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
  176. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
  177. package/deps/rocksdb/rocksdb/folly.mk +22 -5
  178. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
  179. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
  180. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
  181. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
  182. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
  183. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
  184. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
  185. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
  187. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
  188. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
  189. package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
  192. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
  193. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
  194. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
  195. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
  196. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
  197. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
  198. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
  199. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
  200. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
  202. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
  203. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
  204. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
  205. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
  206. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
  207. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
  208. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
  209. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
  210. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
  211. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
  212. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  213. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
  214. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
  215. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
  216. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
  217. package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
  218. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
  219. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
  220. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
  221. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
  222. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
  223. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
  224. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
  225. package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
  226. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  227. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
  228. package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
  229. package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
  230. package/deps/rocksdb/rocksdb/options/options.cc +5 -1
  231. package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
  232. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
  233. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
  234. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
  235. package/deps/rocksdb/rocksdb/port/lang.h +4 -0
  236. package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
  237. package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
  238. package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
  239. package/deps/rocksdb/rocksdb/src.mk +12 -0
  240. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
  241. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  242. package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
  243. package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
  247. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
  248. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
  249. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
  250. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
  251. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
  252. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
  253. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
  254. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
  255. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
  256. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
  257. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
  258. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
  259. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
  260. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  261. package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
  262. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
  263. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
  264. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
  265. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
  266. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
  267. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
  268. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
  269. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
  270. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
  271. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  272. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
  273. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
  274. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
  275. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
  276. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
  277. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
  278. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
  279. package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
  280. package/deps/rocksdb/rocksdb/table/format.cc +27 -15
  281. package/deps/rocksdb/rocksdb/table/format.h +41 -15
  282. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
  283. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
  284. package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
  285. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
  286. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  287. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
  288. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
  289. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
  290. package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
  291. package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
  292. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
  293. package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
  294. package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
  295. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
  296. package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
  297. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
  298. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
  299. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
  300. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
  301. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
  302. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
  303. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
  304. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
  305. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
  306. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
  307. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
  308. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
  309. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
  310. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
  311. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
  312. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
  313. package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
  314. package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
  315. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
  316. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
  317. package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
  318. package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
  319. package/deps/rocksdb/rocksdb/util/coding.h +14 -27
  320. package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
  321. package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
  322. package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
  323. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
  324. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
  325. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
  326. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
  327. package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
  328. package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
  329. package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
  330. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
  331. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
  332. package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
  333. package/deps/rocksdb/rocksdb/util/math.h +3 -1
  334. package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
  335. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
  336. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
  337. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
  338. package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
  339. package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
  340. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
  341. package/deps/rocksdb/rocksdb/util/status.cc +3 -1
  342. package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
  343. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
  344. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
  345. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
  346. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
  347. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
  348. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
  349. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
  350. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
  351. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
  352. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
  353. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
  354. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
  355. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
  356. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
  357. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
  358. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
  359. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
  360. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  361. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
  362. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
  363. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
  364. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
  365. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
  366. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
  367. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
  368. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
  369. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
  370. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
  371. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
  372. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
  373. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
  374. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
  375. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
  376. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
  377. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
  378. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  379. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
  380. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
  381. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
  382. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
  383. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
  384. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
  385. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
  386. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
  387. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
  388. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
  389. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
  390. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
  391. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  392. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  393. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
  394. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
  395. package/deps/rocksdb/rocksdb.gyp +7 -0
  396. package/index.js +11 -2
  397. package/iterator.js +15 -7
  398. package/package.json +1 -1
  399. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  400. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -7,9 +7,13 @@
7
7
  // Use of this source code is governed by a BSD-style license that can be
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
 
10
+ #include <set>
11
+
12
+ #include "db/column_family.h"
10
13
  #include "db/compaction/compaction.h"
11
14
  #include "db/db_test_util.h"
12
15
  #include "port/stack_trace.h"
16
+ #include "rocksdb/sst_file_reader.h"
13
17
  #include "test_util/testutil.h"
14
18
 
15
19
  namespace ROCKSDB_NAMESPACE {
@@ -48,6 +52,122 @@ class TimestampCompatibleCompactionTest : public DBTestBase {
48
52
  }
49
53
  return value;
50
54
  }
55
+
56
+ // Helper to get all files with their level and timestamps
57
+ std::vector<std::tuple<int, std::string, std::string>>
58
+ GetAllFileTimestamps() {
59
+ std::vector<std::tuple<int, std::string, std::string>> results;
60
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
61
+ auto* cfd = static_cast_with_check<ColumnFamilyHandleImpl>(cfh)->cfd();
62
+ auto* vstorage = cfd->current()->storage_info();
63
+
64
+ for (int level = 0; level < cfd->NumberLevels(); level++) {
65
+ for (auto* file : vstorage->LevelFiles(level)) {
66
+ results.emplace_back(level, file->min_timestamp, file->max_timestamp);
67
+ }
68
+ }
69
+ return results;
70
+ }
71
+
72
+ // Helper to compute overall min/max timestamps across all files
73
+ // Returns {min_ts, max_ts} as uint64_t values
74
+ // Asserts that all files have non-empty timestamps
75
+ std::pair<uint64_t, uint64_t> GetOverallTimestampRange() {
76
+ auto files = GetAllFileTimestamps();
77
+ EXPECT_GE(files.size(), 1U);
78
+
79
+ uint64_t overall_min = UINT64_MAX;
80
+ uint64_t overall_max = 0;
81
+ for (const auto& [level, min_ts, max_ts] : files) {
82
+ EXPECT_FALSE(min_ts.empty()) << "min_timestamp empty at level " << level;
83
+ EXPECT_FALSE(max_ts.empty()) << "max_timestamp empty at level " << level;
84
+
85
+ if (!min_ts.empty() && !max_ts.empty()) {
86
+ uint64_t file_min = DecodeFixed64(min_ts.data());
87
+ uint64_t file_max = DecodeFixed64(max_ts.data());
88
+ overall_min = std::min(overall_min, file_min);
89
+ overall_max = std::max(overall_max, file_max);
90
+ }
91
+ }
92
+ return {overall_min, overall_max};
93
+ }
94
+
95
+ // Helper to verify timestamp range matches expected values, including after
96
+ // reopen
97
+ void VerifyTimestampRangeWithPersistence(const Options& options,
98
+ uint64_t expected_min,
99
+ uint64_t expected_max) {
100
+ // Verify before reopen
101
+ auto [min_ts, max_ts] = GetOverallTimestampRange();
102
+ ASSERT_EQ(expected_min, min_ts);
103
+ ASSERT_EQ(expected_max, max_ts);
104
+
105
+ size_t file_count_before = GetAllFileTimestamps().size();
106
+
107
+ // Verify manifest persistence by reopening
108
+ Reopen(options);
109
+
110
+ // Verify after reopen
111
+ auto [reopened_min_ts, reopened_max_ts] = GetOverallTimestampRange();
112
+ ASSERT_EQ(expected_min, reopened_min_ts);
113
+ ASSERT_EQ(expected_max, reopened_max_ts);
114
+ ASSERT_EQ(file_count_before, GetAllFileTimestamps().size());
115
+ }
116
+
117
+ // Helper to create common options for UDT tests with level compaction
118
+ Options CreateTimestampOptions(bool disable_auto_compactions = false) {
119
+ Options options = CurrentOptions();
120
+ options.env = env_;
121
+ options.compaction_style = kCompactionStyleLevel;
122
+ options.num_levels = 4;
123
+ options.persist_user_defined_timestamps = true;
124
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
125
+ options.disable_auto_compactions = disable_auto_compactions;
126
+ return options;
127
+ }
128
+
129
+ // Helper to write test data with alternating timestamps in a range
130
+ // Writes keys [start_key, end_key) with timestamps alternating between
131
+ // min_ts and max_ts
132
+ void WriteDataWithTimestampRange(int start_key, int end_key, uint64_t min_ts,
133
+ uint64_t max_ts) {
134
+ std::string ts_buf;
135
+ for (int i = start_key; i < end_key; i++) {
136
+ ts_buf.clear();
137
+ uint64_t ts = (i % 2 == 0) ? min_ts : max_ts;
138
+ PutFixed64(&ts_buf, ts);
139
+ ASSERT_OK(db_->Put(WriteOptions(), Key(i), ts_buf,
140
+ "value" + std::to_string(i)));
141
+ }
142
+ }
143
+
144
+ // Helper to check if any file has the expected timestamp range
145
+ bool HasFileWithTimestampRange(uint64_t expected_min, uint64_t expected_max) {
146
+ auto file_timestamps = GetAllFileTimestamps();
147
+ for (const auto& [level, min_ts, max_ts] : file_timestamps) {
148
+ if (!min_ts.empty() && !max_ts.empty()) {
149
+ uint64_t file_min = DecodeFixed64(min_ts.data());
150
+ uint64_t file_max = DecodeFixed64(max_ts.data());
151
+ if (file_min == expected_min && file_max == expected_max) {
152
+ return true;
153
+ }
154
+ }
155
+ }
156
+ return false;
157
+ }
158
+
159
+ // Helper to verify data is readable with a given timestamp
160
+ void VerifyDataReadable(int key, const std::string& expected_value,
161
+ uint64_t read_ts) {
162
+ std::string value;
163
+ std::string ts_buf;
164
+ PutFixed64(&ts_buf, read_ts);
165
+ ReadOptions read_opts;
166
+ Slice ts_slice(ts_buf);
167
+ read_opts.timestamp = &ts_slice;
168
+ ASSERT_OK(db_->Get(read_opts, Key(key), &value));
169
+ ASSERT_EQ(expected_value, value);
170
+ }
51
171
  };
52
172
 
53
173
  TEST_F(TimestampCompatibleCompactionTest, UserKeyCrossFileBoundary) {
@@ -344,6 +464,385 @@ TEST_F(TimestampCompatibleCompactionTest, EmptyCompactionOutput) {
344
464
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
345
465
  }
346
466
 
467
+ TEST_F(TimestampCompatibleCompactionTest, SeqnoZeroingWithUDT) {
468
+ // This test validates that seqno is only zeroed when the timestamp is older
469
+ // than full_history_ts_low_. Before the fix, seqno was incorrectly zeroed
470
+ // even when UDT was enabled but timestamp wasn't old enough.
471
+
472
+ Options options = CurrentOptions();
473
+ options.env = env_;
474
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
475
+ options.disable_auto_compactions = true;
476
+ DestroyAndReopen(options);
477
+
478
+ // Track seqno zeroing events and which keys are zeroed
479
+ std::set<std::string> zeroed_keys;
480
+ SyncPoint::GetInstance()->SetCallBack(
481
+ "CompactionIterator::PrepareOutput:ZeroingSeq", [&](void* arg) {
482
+ auto* ikey = static_cast<ParsedInternalKey*>(arg);
483
+ ASSERT_EQ(0, ikey->sequence);
484
+ // Extract user key without timestamp (last 8 bytes)
485
+ Slice user_key_with_ts = ikey->user_key;
486
+ std::string user_key =
487
+ user_key_with_ts.ToString().substr(0, user_key_with_ts.size() - 8);
488
+ zeroed_keys.insert(user_key);
489
+ });
490
+ SyncPoint::GetInstance()->EnableProcessing();
491
+
492
+ // Case 1: Test that seqno is NOT zeroed when full_history_ts_low is not set
493
+ // Write a key with timestamp 100
494
+ std::string ts_str = Timestamp(100);
495
+ ASSERT_OK(db_->Put(WriteOptions(), "key1", ts_str, "value1"));
496
+ ASSERT_OK(Flush());
497
+
498
+ zeroed_keys.clear();
499
+ {
500
+ CompactRangeOptions cro;
501
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
502
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
503
+ }
504
+ // With UDT enabled and no full_history_ts_low, seqno should NOT be zeroed
505
+ ASSERT_TRUE(zeroed_keys.empty());
506
+
507
+ // Case 2: Test that seqno IS zeroed when timestamp < full_history_ts_low
508
+ // Write a new key with timestamp 200
509
+ ts_str = Timestamp(200);
510
+ ASSERT_OK(db_->Put(WriteOptions(), "key2", ts_str, "value2"));
511
+ ASSERT_OK(Flush());
512
+
513
+ zeroed_keys.clear();
514
+ {
515
+ // Set full_history_ts_low to 300, so ts < 300 should be zeroed
516
+ std::string full_history_ts_low = Timestamp(300);
517
+ Slice ts_slice = full_history_ts_low;
518
+ CompactRangeOptions cro;
519
+ cro.full_history_ts_low = &ts_slice;
520
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
521
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
522
+ }
523
+ // key1 (ts=100) and key2 (ts=200) both have ts < 300, so both should be
524
+ // zeroed
525
+ ASSERT_EQ(2u, zeroed_keys.size());
526
+ ASSERT_TRUE(zeroed_keys.count("key1") > 0);
527
+ ASSERT_TRUE(zeroed_keys.count("key2") > 0);
528
+
529
+ // Case 3: Write a new key with timestamp >= full_history_ts_low
530
+ // and verify it is NOT zeroed while old keys are re-zeroed
531
+ ts_str = Timestamp(500);
532
+ ASSERT_OK(db_->Put(WriteOptions(), "key3", ts_str, "value3"));
533
+ ASSERT_OK(Flush());
534
+
535
+ zeroed_keys.clear();
536
+ {
537
+ // Set full_history_ts_low to 400
538
+ // key1 (ts=100) and key2 (ts=200) have ts < 400, will be re-processed
539
+ // key3 (ts=500) has ts >= 400, should NOT be zeroed
540
+ std::string full_history_ts_low = Timestamp(400);
541
+ Slice ts_slice = full_history_ts_low;
542
+ CompactRangeOptions cro;
543
+ cro.full_history_ts_low = &ts_slice;
544
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
545
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
546
+ }
547
+ // key3 should NOT appear in zeroed_keys since ts=500 >= 400
548
+ ASSERT_TRUE(zeroed_keys.count("key3") == 0);
549
+
550
+ SyncPoint::GetInstance()->DisableProcessing();
551
+ SyncPoint::GetInstance()->ClearAllCallBacks();
552
+
553
+ // Verify data is still readable
554
+ std::string value;
555
+ ts_str = Timestamp(600);
556
+ Slice read_ts = ts_str;
557
+ ReadOptions read_opts;
558
+ read_opts.timestamp = &read_ts;
559
+ ASSERT_OK(db_->Get(read_opts, "key1", &value));
560
+ ASSERT_EQ("value1", value);
561
+ ASSERT_OK(db_->Get(read_opts, "key2", &value));
562
+ ASSERT_EQ("value2", value);
563
+ ASSERT_OK(db_->Get(read_opts, "key3", &value));
564
+ ASSERT_EQ("value3", value);
565
+ }
566
+
567
+ // Test that files with max_timestamp >= full_history_ts_low are not marked
568
+ // for bottommost compaction, which prevents infinite compaction loops.
569
+ TEST_F(TimestampCompatibleCompactionTest,
570
+ BottommostCompactionRespectsFullHistoryTsLow) {
571
+ Options options = CreateTimestampOptions();
572
+ options.level0_file_num_compaction_trigger = 4;
573
+
574
+ DestroyAndReopen(options);
575
+
576
+ // Write some data with timestamps 100-199
577
+ std::string ts_buf;
578
+ for (int i = 0; i < 100; i++) {
579
+ ts_buf.clear();
580
+ PutFixed64(&ts_buf, 100 + i);
581
+ ASSERT_OK(
582
+ db_->Put(WriteOptions(), Key(i), ts_buf, "value" + std::to_string(i)));
583
+ }
584
+ ASSERT_OK(Flush());
585
+
586
+ // Compact to the bottommost level
587
+ CompactRangeOptions cro;
588
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
589
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
590
+
591
+ // Set full_history_ts_low to 150 - files with max_ts >= 150 should NOT be
592
+ // marked for bottommost compaction since seqno cannot be zeroed
593
+ ts_buf.clear();
594
+ PutFixed64(&ts_buf, 150);
595
+ ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_buf));
596
+
597
+ // Release a snapshot to potentially trigger bottommost file marking
598
+ // but files should NOT be marked because max_ts (199) >= full_history_ts_low
599
+ // (150)
600
+ const Snapshot* snap = db_->GetSnapshot();
601
+ db_->ReleaseSnapshot(snap);
602
+
603
+ // Wait for any scheduled compactions - should complete without infinite loop
604
+ // Use a reasonable timeout to detect infinite loops
605
+ WaitForCompactOptions wfc_options;
606
+ wfc_options.timeout = std::chrono::microseconds(5000000); // 5 seconds
607
+ Status s = dbfull()->WaitForCompact(wfc_options);
608
+ // Should succeed without timeout (no infinite compaction loop)
609
+ ASSERT_TRUE(s.ok() || s.IsTimedOut());
610
+ if (s.IsTimedOut()) {
611
+ // If timeout, the fix is not working - this should not happen
612
+ FAIL() << "WaitForCompact timed out - possible infinite compaction loop";
613
+ }
614
+
615
+ // Now set full_history_ts_low beyond max timestamp in the file (200+)
616
+ // This should allow the file to be properly marked and compacted
617
+ ts_buf.clear();
618
+ PutFixed64(&ts_buf, 300);
619
+ ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_buf));
620
+
621
+ // Trigger another snapshot release to potentially mark files
622
+ snap = db_->GetSnapshot();
623
+ db_->ReleaseSnapshot(snap);
624
+
625
+ // Now compaction should clean up the file.
626
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
627
+ }
628
+
629
+ // Test that files are NOT marked for bottommost compaction when UDT is enabled
630
+ // and full_history_ts_low has never been set (empty).
631
+ TEST_F(TimestampCompatibleCompactionTest,
632
+ BottommostCompactionSkipsWhenFullHistoryTsLowNotSet) {
633
+ Options options = CreateTimestampOptions();
634
+
635
+ DestroyAndReopen(options);
636
+
637
+ // Write some data with timestamps 100-199
638
+ std::string ts_buf;
639
+ for (int i = 0; i < 100; i++) {
640
+ ts_buf.clear();
641
+ PutFixed64(&ts_buf, 100 + i);
642
+ ASSERT_OK(
643
+ db_->Put(WriteOptions(), Key(i), ts_buf, "value" + std::to_string(i)));
644
+ }
645
+ ASSERT_OK(Flush());
646
+
647
+ // Compact to the bottommost level without setting full_history_ts_low
648
+ CompactRangeOptions cro;
649
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
650
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
651
+
652
+ // Verify files have valid max_timestamp
653
+ auto file_timestamps = GetAllFileTimestamps();
654
+ ASSERT_GE(file_timestamps.size(), 1U);
655
+ for (const auto& [level, min_ts, max_ts] : file_timestamps) {
656
+ ASSERT_FALSE(max_ts.empty()) << "max_timestamp should not be empty";
657
+ }
658
+
659
+ // full_history_ts_low is NOT set (empty), so files should NOT be marked
660
+ // for bottommost compaction even after releasing a snapshot.
661
+ // This tests the branch: if (full_history_ts_low.empty()) { continue; }
662
+ const Snapshot* snap = db_->GetSnapshot();
663
+ db_->ReleaseSnapshot(snap);
664
+
665
+ // Wait for any scheduled compactions
666
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
667
+
668
+ // Now set full_history_ts_low to a value > max_timestamp (199) in the file
669
+ // This should allow the file to be properly marked and compacted
670
+ ts_buf.clear();
671
+ PutFixed64(&ts_buf, 300);
672
+ ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_buf));
673
+
674
+ // Trigger another snapshot release to potentially mark files
675
+ snap = db_->GetSnapshot();
676
+ db_->ReleaseSnapshot(snap);
677
+
678
+ // Now compaction should be able to proceed since full_history_ts_low is set
679
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
680
+
681
+ // Verify data is still readable
682
+ VerifyDataReadable(0, "value0", 250);
683
+ }
684
+
685
+ // Test that ingested SST files created with UDT have their min/max timestamps
686
+ // properly extracted from table properties and populated in FileMetaData.
687
+ // This verifies the fix in external_sst_file_ingestion_job.cc that calls
688
+ // ExtractTimestampFromTableProperties after creating FileMetaData.
689
+ TEST_F(TimestampCompatibleCompactionTest,
690
+ IngestedFileTimestampsExtractedFromTableProperties) {
691
+ Options options = CreateTimestampOptions();
692
+
693
+ DestroyAndReopen(options);
694
+
695
+ // Create an SST file WITH timestamps using SstFileWriter
696
+ std::string sst_file = dbname_ + "/ingested_udt_file.sst";
697
+ const uint64_t kMinTs = 100;
698
+ const uint64_t kMaxTs = 200;
699
+
700
+ {
701
+ SstFileWriter sst_file_writer(EnvOptions(), options);
702
+ ASSERT_OK(sst_file_writer.Open(sst_file));
703
+
704
+ std::string ts_buf;
705
+ for (int i = 0; i < 10; i++) {
706
+ // Alternate between min and max timestamps
707
+ uint64_t ts = (i % 2 == 0) ? kMinTs : kMaxTs;
708
+ ts_buf.clear();
709
+ PutFixed64(&ts_buf, ts);
710
+ // SstFileWriter with UDT comparator requires key with timestamp
711
+ ASSERT_OK(
712
+ sst_file_writer.Put(Key(i), ts_buf, "value" + std::to_string(i)));
713
+ }
714
+ ASSERT_OK(sst_file_writer.Finish());
715
+ }
716
+
717
+ // Verify the SST file has timestamp properties before ingestion
718
+ {
719
+ std::unique_ptr<SstFileReader> reader(new SstFileReader(options));
720
+ ASSERT_OK(reader->Open(sst_file));
721
+ auto props = reader->GetTableProperties();
722
+ auto& user_collected = props->user_collected_properties;
723
+ ASSERT_TRUE(user_collected.find("rocksdb.timestamp_min") !=
724
+ user_collected.end())
725
+ << "SST file should have rocksdb.timestamp_min property";
726
+ ASSERT_TRUE(user_collected.find("rocksdb.timestamp_max") !=
727
+ user_collected.end())
728
+ << "SST file should have rocksdb.timestamp_max property";
729
+ }
730
+
731
+ // Ingest the SST file
732
+ IngestExternalFileOptions ifo;
733
+ ifo.move_files = false;
734
+ ASSERT_OK(db_->IngestExternalFile({sst_file}, ifo));
735
+
736
+ // Verify the ingested file has proper timestamps in FileMetaData
737
+ ASSERT_TRUE(HasFileWithTimestampRange(kMinTs, kMaxTs))
738
+ << "Ingested file should have min_timestamp=" << kMinTs
739
+ << " and max_timestamp=" << kMaxTs << " in FileMetaData";
740
+
741
+ // Verify timestamps persist after reopen
742
+ Reopen(options);
743
+
744
+ ASSERT_TRUE(HasFileWithTimestampRange(kMinTs, kMaxTs))
745
+ << "Ingested file timestamps should persist after reopen";
746
+
747
+ // Verify data is readable
748
+ VerifyDataReadable(0, "value0", kMaxTs);
749
+
750
+ // Clean up
751
+ ASSERT_OK(env_->DeleteFile(sst_file));
752
+ }
753
+
754
+ // Test that min/max timestamps are correctly tracked in FileMetaData and
755
+ // persisted in the manifest during flush.
756
+ TEST_F(TimestampCompatibleCompactionTest, TimestampRangePersistenceFlush) {
757
+ Options options = CreateTimestampOptions();
758
+
759
+ DestroyAndReopen(options);
760
+
761
+ // Expected timestamp range
762
+ const uint64_t kMinTs = 100;
763
+ const uint64_t kMaxTs = 200;
764
+
765
+ // Write data with specific timestamp range
766
+ WriteDataWithTimestampRange(0, 50, kMinTs, kMaxTs);
767
+ ASSERT_OK(Flush());
768
+
769
+ // First verify table properties have the timestamps
770
+ // (this confirms TimestampTablePropertiesCollector is working)
771
+ TablePropertiesCollection props;
772
+ ASSERT_OK(db_->GetPropertiesOfAllTables(&props));
773
+ ASSERT_EQ(1U, props.size());
774
+ for (const auto& item : props) {
775
+ auto& user_collected = item.second->user_collected_properties;
776
+ ASSERT_TRUE(user_collected.find("rocksdb.timestamp_min") !=
777
+ user_collected.end());
778
+ ASSERT_TRUE(user_collected.find("rocksdb.timestamp_max") !=
779
+ user_collected.end());
780
+ // Verify the collected timestamps match expected values
781
+ std::string collected_min_ts = user_collected.at("rocksdb.timestamp_min");
782
+ std::string collected_max_ts = user_collected.at("rocksdb.timestamp_max");
783
+ ASSERT_EQ(kMinTs, DecodeFixed64(collected_min_ts.data()));
784
+ ASSERT_EQ(kMaxTs, DecodeFixed64(collected_max_ts.data()));
785
+ }
786
+
787
+ // Verify FileMetaData timestamps and persistence through reopen
788
+ VerifyTimestampRangeWithPersistence(options, kMinTs, kMaxTs);
789
+
790
+ // Verify we can still read the data
791
+ VerifyDataReadable(0, "value0", kMaxTs);
792
+ }
793
+
794
+ // Test that min/max timestamps are correctly merged during compaction
795
+ // and persisted in the manifest.
796
+ TEST_F(TimestampCompatibleCompactionTest, TimestampRangePersistenceCompaction) {
797
+ Options options = CreateTimestampOptions(true /* disable_auto_compactions */);
798
+
799
+ DestroyAndReopen(options);
800
+
801
+ // Create multiple L0 files with different timestamp ranges
802
+ // File 1: timestamps 100-150
803
+ const uint64_t kFile1MinTs = 100;
804
+ const uint64_t kFile1MaxTs = 150;
805
+ WriteDataWithTimestampRange(0, 10, kFile1MinTs, kFile1MaxTs);
806
+ ASSERT_OK(Flush());
807
+
808
+ // File 2: timestamps 50-80 (earlier range)
809
+ const uint64_t kFile2MinTs = 50;
810
+ const uint64_t kFile2MaxTs = 80;
811
+ WriteDataWithTimestampRange(10, 20, kFile2MinTs, kFile2MaxTs);
812
+ ASSERT_OK(Flush());
813
+
814
+ // File 3: timestamps 200-300 (later range)
815
+ const uint64_t kFile3MinTs = 200;
816
+ const uint64_t kFile3MaxTs = 300;
817
+ WriteDataWithTimestampRange(20, 30, kFile3MinTs, kFile3MaxTs);
818
+ ASSERT_OK(Flush());
819
+
820
+ // Expected combined range: min=50, max=300
821
+ const uint64_t kExpectedMinTs = 50;
822
+ const uint64_t kExpectedMaxTs = 300;
823
+
824
+ // Verify we have 3 L0 files before compaction with valid timestamps
825
+ auto files_before = GetAllFileTimestamps();
826
+ ASSERT_EQ(3U, files_before.size());
827
+ for (const auto& [level, min_ts, max_ts] : files_before) {
828
+ ASSERT_EQ(0, level); // All files should be in L0
829
+ ASSERT_FALSE(min_ts.empty());
830
+ ASSERT_FALSE(max_ts.empty());
831
+ }
832
+
833
+ // Trigger compaction
834
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
835
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
836
+
837
+ // Verify timestamp range and persistence through reopen
838
+ VerifyTimestampRangeWithPersistence(options, kExpectedMinTs, kExpectedMaxTs);
839
+
840
+ // Verify data is still readable
841
+ VerifyDataReadable(0, "value0", kExpectedMaxTs);
842
+ VerifyDataReadable(15, "value15", kExpectedMaxTs);
843
+ VerifyDataReadable(25, "value25", kExpectedMaxTs);
844
+ }
845
+
347
846
  } // namespace ROCKSDB_NAMESPACE
348
847
 
349
848
  int main(int argc, char** argv) {