@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
@@ -13,6 +13,7 @@
13
13
  #include "rocksdb/flush_block_policy.h"
14
14
  #include "rocksdb/utilities/object_registry.h"
15
15
  #include "table/block_based/block_builder.h"
16
+ #include "table/block_based/data_block_footer.h"
16
17
  #include "test_util/testutil.h"
17
18
  #include "util/auto_tune_compressor.h"
18
19
  #include "util/coding.h"
@@ -583,17 +584,15 @@ TEST_P(PresetCompressionDictTest, Flush) {
583
584
  ASSERT_GT(
584
585
  TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
585
586
  0);
586
- // TODO(ajkr): fix the below assertion to work with ZSTD. The expectation on
587
- // number of bytes needs to be adjusted in case the cached block is in
588
- // ZSTD's digested dictionary format.
589
- if (compression_type_ != kZSTD) {
590
- // Although we limited buffering to `kBlockLen`, there may be up to two
591
- // blocks of data included in the dictionary since we only check limit
592
- // after each block is built.
593
- ASSERT_LE(TestGetTickerCount(options,
594
- BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
595
- 2 * kBlockLen);
596
- }
587
+ ASSERT_EQ(TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_ADD), 1);
588
+ // Although we stop buffering after `kBlockLen` bytes, there may be up to
589
+ // two blocks of data included in the dictionary since we only check limit
590
+ // after each block is built. And because block cache charges for bytes used
591
+ // by ZSTD's digested dictionary, we need a larger factor for the memory
592
+ // overheads in that case.
593
+ ASSERT_LE(
594
+ TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
595
+ (compression_type_ == kZSTD ? 10 : 2) * kBlockLen);
597
596
  }
598
597
  }
599
598
 
@@ -642,8 +641,9 @@ TEST_P(PresetCompressionDictTest, CompactNonBottommost) {
642
641
  }
643
642
  ASSERT_EQ("2,0,1", FilesPerLevel(0));
644
643
 
645
- uint64_t prev_compression_dict_bytes_inserted =
646
- TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT);
644
+ PopTicker(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT);
645
+ PopTicker(options, BLOCK_CACHE_COMPRESSION_DICT_ADD);
646
+
647
647
  // This L0->L1 compaction merges the two L0 files into L1. The produced L1
648
648
  // file is not bottommost due to the existing L2 file covering the same key-
649
649
  // range.
@@ -655,22 +655,20 @@ TEST_P(PresetCompressionDictTest, CompactNonBottommost) {
655
655
  if (bottommost_) {
656
656
  ASSERT_EQ(
657
657
  TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
658
- prev_compression_dict_bytes_inserted);
658
+ 0);
659
659
  } else {
660
660
  ASSERT_GT(
661
661
  TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
662
- prev_compression_dict_bytes_inserted);
663
- // TODO(ajkr): fix the below assertion to work with ZSTD. The expectation on
664
- // number of bytes needs to be adjusted in case the cached block is in
665
- // ZSTD's digested dictionary format.
666
- if (compression_type_ != kZSTD) {
667
- // Although we limited buffering to `kBlockLen`, there may be up to two
668
- // blocks of data included in the dictionary since we only check limit
669
- // after each block is built.
670
- ASSERT_LE(TestGetTickerCount(options,
671
- BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
672
- prev_compression_dict_bytes_inserted + 2 * kBlockLen);
673
- }
662
+ 0);
663
+ ASSERT_EQ(TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_ADD), 1);
664
+ // Although we stop buffering after `kBlockLen` bytes, there may be up to
665
+ // two blocks of data included in the dictionary since we only check limit
666
+ // after each block is built. And because block cache charges for bytes used
667
+ // by ZSTD's digested dictionary, we need a larger factor for the memory
668
+ // overheads in that case.
669
+ ASSERT_LE(
670
+ TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
671
+ (compression_type_ == kZSTD ? 10 : 2) * kBlockLen);
674
672
  }
675
673
  }
676
674
 
@@ -713,25 +711,24 @@ TEST_P(PresetCompressionDictTest, CompactBottommost) {
713
711
  }
714
712
  ASSERT_EQ("2", FilesPerLevel(0));
715
713
 
716
- uint64_t prev_compression_dict_bytes_inserted =
717
- TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT);
714
+ PopTicker(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT);
715
+ PopTicker(options, BLOCK_CACHE_COMPRESSION_DICT_ADD);
716
+
718
717
  CompactRangeOptions cro;
719
718
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
720
719
  ASSERT_EQ("0,1", FilesPerLevel(0));
721
720
  ASSERT_GT(
722
721
  TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
723
- prev_compression_dict_bytes_inserted);
724
- // TODO(ajkr): fix the below assertion to work with ZSTD. The expectation on
725
- // number of bytes needs to be adjusted in case the cached block is in ZSTD's
726
- // digested dictionary format.
727
- if (compression_type_ != kZSTD) {
728
- // Although we limited buffering to `kBlockLen`, there may be up to two
729
- // blocks of data included in the dictionary since we only check limit after
730
- // each block is built.
731
- ASSERT_LE(
732
- TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
733
- prev_compression_dict_bytes_inserted + 2 * kBlockLen);
734
- }
722
+ 0);
723
+ ASSERT_EQ(TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_ADD), 1);
724
+ // Although we stop buffering after `kBlockLen` bytes, there may be up to
725
+ // two blocks of data included in the dictionary since we only check limit
726
+ // after each block is built. And because block cache charges for bytes used
727
+ // by ZSTD's digested dictionary, we need a larger factor for the memory
728
+ // overheads in that case.
729
+ ASSERT_LE(
730
+ TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
731
+ (compression_type_ == kZSTD ? 10 : 2) * kBlockLen);
735
732
  }
736
733
 
737
734
  class CompactionCompressionListener : public EventListener {
@@ -829,9 +826,10 @@ TEST_P(CompressionFailuresTest, CompressionFailures) {
829
826
 
830
827
  if (compression_failure_type_ == kTestCompressionFail) {
831
828
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
832
- "CompressData:TamperWithReturnValue", [](void* arg) {
833
- bool* ret = static_cast<bool*>(arg);
834
- *ret = false;
829
+ "BlockBasedTableBuilder::CompressAndVerifyBlock:TamperWithResultType",
830
+ [](void* arg) {
831
+ CompressionType* ret = static_cast<CompressionType*>(arg);
832
+ *ret = kNoCompression;
835
833
  });
836
834
  } else if (compression_failure_type_ == kTestDecompressionFail) {
837
835
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
@@ -1113,18 +1111,24 @@ TEST_F(DBCompressionTest, RandomMixedCompressionManager) {
1113
1111
  namespace {
1114
1112
  // Template parameter to distinguish data blocks vs. v4+ index blocks
1115
1113
  template <bool kIndexBlockV4>
1116
- static Status ValidateRocksBlock(Slice data) {
1114
+ static Status ValidateRocksBlock(Slice data, bool use_separated_kv,
1115
+ uint64_t restart_interval) {
1116
+ assert(!kIndexBlockV4 ||
1117
+ !use_separated_kv); // index blocks not currently supported
1117
1118
  const char* src = data.data();
1118
1119
  size_t srcSize = data.size();
1119
1120
  const char* const block_type_str =
1120
1121
  kIndexBlockV4 ? "Index block" : "Data block";
1121
1122
 
1122
- // Minimum RocksDB block content size: at least 1 entry + restarts
1123
- if (srcSize < 8) {
1123
+ // Decode footer using DataBlockFooter
1124
+ Slice input(src, srcSize);
1125
+ DataBlockFooter footer;
1126
+ Status s = footer.DecodeFrom(&input);
1127
+ if (!s.ok()) {
1124
1128
  return Status::Corruption(std::string(block_type_str) + " too small");
1125
1129
  }
1126
1130
 
1127
- uint32_t numRestarts = DecodeFixed32(src + srcSize - sizeof(uint32_t));
1131
+ uint32_t numRestarts = footer.num_restarts;
1128
1132
 
1129
1133
  // Sanity check: num_restarts should be reasonable
1130
1134
  // TODO: also support data block hash index
@@ -1133,17 +1137,26 @@ static Status ValidateRocksBlock(Slice data) {
1133
1137
  block_type_str);
1134
1138
  }
1135
1139
 
1136
- size_t restartsSize = numRestarts * sizeof(uint32_t) + sizeof(uint32_t);
1137
- if (srcSize < restartsSize) {
1140
+ size_t restartsSize = numRestarts * sizeof(uint32_t);
1141
+ if (input.size() < restartsSize) {
1138
1142
  return Status::Corruption(std::string(block_type_str) +
1139
1143
  " too small for restarts array");
1140
1144
  }
1141
1145
 
1142
- size_t entriesSize = srcSize - restartsSize;
1146
+ size_t entriesSize;
1147
+ uint32_t values_section_offset = 0;
1148
+ if (footer.separated_kv) {
1149
+ values_section_offset = footer.values_section_offset;
1150
+ entriesSize = values_section_offset; // keys section ends at value_offset
1151
+ } else {
1152
+ entriesSize = input.size() - restartsSize;
1153
+ }
1143
1154
  const char* entriesEnd = src + entriesSize;
1144
1155
 
1145
1156
  // Parse entries
1146
1157
  const char* p = src;
1158
+ uint32_t cur_idx = 0;
1159
+ Slice current_value;
1147
1160
  while (p < entriesEnd) {
1148
1161
  // Parse shared_bytes varint
1149
1162
  uint32_t shared;
@@ -1174,6 +1187,17 @@ static Status ValidateRocksBlock(Slice data) {
1174
1187
  p = next;
1175
1188
  }
1176
1189
 
1190
+ uint32_t value_offset = 0;
1191
+ if (cur_idx % restart_interval == 0 && use_separated_kv) {
1192
+ // For separated KV format, parse value_offset varint at restart points
1193
+ next = GetVarint32Ptr(p, entriesEnd, &value_offset);
1194
+ if (next == nullptr) {
1195
+ return Status::Corruption(
1196
+ std::string("Invalid value_offset varint in ") + block_type_str);
1197
+ }
1198
+ p = next;
1199
+ }
1200
+
1177
1201
  // Validate key delta
1178
1202
  if (p + unshared > entriesEnd) {
1179
1203
  return Status::Corruption(
@@ -1204,12 +1228,35 @@ static Status ValidateRocksBlock(Slice data) {
1204
1228
  }
1205
1229
  } else {
1206
1230
  // For data blocks, validate value
1207
- if (p + valueLen > entriesEnd) {
1208
- return Status::Corruption(
1209
- std::string("Value exceeds end of entries in ") + block_type_str);
1231
+ if (!use_separated_kv) {
1232
+ // Inline values: value follows key delta
1233
+ if (p + valueLen > entriesEnd) {
1234
+ return Status::Corruption(
1235
+ std::string("Value exceeds end of entries in ") + block_type_str);
1236
+ }
1237
+ p += valueLen;
1238
+ } else {
1239
+ // Separated KV: values are stored in a separate section
1240
+ // value_offset is relative to values section start (set at restart
1241
+ // points)
1242
+ if (cur_idx % restart_interval == 0) {
1243
+ current_value =
1244
+ Slice(src + values_section_offset + value_offset, valueLen);
1245
+ } else {
1246
+ // Non-restart entries: value immediately follows previous value
1247
+ current_value =
1248
+ Slice(current_value.data() + current_value.size(), valueLen);
1249
+ }
1250
+
1251
+ if (current_value.data() + current_value.size() >
1252
+ src + srcSize - restartsSize) {
1253
+ return Status::Corruption(
1254
+ std::string("Value exceeds values section in ") + block_type_str);
1255
+ }
1210
1256
  }
1211
- p += valueLen;
1212
1257
  }
1258
+
1259
+ ++cur_idx;
1213
1260
  }
1214
1261
 
1215
1262
  return Status::OK();
@@ -1218,20 +1265,23 @@ static Status ValidateRocksBlock(Slice data) {
1218
1265
 
1219
1266
  class DBCompressionTestMaybeParallel
1220
1267
  : public DBCompressionTest,
1221
- public testing::WithParamInterface<std::tuple<int, bool>> {
1268
+ public testing::WithParamInterface<std::tuple<int, bool, bool>> {
1222
1269
  public:
1223
1270
  DBCompressionTestMaybeParallel()
1224
1271
  : DBCompressionTest(),
1225
1272
  parallel_threads_(std::get<0>(GetParam())),
1226
- use_dict_(std::get<1>(GetParam())) {}
1273
+ use_dict_(std::get<1>(GetParam())),
1274
+ separate_kv_(std::get<2>(GetParam())) {}
1227
1275
 
1228
1276
  protected:
1229
1277
  int parallel_threads_;
1230
1278
  bool use_dict_;
1279
+ bool separate_kv_;
1231
1280
  };
1232
1281
 
1233
1282
  INSTANTIATE_TEST_CASE_P(DBCompressionTest, DBCompressionTestMaybeParallel,
1234
1283
  ::testing::Combine(::testing::Values(1, 4),
1284
+ ::testing::Values(false, true),
1235
1285
  ::testing::Values(false, true)));
1236
1286
 
1237
1287
  TEST_P(DBCompressionTestMaybeParallel, CompressionManagerWrapper) {
@@ -1248,6 +1298,10 @@ TEST_P(DBCompressionTestMaybeParallel, CompressionManagerWrapper) {
1248
1298
  static RelaxedAtomic<int> dataCheckedCount{0};
1249
1299
  static RelaxedAtomic<int> indexCheckedCount{0};
1250
1300
  static RelaxedAtomic<int> compressCalledCount{0};
1301
+ static bool useSeparatedKV = false;
1302
+
1303
+ // Set the separated KV flag for the wrappers
1304
+ useSeparatedKV = separate_kv_;
1251
1305
 
1252
1306
  // We also have wrappers here to help verify that when RocksDB asks to
1253
1307
  // specialize the Compressor for a particular kind of block, it only passes in
@@ -1270,7 +1324,9 @@ TEST_P(DBCompressionTestMaybeParallel, CompressionManagerWrapper) {
1270
1324
  ManagedWorkingArea* working_area) override {
1271
1325
  dataCheckedCount.FetchAddRelaxed(1);
1272
1326
  // Parse and validate data block format before compressing
1273
- Status s = ValidateRocksBlock</*kIndexBlockV4=*/false>(uncompressed_data);
1327
+ Status s = ValidateRocksBlock</*kIndexBlockV4=*/false>(
1328
+ uncompressed_data, useSeparatedKV,
1329
+ BlockBasedTableOptions().block_restart_interval);
1274
1330
  if (!s.ok()) {
1275
1331
  return s;
1276
1332
  }
@@ -1296,7 +1352,9 @@ TEST_P(DBCompressionTestMaybeParallel, CompressionManagerWrapper) {
1296
1352
  ManagedWorkingArea* working_area) override {
1297
1353
  indexCheckedCount.FetchAddRelaxed(1);
1298
1354
  // Parse and validate index block v4 format before compressing
1299
- Status s = ValidateRocksBlock</*kIndexBlockV4=*/true>(uncompressed_data);
1355
+ Status s = ValidateRocksBlock</*kIndexBlockV4=*/true>(
1356
+ uncompressed_data, false,
1357
+ BlockBasedTableOptions().index_block_restart_interval);
1300
1358
  if (!s.ok()) {
1301
1359
  return s;
1302
1360
  }
@@ -1365,9 +1423,9 @@ TEST_P(DBCompressionTestMaybeParallel, CompressionManagerWrapper) {
1365
1423
 
1366
1424
  std::unique_ptr<Compressor> MaybeCloneSpecialized(
1367
1425
  CacheEntryRole block_type,
1368
- DictSampleArgs&& dict_samples) const override {
1426
+ DictConfigArgs&& dict_config) const override {
1369
1427
  std::unique_ptr<Compressor> result = std::make_unique<MyCompressor>(
1370
- wrapped_->CloneMaybeSpecialized(block_type, std::move(dict_samples)));
1428
+ wrapped_->CloneMaybeSpecialized(block_type, std::move(dict_config)));
1371
1429
  if (block_type == CacheEntryRole::kDataBlock) {
1372
1430
  result = std::make_unique<CheckDataBlockCompressorWrapper>(
1373
1431
  std::move(result));
@@ -1396,7 +1454,8 @@ TEST_P(DBCompressionTestMaybeParallel, CompressionManagerWrapper) {
1396
1454
  continue;
1397
1455
  }
1398
1456
  SCOPED_TRACE("Compression type: " + std::to_string(type) +
1399
- (use_wrapper ? " with " : " no ") + "wrapper");
1457
+ (use_wrapper ? " with " : " no ") + "wrapper" +
1458
+ (separate_kv_ ? " separated_kv" : ""));
1400
1459
 
1401
1460
  Options options = CurrentOptions();
1402
1461
  options.compression = type;
@@ -1409,6 +1468,7 @@ TEST_P(DBCompressionTestMaybeParallel, CompressionManagerWrapper) {
1409
1468
  bbto.index_type = BlockBasedTableOptions::kTwoLevelIndexSearch;
1410
1469
  bbto.partition_filters = true;
1411
1470
  bbto.filter_policy.reset(NewBloomFilterPolicy(5));
1471
+ bbto.separate_key_value_in_data_block = separate_kv_;
1412
1472
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
1413
1473
  options.compression_manager = use_wrapper ? mgr : nullptr;
1414
1474
  DestroyAndReopen(options);
@@ -2141,6 +2201,232 @@ TEST_F(DBCompressionCostPredictor, CostAwareCompressorManager) {
2141
2201
  ASSERT_OK(Flush());
2142
2202
  }
2143
2203
 
2204
+ // Test pre-defined dictionary compression with a custom CompressionManager
2205
+ TEST_F(DBCompressionTest, PreDefinedDictionaryCompression) {
2206
+ if (!ZSTD_Supported()) {
2207
+ ROCKSDB_GTEST_BYPASS("ZSTD compression not supported");
2208
+ return;
2209
+ }
2210
+
2211
+ // A custom compressor that returns a pre-defined dictionary
2212
+ class PreDefinedDictCompressor : public CompressorWrapper {
2213
+ public:
2214
+ explicit PreDefinedDictCompressor(std::unique_ptr<Compressor> wrapped,
2215
+ std::string dict_data)
2216
+ : CompressorWrapper(std::move(wrapped)),
2217
+ predefined_dict_(std::move(dict_data)) {}
2218
+
2219
+ const char* Name() const override { return "PreDefinedDictCompressor"; }
2220
+
2221
+ DictConfig GetDictGuidance(CacheEntryRole block_type) const override {
2222
+ if (block_type == CacheEntryRole::kDataBlock &&
2223
+ !predefined_dict_.empty()) {
2224
+ return DictPreDefined{/*copy*/ predefined_dict_};
2225
+ }
2226
+ return DictDisabled{};
2227
+ }
2228
+
2229
+ std::unique_ptr<Compressor> Clone() const override {
2230
+ return std::make_unique<PreDefinedDictCompressor>(wrapped_->Clone(),
2231
+ predefined_dict_);
2232
+ }
2233
+
2234
+ std::unique_ptr<Compressor> MaybeCloneSpecialized(
2235
+ CacheEntryRole block_type,
2236
+ DictConfigArgs&& dict_config) const override {
2237
+ // Delegate to wrapped compressor for dictionary handling
2238
+ auto specialized =
2239
+ wrapped_->MaybeCloneSpecialized(block_type, std::move(dict_config));
2240
+ if (specialized) {
2241
+ return specialized;
2242
+ }
2243
+ return nullptr;
2244
+ }
2245
+
2246
+ private:
2247
+ std::string predefined_dict_;
2248
+ };
2249
+
2250
+ // Custom CompatibilityName so the builtin compression manager won't be used
2251
+ static const char* kTestCompatibilityName = "PreDefinedDictTest";
2252
+
2253
+ class PreDefinedDictManager : public CompressionManagerWrapper {
2254
+ public:
2255
+ explicit PreDefinedDictManager(std::shared_ptr<CompressionManager> wrapped,
2256
+ std::string dict_data)
2257
+ : CompressionManagerWrapper(std::move(wrapped)),
2258
+ predefined_dict_(std::move(dict_data)) {}
2259
+
2260
+ const char* Name() const override { return "PreDefinedDictManager"; }
2261
+
2262
+ const char* CompatibilityName() const override {
2263
+ return kTestCompatibilityName;
2264
+ }
2265
+
2266
+ std::unique_ptr<Compressor> GetCompressorForSST(
2267
+ const FilterBuildingContext& context, const CompressionOptions& opts,
2268
+ CompressionType preferred) override {
2269
+ auto base = wrapped_->GetCompressorForSST(context, opts, preferred);
2270
+ if (base) {
2271
+ return std::make_unique<PreDefinedDictCompressor>(std::move(base),
2272
+ predefined_dict_);
2273
+ }
2274
+ return nullptr;
2275
+ }
2276
+
2277
+ private:
2278
+ std::string predefined_dict_;
2279
+ };
2280
+
2281
+ // A broken manager that ignores the dictionary when decompressing.
2282
+ // This simulates a buggy decompressor that doesn't properly apply the
2283
+ // dictionary, causing ZSTD to produce wrong output when decompressing
2284
+ // dictionary-compressed data.
2285
+ class BrokenDictManager : public CompressionManagerWrapper {
2286
+ public:
2287
+ explicit BrokenDictManager(std::shared_ptr<CompressionManager> wrapped)
2288
+ : CompressionManagerWrapper(std::move(wrapped)) {}
2289
+
2290
+ const char* Name() const override { return "BrokenDictManager"; }
2291
+
2292
+ const char* CompatibilityName() const override {
2293
+ return kTestCompatibilityName;
2294
+ }
2295
+
2296
+ std::shared_ptr<Decompressor> GetDecompressor() override {
2297
+ return std::make_shared<IgnoreDictDecompressor>(
2298
+ wrapped_->GetDecompressor());
2299
+ }
2300
+
2301
+ std::shared_ptr<Decompressor> GetDecompressorOptimizeFor(
2302
+ CompressionType optimize_for_type) override {
2303
+ return std::make_shared<IgnoreDictDecompressor>(
2304
+ wrapped_->GetDecompressorOptimizeFor(optimize_for_type));
2305
+ }
2306
+
2307
+ std::shared_ptr<Decompressor> GetDecompressorForTypes(
2308
+ const CompressionType* types_begin,
2309
+ const CompressionType* types_end) override {
2310
+ return std::make_shared<IgnoreDictDecompressor>(
2311
+ wrapped_->GetDecompressorForTypes(types_begin, types_end));
2312
+ }
2313
+
2314
+ private:
2315
+ // A decompressor that stores the dictionary (for GetSerializedDict) but
2316
+ // ignores it during decompression, causing ZSTD to produce garbage
2317
+ class IgnoreDictDecompressor : public DecompressorWrapper {
2318
+ public:
2319
+ explicit IgnoreDictDecompressor(std::shared_ptr<Decompressor> wrapped)
2320
+ : DecompressorWrapper(std::move(wrapped)) {}
2321
+
2322
+ IgnoreDictDecompressor(std::shared_ptr<Decompressor> wrapped,
2323
+ std::string dict)
2324
+ : DecompressorWrapper(std::move(wrapped)),
2325
+ dict_(std::move(dict)),
2326
+ dict_slice_(dict_) {}
2327
+
2328
+ const char* Name() const override { return "IgnoreDictDecompressor"; }
2329
+
2330
+ const Slice& GetSerializedDict() const override { return dict_slice_; }
2331
+
2332
+ Status MaybeCloneForDict(const Slice& serialized_dict,
2333
+ std::unique_ptr<Decompressor>* out) override {
2334
+ // Store the dict but don't actually use it for decompression
2335
+ *out = std::make_unique<IgnoreDictDecompressor>(
2336
+ wrapped_,
2337
+ std::string(serialized_dict.data(), serialized_dict.size()));
2338
+ return Status::OK();
2339
+ }
2340
+
2341
+ private:
2342
+ std::string dict_;
2343
+ Slice dict_slice_;
2344
+ };
2345
+ };
2346
+
2347
+ // Create a dictionary that will be heavily referenced. The key insight is
2348
+ // that ZSTD dictionary compression works by finding matches between the input
2349
+ // data and the dictionary content. To force ZSTD to create dictionary
2350
+ // references, we need to use data that contains exact copies of dictionary
2351
+ // content.
2352
+ Random rnd(42);
2353
+
2354
+ // Create a dictionary with recognizable patterns
2355
+ std::string predefined_dict;
2356
+ std::vector<std::string> dict_patterns;
2357
+ for (int i = 0; i < 50; i++) {
2358
+ std::string pattern = rnd.RandomString(200);
2359
+ dict_patterns.push_back(pattern);
2360
+ predefined_dict += pattern;
2361
+ }
2362
+ // Total dict size: 50 * 200 = 10000 bytes
2363
+ size_t kDictSize = predefined_dict.size();
2364
+
2365
+ auto mgr = std::make_shared<PreDefinedDictManager>(
2366
+ GetBuiltinV2CompressionManager(), predefined_dict);
2367
+
2368
+ Options options = CurrentOptions();
2369
+ options.compression = kZSTD;
2370
+ options.compression_opts.max_dict_bytes = static_cast<int>(kDictSize);
2371
+ options.compression_manager = mgr;
2372
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2373
+ BlockBasedTableOptions bbto;
2374
+ bbto.enable_index_compression = true;
2375
+ // Need format_version >= 7 for custom CompatibilityName
2376
+ bbto.format_version = 7;
2377
+ // Need dictionary block load statistics
2378
+ bbto.block_cache = NewLRUCache(1 << 20);
2379
+ bbto.cache_index_and_filter_blocks = true;
2380
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2381
+ DestroyAndReopen(options);
2382
+
2383
+ // Write data that uses the same patterns from the dictionary.
2384
+ // This forces ZSTD to create back-references to the dictionary.
2385
+ std::vector<std::string> expected_values;
2386
+ for (int i = 0; i < 100; i++) {
2387
+ std::string value;
2388
+ // Compose value from random dictionary patterns - same content as dict
2389
+ for (int j = 0; j < 5; j++) {
2390
+ value +=
2391
+ dict_patterns[rnd.Uniform(static_cast<int>(dict_patterns.size()))];
2392
+ }
2393
+ expected_values.push_back(value);
2394
+ ASSERT_OK(Put(Key(i), value));
2395
+ }
2396
+ ASSERT_OK(Flush());
2397
+
2398
+ // Verify dictionary was used by checking that dict bytes were inserted
2399
+ ASSERT_GE(
2400
+ TestGetTickerCount(options, BLOCK_CACHE_COMPRESSION_DICT_BYTES_INSERT),
2401
+ predefined_dict.size());
2402
+
2403
+ // Read back data and verify correctness
2404
+ for (int i = 0; i < 100; i++) {
2405
+ std::string value;
2406
+ ASSERT_OK(db_->Get(ReadOptions(), Key(i), &value));
2407
+ ASSERT_EQ(value, expected_values[i]);
2408
+ }
2409
+
2410
+ // Now re-open with a broken decompressor that ignores dictionary.
2411
+ // This should result in corruption on read because ZSTD will fail to
2412
+ // decompress data that references the missing dictionary content.
2413
+ Close();
2414
+ auto broken_mgr =
2415
+ std::make_shared<BrokenDictManager>(GetBuiltinV2CompressionManager());
2416
+ options.compression_manager = broken_mgr;
2417
+ // New block cache to ensure dictionary is re-loaded, because the
2418
+ // dictionary block in cache is actually associated with a decompressor
2419
+ bbto.block_cache = NewLRUCache(1 << 20);
2420
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2421
+ ASSERT_OK(TryReopen(options));
2422
+
2423
+ // Read should fail with corruption because the decompressor ignores
2424
+ // the dictionary, causing ZSTD to produce garbage output
2425
+ std::string value;
2426
+ ASSERT_EQ(db_->Get(ReadOptions(), Key(0), &value).code(),
2427
+ Status::kCorruption);
2428
+ }
2429
+
2144
2430
  } // namespace ROCKSDB_NAMESPACE
2145
2431
  int main(int argc, char** argv) {
2146
2432
  ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
@@ -113,10 +113,9 @@ __attribute__((__no_sanitize__("alignment")))
113
113
  __attribute__((__no_sanitize_undefined__))
114
114
  #endif
115
115
  #endif
116
- uint32_t
117
- crc32c_arm64(uint32_t crc, unsigned char const *data, size_t len) {
118
- const uint8_t *buf8;
119
- const uint64_t *buf64 = (uint64_t *)data;
116
+ uint32_t crc32c_arm64(uint32_t crc, unsigned char const* data, size_t len) {
117
+ const uint8_t* buf8;
118
+ const uint64_t* buf64 = (uint64_t*)data;
120
119
  int length = (int)len;
121
120
  crc ^= 0xffffffff;
122
121
 
@@ -148,7 +147,7 @@ crc32c_arm64(uint32_t crc, unsigned char const *data, size_t len) {
148
147
  uint32_t k0 = 0xe417f38a, k1 = 0x8f158014;
149
148
 
150
149
  /* Prefetch data for following block to avoid cache miss */
151
- PREF1KL1((uint8_t *)buf64, 1024);
150
+ PREF1KL1((uint8_t*)buf64, 1024);
152
151
 
153
152
  /* First 8 byte for better pipelining */
154
153
  crc0 = crc32c_u64(crc, *buf64++);
@@ -184,22 +183,22 @@ crc32c_arm64(uint32_t crc, unsigned char const *data, size_t len) {
184
183
  #endif
185
184
  } // if Pmull runtime check here
186
185
 
187
- buf8 = (const uint8_t *)buf64;
186
+ buf8 = (const uint8_t*)buf64;
188
187
  while (length >= 8) {
189
- crc = crc32c_u64(crc, *(const uint64_t *)buf8);
188
+ crc = crc32c_u64(crc, *(const uint64_t*)buf8);
190
189
  buf8 += 8;
191
190
  length -= 8;
192
191
  }
193
192
 
194
193
  /* The following is more efficient than the straight loop */
195
194
  if (length >= 4) {
196
- crc = crc32c_u32(crc, *(const uint32_t *)buf8);
195
+ crc = crc32c_u32(crc, *(const uint32_t*)buf8);
197
196
  buf8 += 4;
198
197
  length -= 4;
199
198
  }
200
199
 
201
200
  if (length >= 2) {
202
- crc = crc32c_u16(crc, *(const uint16_t *)buf8);
201
+ crc = crc32c_u16(crc, *(const uint16_t*)buf8);
203
202
  buf8 += 2;
204
203
  length -= 2;
205
204
  }
@@ -36,7 +36,7 @@
36
36
  PREF4X64L1(buffer, (PREF_OFFSET), 8) \
37
37
  PREF4X64L1(buffer, (PREF_OFFSET), 12)
38
38
 
39
- uint32_t crc32c_arm64(uint32_t crc, unsigned char const *data, size_t len);
39
+ uint32_t crc32c_arm64(uint32_t crc, unsigned char const* data, size_t len);
40
40
  uint32_t crc32c_runtime_check(void);
41
41
  bool crc32c_pmull_runtime_check(void);
42
42
 
@@ -14,7 +14,7 @@
14
14
  extern "C" {
15
15
  #endif
16
16
 
17
- uint32_t crc32c_ppc(uint32_t crc, unsigned char const *buffer, size_t len);
17
+ uint32_t crc32c_ppc(uint32_t crc, unsigned char const* buffer, size_t len);
18
18
 
19
19
  #ifdef __cplusplus
20
20
  }
@@ -43,13 +43,13 @@ struct KeyMaker {
43
43
  // Sequential, within a hash function block
44
44
  inline Slice Seq(uint64_t i) {
45
45
  a = i;
46
- return Slice(reinterpret_cast<char *>(&a), sizeof(a));
46
+ return Slice(reinterpret_cast<char*>(&a), sizeof(a));
47
47
  }
48
48
  // Not quite sequential, varies across hash function blocks
49
49
  inline Slice Nonseq(uint64_t i) {
50
50
  a = i;
51
51
  b = i * 123;
52
- return Slice(reinterpret_cast<char *>(this), sizeof(*this));
52
+ return Slice(reinterpret_cast<char*>(this), sizeof(*this));
53
53
  }
54
54
  inline Slice Key(uint64_t i, bool nonseq) {
55
55
  return nonseq ? Nonseq(i) : Seq(i);
@@ -315,7 +315,7 @@ TEST_F(DynamicBloomTest, concurrent_with_perf) {
315
315
 
316
316
  } // namespace ROCKSDB_NAMESPACE
317
317
 
318
- int main(int argc, char **argv) {
318
+ int main(int argc, char** argv) {
319
319
  ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
320
320
  ::testing::InitGoogleTest(&argc, argv);
321
321
  ParseCommandLineFlags(&argc, &argv, true);