@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
@@ -17,10 +17,10 @@
17
17
  #include "rocksdb/file_system.h"
18
18
  #include "rocksdb/slice.h"
19
19
  #include "rocksdb/status.h"
20
+ #include "table/format.h"
20
21
  #include "table/multiget_context.h"
21
22
  #include "test_util/sync_point.h"
22
23
  #include "util/compression.h"
23
- #include "util/crc32c.h"
24
24
  #include "util/stop_watch.h"
25
25
 
26
26
  namespace ROCKSDB_NAMESPACE {
@@ -69,9 +69,16 @@ Status BlobFileReader::Create(
69
69
  }
70
70
  }
71
71
 
72
- blob_file_reader->reset(
73
- new BlobFileReader(std::move(file_reader), file_size, compression_type,
74
- immutable_options.clock, statistics));
72
+ std::shared_ptr<Decompressor> decompressor;
73
+ if (compression_type != kNoCompression) {
74
+ // The blob format has always used compression format 2
75
+ decompressor = GetBuiltinV2CompressionManager()->GetDecompressorOptimizeFor(
76
+ compression_type);
77
+ }
78
+
79
+ blob_file_reader->reset(new BlobFileReader(
80
+ std::move(file_reader), file_size, compression_type,
81
+ std::move(decompressor), immutable_options.clock, statistics));
75
82
 
76
83
  return Status::OK();
77
84
  }
@@ -282,11 +289,13 @@ Status BlobFileReader::ReadFromFile(const RandomAccessFileReader* file_reader,
282
289
 
283
290
  BlobFileReader::BlobFileReader(
284
291
  std::unique_ptr<RandomAccessFileReader>&& file_reader, uint64_t file_size,
285
- CompressionType compression_type, SystemClock* clock,
292
+ CompressionType compression_type,
293
+ std::shared_ptr<Decompressor> decompressor, SystemClock* clock,
286
294
  Statistics* statistics)
287
295
  : file_reader_(std::move(file_reader)),
288
296
  file_size_(file_size),
289
297
  compression_type_(compression_type),
298
+ decompressor_(std::move(decompressor)),
290
299
  clock_(clock),
291
300
  statistics_(statistics) {
292
301
  assert(file_reader_);
@@ -375,8 +384,9 @@ Status BlobFileReader::GetBlob(
375
384
  const Slice value_slice(record_slice.data() + adjustment, value_size);
376
385
 
377
386
  {
378
- const Status s = UncompressBlobIfNeeded(
379
- value_slice, compression_type, allocator, clock_, statistics_, result);
387
+ const Status s = UncompressBlobIfNeeded(value_slice, compression_type,
388
+ decompressor_.get(), allocator,
389
+ clock_, statistics_, result);
380
390
  if (!s.ok()) {
381
391
  return s;
382
392
  }
@@ -523,10 +533,10 @@ void BlobFileReader::MultiGetBlob(
523
533
  }
524
534
 
525
535
  // Uncompress blob if needed
526
- Slice value_slice(record_slice.data() + adjustments[i], req->len);
527
- *req->status =
528
- UncompressBlobIfNeeded(value_slice, compression_type_, allocator,
529
- clock_, statistics_, &blob_reqs[i].second);
536
+ Slice value_slice(record_slice.data() + adjustments[j - 1], req->len);
537
+ *req->status = UncompressBlobIfNeeded(
538
+ value_slice, compression_type_, decompressor_.get(), allocator, clock_,
539
+ statistics_, &blob_reqs[i].second);
530
540
  if (req->status->ok()) {
531
541
  total_bytes += record_slice.size();
532
542
  }
@@ -583,8 +593,8 @@ Status BlobFileReader::VerifyBlob(const Slice& record_slice,
583
593
 
584
594
  Status BlobFileReader::UncompressBlobIfNeeded(
585
595
  const Slice& value_slice, CompressionType compression_type,
586
- MemoryAllocator* allocator, SystemClock* clock, Statistics* statistics,
587
- std::unique_ptr<BlobContents>* result) {
596
+ Decompressor* decompressor, MemoryAllocator* allocator, SystemClock* clock,
597
+ Statistics* statistics, std::unique_ptr<BlobContents>* result) {
588
598
  assert(result);
589
599
 
590
600
  if (compression_type == kNoCompression) {
@@ -593,31 +603,33 @@ Status BlobFileReader::UncompressBlobIfNeeded(
593
603
  return Status::OK();
594
604
  }
595
605
 
596
- UncompressionContext context(compression_type);
597
- UncompressionInfo info(context, UncompressionDict::GetEmptyDict(),
598
- compression_type);
606
+ assert(decompressor);
599
607
 
600
- size_t uncompressed_size = 0;
601
- constexpr uint32_t compression_format_version = 2;
608
+ Decompressor::Args args;
609
+ args.compression_type = compression_type;
610
+ args.compressed_data = value_slice;
602
611
 
603
- CacheAllocationPtr output;
612
+ Status s = decompressor->ExtractUncompressedSize(args);
613
+ if (!s.ok()) {
614
+ return Status::Corruption(s.ToString());
615
+ }
616
+
617
+ CacheAllocationPtr output = AllocateBlock(args.uncompressed_size, allocator);
604
618
 
605
619
  {
606
620
  PERF_TIMER_GUARD(blob_decompress_time);
607
621
  StopWatch stop_watch(clock, statistics, BLOB_DB_DECOMPRESSION_MICROS);
608
- output = OLD_UncompressData(info, value_slice.data(), value_slice.size(),
609
- &uncompressed_size, compression_format_version,
610
- allocator);
622
+ s = decompressor->DecompressBlock(args, output.get());
611
623
  }
612
624
 
613
625
  TEST_SYNC_POINT_CALLBACK(
614
- "BlobFileReader::UncompressBlobIfNeeded:TamperWithResult", &output);
626
+ "BlobFileReader::UncompressBlobIfNeeded:TamperWithResult", &s);
615
627
 
616
- if (!output) {
617
- return Status::Corruption("Unable to uncompress blob");
628
+ if (!s.ok()) {
629
+ return Status::Corruption(s.ToString());
618
630
  }
619
631
 
620
- result->reset(new BlobContents(std::move(output), uncompressed_size));
632
+ result->reset(new BlobContents(std::move(output), args.uncompressed_size));
621
633
 
622
634
  return Status::OK();
623
635
  }
@@ -10,6 +10,7 @@
10
10
 
11
11
  #include "db/blob/blob_read_request.h"
12
12
  #include "file/random_access_file_reader.h"
13
+ #include "rocksdb/advanced_compression.h"
13
14
  #include "rocksdb/compression_type.h"
14
15
  #include "rocksdb/rocksdb_namespace.h"
15
16
  #include "util/autovector.h"
@@ -64,7 +65,8 @@ class BlobFileReader {
64
65
  private:
65
66
  BlobFileReader(std::unique_ptr<RandomAccessFileReader>&& file_reader,
66
67
  uint64_t file_size, CompressionType compression_type,
67
- SystemClock* clock, Statistics* statistics);
68
+ std::shared_ptr<Decompressor> decompressor, SystemClock* clock,
69
+ Statistics* statistics);
68
70
 
69
71
  static Status OpenFile(const ImmutableOptions& immutable_options,
70
72
  const FileOptions& file_opts,
@@ -96,6 +98,7 @@ class BlobFileReader {
96
98
 
97
99
  static Status UncompressBlobIfNeeded(const Slice& value_slice,
98
100
  CompressionType compression_type,
101
+ Decompressor* decompressor,
99
102
  MemoryAllocator* allocator,
100
103
  SystemClock* clock,
101
104
  Statistics* statistics,
@@ -104,6 +107,7 @@ class BlobFileReader {
104
107
  std::unique_ptr<RandomAccessFileReader> file_reader_;
105
108
  uint64_t file_size_;
106
109
  CompressionType compression_type_;
110
+ std::shared_ptr<Decompressor> decompressor_;
107
111
  SystemClock* clock_;
108
112
  Statistics* statistics_;
109
113
  };
@@ -65,7 +65,7 @@ void WriteBlobFile(const ImmutableOptions& immutable_options,
65
65
 
66
66
  ASSERT_OK(blob_log_writer.WriteHeader(WriteOptions(), header));
67
67
 
68
- std::vector<std::string> compressed_blobs(num);
68
+ std::vector<GrowableBuffer> compressed_blobs(num);
69
69
  std::vector<Slice> blobs_to_write(num);
70
70
  if (kNoCompression == compression) {
71
71
  for (size_t i = 0; i < num; ++i) {
@@ -73,16 +73,13 @@ void WriteBlobFile(const ImmutableOptions& immutable_options,
73
73
  blob_sizes[i] = blobs[i].size();
74
74
  }
75
75
  } else {
76
- CompressionOptions opts;
77
- CompressionContext context(compression, opts);
78
- CompressionInfo info(opts, context, CompressionDict::GetEmptyDict(),
79
- compression);
80
-
81
- constexpr uint32_t compression_format_version = 2;
76
+ auto compressor =
77
+ GetBuiltinV2CompressionManager()->GetCompressor({}, compression);
82
78
 
83
79
  for (size_t i = 0; i < num; ++i) {
84
- ASSERT_TRUE(OLD_CompressData(blobs[i], info, compression_format_version,
85
- &compressed_blobs[i]));
80
+ ASSERT_OK(LegacyForceBuiltinCompression(*compressor,
81
+ /*working_area=*/nullptr,
82
+ blobs[i], &compressed_blobs[i]));
86
83
  blobs_to_write[i] = compressed_blobs[i];
87
84
  blob_sizes[i] = compressed_blobs[i].size();
88
85
  }
@@ -809,11 +806,10 @@ TEST_F(BlobFileReaderTest, UncompressionError) {
809
806
 
810
807
  SyncPoint::GetInstance()->SetCallBack(
811
808
  "BlobFileReader::UncompressBlobIfNeeded:TamperWithResult", [](void* arg) {
812
- CacheAllocationPtr* const output =
813
- static_cast<CacheAllocationPtr*>(arg);
814
- assert(output);
809
+ auto* result = static_cast<Status*>(arg);
810
+ assert(result);
815
811
 
816
- output->reset();
812
+ *result = Status::Corruption("Injected result");
817
813
  });
818
814
 
819
815
  SyncPoint::GetInstance()->EnableProcessing();
@@ -824,11 +820,12 @@ TEST_F(BlobFileReaderTest, UncompressionError) {
824
820
  std::unique_ptr<BlobContents> value;
825
821
  uint64_t bytes_read = 0;
826
822
 
827
- ASSERT_TRUE(reader
828
- ->GetBlob(ReadOptions(), key, blob_offset, blob_size,
829
- kSnappyCompression, prefetch_buffer, allocator,
830
- &value, &bytes_read)
831
- .IsCorruption());
823
+ ASSERT_EQ(reader
824
+ ->GetBlob(ReadOptions(), key, blob_offset, blob_size,
825
+ kSnappyCompression, prefetch_buffer, allocator,
826
+ &value, &bytes_read)
827
+ .code(),
828
+ Status::Code::kCorruption);
832
829
  ASSERT_EQ(value, nullptr);
833
830
  ASSERT_EQ(bytes_read, 0);
834
831
 
@@ -1014,6 +1011,92 @@ TEST_P(BlobFileReaderDecodingErrorTest, DecodingError) {
1014
1011
  SyncPoint::GetInstance()->ClearAllCallBacks();
1015
1012
  }
1016
1013
 
1014
+ TEST_F(BlobFileReaderTest, MultiGetBlobWithFailedValidation) {
1015
+ // Test that MultiGetBlob correctly handles the case where some requests
1016
+ // fail validation. The adjustments vector is only populated for requests
1017
+ // that pass validation, so the indices must track correctly.
1018
+ Options options;
1019
+ options.env = mock_env_.get();
1020
+ options.cf_paths.emplace_back(
1021
+ test::PerThreadDBPath(
1022
+ mock_env_.get(),
1023
+ "BlobFileReaderTest_MultiGetBlobWithFailedValidation"),
1024
+ 0);
1025
+ options.enable_blob_files = true;
1026
+
1027
+ ImmutableOptions immutable_options(options);
1028
+
1029
+ constexpr uint32_t column_family_id = 1;
1030
+ constexpr bool has_ttl = false;
1031
+ constexpr ExpirationRange expiration_range;
1032
+ constexpr uint64_t blob_file_number = 1;
1033
+ constexpr size_t num_blobs = 3;
1034
+ const std::vector<std::string> key_strs = {"key1", "key2", "key3"};
1035
+ const std::vector<std::string> blob_strs = {"blob1", "blob2", "blob3"};
1036
+
1037
+ const std::vector<Slice> keys = {key_strs[0], key_strs[1], key_strs[2]};
1038
+ const std::vector<Slice> blobs = {blob_strs[0], blob_strs[1], blob_strs[2]};
1039
+
1040
+ std::vector<uint64_t> blob_offsets(keys.size());
1041
+ std::vector<uint64_t> blob_sizes(keys.size());
1042
+
1043
+ WriteBlobFile(immutable_options, column_family_id, has_ttl, expiration_range,
1044
+ expiration_range, blob_file_number, keys, blobs, kNoCompression,
1045
+ blob_offsets, blob_sizes);
1046
+
1047
+ constexpr HistogramImpl* blob_file_read_hist = nullptr;
1048
+
1049
+ std::unique_ptr<BlobFileReader> reader;
1050
+
1051
+ ReadOptions read_options;
1052
+ ASSERT_OK(BlobFileReader::Create(
1053
+ immutable_options, read_options, FileOptions(), column_family_id,
1054
+ blob_file_read_hist, blob_file_number, nullptr /*IOTracer*/, &reader));
1055
+
1056
+ // Enable checksum verification so adjustments are non-zero
1057
+ read_options.verify_checksums = true;
1058
+ constexpr MemoryAllocator* allocator = nullptr;
1059
+
1060
+ // Fail the first request by giving it an invalid offset (too small).
1061
+ // This causes the first request to be skipped in the adjustments vector,
1062
+ // so adjustments has only 2 entries (for blobs 1 and 2), while blob_reqs
1063
+ // has 3 entries. Without the fix, adjustments[i] would use the wrong
1064
+ // index for the remaining valid requests.
1065
+ std::array<Status, num_blobs> statuses_buf;
1066
+ std::array<BlobReadRequest, num_blobs> requests_buf;
1067
+ autovector<std::pair<BlobReadRequest*, std::unique_ptr<BlobContents>>>
1068
+ blob_reqs;
1069
+
1070
+ // First request: invalid offset (too small, will fail validation)
1071
+ requests_buf[0] = BlobReadRequest(keys[0], /*offset=*/0, blob_sizes[0],
1072
+ kNoCompression, nullptr, &statuses_buf[0]);
1073
+ // Second and third requests: valid
1074
+ requests_buf[1] = BlobReadRequest(keys[1], blob_offsets[1], blob_sizes[1],
1075
+ kNoCompression, nullptr, &statuses_buf[1]);
1076
+ requests_buf[2] = BlobReadRequest(keys[2], blob_offsets[2], blob_sizes[2],
1077
+ kNoCompression, nullptr, &statuses_buf[2]);
1078
+
1079
+ for (size_t i = 0; i < num_blobs; ++i) {
1080
+ blob_reqs.emplace_back(&requests_buf[i], std::unique_ptr<BlobContents>());
1081
+ }
1082
+
1083
+ uint64_t bytes_read = 0;
1084
+ reader->MultiGetBlob(read_options, allocator, blob_reqs, &bytes_read);
1085
+
1086
+ // First request should fail validation
1087
+ ASSERT_TRUE(statuses_buf[0].IsCorruption());
1088
+ ASSERT_EQ(blob_reqs[0].second, nullptr);
1089
+
1090
+ // Second and third requests should succeed with correct data
1091
+ ASSERT_OK(statuses_buf[1]);
1092
+ ASSERT_NE(blob_reqs[1].second, nullptr);
1093
+ ASSERT_EQ(blob_reqs[1].second->data(), blobs[1]);
1094
+
1095
+ ASSERT_OK(statuses_buf[2]);
1096
+ ASSERT_NE(blob_reqs[2].second, nullptr);
1097
+ ASSERT_EQ(blob_reqs[2].second->data(), blobs[2]);
1098
+ }
1099
+
1017
1100
  } // namespace ROCKSDB_NAMESPACE
1018
1101
 
1019
1102
  int main(int argc, char** argv) {
@@ -137,6 +137,18 @@ class BlobIndex {
137
137
  return oss.str();
138
138
  }
139
139
 
140
+ // Encode this blob index into dst based on its type.
141
+ void EncodeTo(std::string* dst) const {
142
+ if (IsInlined()) {
143
+ EncodeInlinedTTL(dst, expiration_, value_);
144
+ } else if (HasTTL()) {
145
+ EncodeBlobTTL(dst, expiration_, file_number_, offset_, size_,
146
+ compression_);
147
+ } else {
148
+ EncodeBlob(dst, file_number_, offset_, size_, compression_);
149
+ }
150
+ }
151
+
140
152
  static void EncodeInlinedTTL(std::string* dst, uint64_t expiration,
141
153
  const Slice& value) {
142
154
  assert(dst != nullptr);
@@ -67,7 +67,7 @@ void WriteBlobFile(const ImmutableOptions& immutable_options,
67
67
 
68
68
  ASSERT_OK(blob_log_writer.WriteHeader(WriteOptions(), header));
69
69
 
70
- std::vector<std::string> compressed_blobs(num);
70
+ std::vector<GrowableBuffer> compressed_blobs(num);
71
71
  std::vector<Slice> blobs_to_write(num);
72
72
  if (kNoCompression == compression) {
73
73
  for (size_t i = 0; i < num; ++i) {
@@ -75,16 +75,13 @@ void WriteBlobFile(const ImmutableOptions& immutable_options,
75
75
  blob_sizes[i] = blobs[i].size();
76
76
  }
77
77
  } else {
78
- CompressionOptions opts;
79
- CompressionContext context(compression, opts);
80
- CompressionInfo info(opts, context, CompressionDict::GetEmptyDict(),
81
- compression);
82
-
83
- constexpr uint32_t compression_format_version = 2;
78
+ auto compressor =
79
+ GetBuiltinV2CompressionManager()->GetCompressor({}, compression);
84
80
 
85
81
  for (size_t i = 0; i < num; ++i) {
86
- ASSERT_TRUE(OLD_CompressData(blobs[i], info, compression_format_version,
87
- &compressed_blobs[i]));
82
+ ASSERT_OK(LegacyForceBuiltinCompression(*compressor,
83
+ /*working_area=*/nullptr,
84
+ blobs[i], &compressed_blobs[i]));
88
85
  blobs_to_write[i] = compressed_blobs[i];
89
86
  blob_sizes[i] = compressed_blobs[i].size();
90
87
  }
@@ -56,6 +56,18 @@ TableBuilder* NewTableBuilder(const TableBuilderOptions& tboptions,
56
56
  return tboptions.moptions.table_factory->NewTableBuilder(tboptions, file);
57
57
  }
58
58
 
59
+ void ExtractTimestampFromTableProperties(const TableProperties& tp,
60
+ FileMetaData* meta) {
61
+ auto min_ts_iter = tp.user_collected_properties.find("rocksdb.timestamp_min");
62
+ if (min_ts_iter != tp.user_collected_properties.end()) {
63
+ meta->min_timestamp = min_ts_iter->second;
64
+ }
65
+ auto max_ts_iter = tp.user_collected_properties.find("rocksdb.timestamp_max");
66
+ if (max_ts_iter != tp.user_collected_properties.end()) {
67
+ meta->max_timestamp = max_ts_iter->second;
68
+ }
69
+ }
70
+
59
71
  Status BuildTable(
60
72
  const std::string& dbname, VersionSet* versions,
61
73
  const ImmutableDBOptions& db_options, const TableBuilderOptions& tboptions,
@@ -310,6 +322,8 @@ Status BuildTable(
310
322
  }
311
323
 
312
324
  TEST_SYNC_POINT("BuildTable:BeforeFinishBuildTable");
325
+ TEST_SYNC_POINT_CALLBACK("BuildTable:BeforeCheckEmpty",
326
+ static_cast<TableBuilder*>(builder));
313
327
  const bool empty = builder->IsEmpty();
314
328
  if (flush_stats) {
315
329
  assert(c_iter.HasNumInputEntryScanned());
@@ -318,6 +332,14 @@ Status BuildTable(
318
332
  }
319
333
  if (!s.ok() || empty) {
320
334
  builder->Abandon();
335
+ // Propagate the builder's error when the builder is empty due to an
336
+ // internal error (e.g., write fault injection causing all Add() calls to
337
+ // return early). Without this, `s` would remain OK and the downstream
338
+ // key count validation in flush_job.cc would produce a misleading
339
+ // Corruption error instead of the actual builder error.
340
+ if (s.ok() && !builder->status().ok()) {
341
+ s = builder->status();
342
+ }
321
343
  } else {
322
344
  SeqnoToTimeMapping relevant_mapping;
323
345
  if (seqno_to_time_mapping) {
@@ -355,6 +377,7 @@ Status BuildTable(
355
377
  assert(meta->fd.GetFileSize() > 0);
356
378
  tp = builder
357
379
  ->GetTableProperties(); // refresh now that builder is finished
380
+ ExtractTimestampFromTableProperties(tp, meta);
358
381
  if (memtable_payload_bytes != nullptr &&
359
382
  memtable_garbage_bytes != nullptr) {
360
383
  const CompactionIterationStats& ci_stats = c_iter.iter_stats();
@@ -41,6 +41,13 @@ class BlobFileCompletionCallback;
41
41
  TableBuilder* NewTableBuilder(const TableBuilderOptions& tboptions,
42
42
  WritableFileWriter* file);
43
43
 
44
+ // Extract min/max timestamps from table properties and populate FileMetaData.
45
+ // This is used by both flush (BuildTable) and compaction (CompactionOutputs)
46
+ // to populate timestamp range in FileMetaData from the TimestampTableProperties
47
+ // collector output.
48
+ void ExtractTimestampFromTableProperties(const TableProperties& tp,
49
+ FileMetaData* meta);
50
+
44
51
  // Build a Table file from the contents of *iter. The generated file
45
52
  // will be named according to number specified in meta. On success, the rest of
46
53
  // *meta will be filled with metadata about the generated table.