@nxtedition/rocksdb 15.4.1 → 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 (399) hide show
  1. package/binding.cc +24 -15
  2. package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
  3. package/deps/rocksdb/rocksdb/BUCK +42 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
  5. package/deps/rocksdb/rocksdb/Makefile +59 -32
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
  8. package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
  11. package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
  12. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
  14. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
  17. package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
  24. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
  26. package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
  27. package/deps/rocksdb/rocksdb/db/builder.h +7 -0
  28. package/deps/rocksdb/rocksdb/db/c.cc +373 -57
  29. package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
  51. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  52. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
  53. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
  54. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
  55. package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
  57. package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
  58. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
  59. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
  60. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
  61. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
  62. package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
  63. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
  64. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
  65. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
  66. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
  79. package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
  80. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
  81. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
  82. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
  83. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
  84. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
  85. package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
  86. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
  87. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
  88. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
  89. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
  90. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
  91. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
  92. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
  93. package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
  94. package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
  95. package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
  96. package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
  97. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
  98. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
  99. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
  100. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
  101. package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
  102. package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
  103. package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
  104. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
  105. package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
  106. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
  107. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
  108. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
  109. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
  110. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
  111. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
  112. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
  113. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
  114. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
  115. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  116. package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
  117. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
  118. package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
  119. package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
  120. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
  121. package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
  122. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
  123. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  124. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
  125. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
  126. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
  127. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
  128. package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
  129. package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
  130. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
  131. package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
  132. package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
  133. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
  134. package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
  135. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  136. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
  137. package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
  138. package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
  139. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
  140. package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
  141. package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
  142. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  143. package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
  144. package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
  145. package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
  146. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
  147. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
  148. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
  149. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
  150. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
  151. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
  152. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
  153. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
  159. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
  160. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
  161. package/deps/rocksdb/rocksdb/env/env.cc +1 -0
  162. package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
  163. package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
  164. package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
  165. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  166. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  167. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
  168. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
  169. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
  170. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
  171. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  172. package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
  173. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
  174. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
  175. package/deps/rocksdb/rocksdb/folly.mk +22 -5
  176. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
  177. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
  178. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
  179. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
  180. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
  181. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
  182. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
  183. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
  185. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
  187. package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
  188. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
  189. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
  192. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
  193. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
  194. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
  195. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
  196. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
  197. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
  198. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
  199. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
  200. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
  202. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
  203. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
  204. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
  205. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
  206. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
  207. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
  208. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
  209. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
  210. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  211. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
  212. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
  213. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
  214. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
  215. package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
  216. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
  217. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
  218. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
  219. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
  220. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
  221. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
  222. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
  223. package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
  224. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  225. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
  226. package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
  227. package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
  228. package/deps/rocksdb/rocksdb/options/options.cc +5 -1
  229. package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
  230. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
  231. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
  232. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
  233. package/deps/rocksdb/rocksdb/port/lang.h +4 -0
  234. package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
  235. package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
  236. package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
  237. package/deps/rocksdb/rocksdb/src.mk +12 -0
  238. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
  239. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  240. package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
  241. package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
  242. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
  243. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
  247. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
  248. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
  249. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
  250. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
  251. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
  252. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
  253. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
  254. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
  255. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
  256. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
  257. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
  258. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  259. package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
  260. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
  261. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
  262. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
  263. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
  264. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
  265. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
  266. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
  267. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
  268. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
  269. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  270. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
  271. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
  272. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
  273. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
  274. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
  275. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
  276. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
  277. package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
  278. package/deps/rocksdb/rocksdb/table/format.cc +27 -15
  279. package/deps/rocksdb/rocksdb/table/format.h +41 -15
  280. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
  281. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
  282. package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
  283. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
  284. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  285. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
  286. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
  287. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
  288. package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
  289. package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
  290. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
  291. package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
  292. package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
  293. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
  294. package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
  295. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
  296. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
  297. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
  298. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
  299. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
  300. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
  301. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
  302. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
  303. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
  304. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
  305. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
  306. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
  307. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
  308. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
  309. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
  310. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
  311. package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
  312. package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
  313. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
  314. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
  315. package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
  316. package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
  317. package/deps/rocksdb/rocksdb/util/coding.h +14 -27
  318. package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
  319. package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
  320. package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
  321. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
  322. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
  323. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
  324. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
  325. package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
  326. package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
  327. package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
  328. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
  329. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
  330. package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
  331. package/deps/rocksdb/rocksdb/util/math.h +3 -1
  332. package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
  333. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
  334. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
  335. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
  336. package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
  337. package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
  338. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
  339. package/deps/rocksdb/rocksdb/util/status.cc +3 -1
  340. package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
  341. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
  342. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
  343. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
  344. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
  345. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
  346. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
  347. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
  348. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
  349. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
  350. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
  351. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
  352. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
  353. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
  354. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
  355. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
  356. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
  357. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
  358. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  359. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
  360. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
  361. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
  362. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
  363. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
  364. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
  365. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
  366. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
  367. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
  368. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
  369. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
  370. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
  371. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
  372. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
  373. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
  374. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
  375. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
  376. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  377. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
  378. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
  379. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
  380. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
  381. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
  382. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
  383. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
  384. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
  385. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
  386. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
  387. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
  388. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
  389. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  390. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  391. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
  392. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
  393. package/deps/rocksdb/rocksdb.gyp +7 -0
  394. package/iterator.js +2 -2
  395. package/package.json +1 -1
  396. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  397. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -5,12 +5,156 @@
5
5
 
6
6
  #include "util/compression.h"
7
7
 
8
+ #ifdef BZIP2
9
+ #include <bzlib.h>
10
+ #endif // BZIP2
11
+
12
+ #include <limits>
13
+
14
+ #ifdef LZ4
15
+ #include <lz4.h>
16
+ #include <lz4hc.h>
17
+ #if LZ4_VERSION_NUMBER < 10700 // < r129
18
+ #error "LZ4 support requires version >= 1.7.0 (lz4-devel)"
19
+ #endif // LZ4_VERSION_NUMBER < 10700
20
+ #endif // LZ4
21
+
22
+ #ifdef SNAPPY
23
+ #include <snappy-sinksource.h>
24
+ #include <snappy.h>
25
+ #endif // SNAPPY
26
+
27
+ #ifdef ZLIB
28
+ #include <zlib.h>
29
+ #endif // ZLIB
30
+
8
31
  #include "options/options_helper.h"
32
+ #include "port/likely.h"
9
33
  #include "rocksdb/convenience.h"
10
34
  #include "rocksdb/utilities/object_registry.h"
35
+ #include "test_util/sync_point.h"
36
+ #include "util/cast_util.h"
37
+ #include "util/string_util.h"
11
38
 
12
39
  namespace ROCKSDB_NAMESPACE {
13
40
 
41
+ // WART: does not match OptionsHelper::compression_type_string_map
42
+ std::string CompressionTypeToString(CompressionType compression_type) {
43
+ switch (compression_type) {
44
+ case kNoCompression:
45
+ return "NoCompression";
46
+ case kSnappyCompression:
47
+ return "Snappy";
48
+ case kZlibCompression:
49
+ return "Zlib";
50
+ case kBZip2Compression:
51
+ return "BZip2";
52
+ case kLZ4Compression:
53
+ return "LZ4";
54
+ case kLZ4HCCompression:
55
+ return "LZ4HC";
56
+ case kXpressCompression:
57
+ return "Xpress";
58
+ case kZSTD:
59
+ return "ZSTD";
60
+ case kDisableCompressionOption:
61
+ return "DisableOption";
62
+ default: {
63
+ bool is_custom = compression_type >= kFirstCustomCompression &&
64
+ compression_type <= kLastCustomCompression;
65
+ unsigned char c = lossless_cast<unsigned char>(compression_type);
66
+ return (is_custom ? "Custom" : "Reserved") +
67
+ ToBaseCharsString<16>(2, c, /*uppercase=*/true);
68
+ }
69
+ }
70
+ }
71
+
72
+ // WART: does not match OptionsHelper::compression_type_string_map
73
+ CompressionType CompressionTypeFromString(std::string compression_type_str) {
74
+ if (!compression_type_str.empty()) {
75
+ switch (compression_type_str[0]) {
76
+ case 'N':
77
+ if (compression_type_str == "NoCompression") {
78
+ return kNoCompression;
79
+ }
80
+ break;
81
+ case 'S':
82
+ if (compression_type_str == "Snappy") {
83
+ return kSnappyCompression;
84
+ }
85
+ break;
86
+ case 'Z':
87
+ if (compression_type_str == "ZSTD") {
88
+ return kZSTD;
89
+ }
90
+ if (compression_type_str == "Zlib") {
91
+ return kZlibCompression;
92
+ }
93
+ break;
94
+ case 'B':
95
+ if (compression_type_str == "BZip2") {
96
+ return kBZip2Compression;
97
+ }
98
+ break;
99
+ case 'L':
100
+ if (compression_type_str == "LZ4") {
101
+ return kLZ4Compression;
102
+ }
103
+ if (compression_type_str == "LZ4HC") {
104
+ return kLZ4HCCompression;
105
+ }
106
+ break;
107
+ case 'X':
108
+ if (compression_type_str == "Xpress") {
109
+ return kXpressCompression;
110
+ }
111
+ break;
112
+ default:;
113
+ }
114
+ }
115
+ // unrecognized
116
+ return kDisableCompressionOption;
117
+ }
118
+
119
+ std::string CompressionOptionsToString(
120
+ const CompressionOptions& compression_options) {
121
+ std::string result;
122
+ result.reserve(512);
123
+ result.append("window_bits=")
124
+ .append(std::to_string(compression_options.window_bits))
125
+ .append("; ");
126
+ result.append("level=")
127
+ .append(std::to_string(compression_options.level))
128
+ .append("; ");
129
+ result.append("strategy=")
130
+ .append(std::to_string(compression_options.strategy))
131
+ .append("; ");
132
+ result.append("max_dict_bytes=")
133
+ .append(std::to_string(compression_options.max_dict_bytes))
134
+ .append("; ");
135
+ result.append("zstd_max_train_bytes=")
136
+ .append(std::to_string(compression_options.zstd_max_train_bytes))
137
+ .append("; ");
138
+ // NOTE: parallel_threads is skipped because it doesn't really affect the file
139
+ // contents written, arguably doesn't belong in CompressionOptions
140
+ result.append("enabled=")
141
+ .append(std::to_string(compression_options.enabled))
142
+ .append("; ");
143
+ result.append("max_dict_buffer_bytes=")
144
+ .append(std::to_string(compression_options.max_dict_buffer_bytes))
145
+ .append("; ");
146
+ result.append("use_zstd_dict_trainer=")
147
+ .append(std::to_string(compression_options.use_zstd_dict_trainer))
148
+ .append("; ");
149
+ result.append("max_compressed_bytes_per_kb=")
150
+ .append(std::to_string(compression_options.max_compressed_bytes_per_kb))
151
+ .append("; ");
152
+ result.append("checksum=")
153
+ .append(std::to_string(compression_options.checksum))
154
+ .append("; ");
155
+ return result;
156
+ }
157
+
14
158
  StreamingCompress* StreamingCompress::Create(CompressionType compression_type,
15
159
  const CompressionOptions& opts,
16
160
  uint32_t compress_format_version,
@@ -123,6 +267,123 @@ void ZSTDStreamingUncompress::Reset() {
123
267
  #endif
124
268
  }
125
269
 
270
+ void DecompressorDict::Populate(Decompressor& from_decompressor, Slice dict) {
271
+ if (UNLIKELY(dict.empty())) {
272
+ dict_str_ = {};
273
+ dict_allocation_ = {};
274
+ // Appropriately reject bad files with empty dictionary block.
275
+ // It is longstanding not to write an empty dictionary block:
276
+ // https://github.com/facebook/rocksdb/blame/10.2.fb/table/block_based/block_based_table_builder.cc#L1841
277
+ decompressor_ = std::make_unique<FailureDecompressor>(
278
+ Status::Corruption("Decompression dictionary is empty"));
279
+ } else {
280
+ Status s = from_decompressor.MaybeCloneForDict(dict, &decompressor_);
281
+ if (decompressor_ == nullptr) {
282
+ dict_str_ = {};
283
+ dict_allocation_ = {};
284
+ assert(!s.ok());
285
+ decompressor_ = std::make_unique<FailureDecompressor>(std::move(s));
286
+ } else {
287
+ assert(s.ok());
288
+ assert(decompressor_->GetSerializedDict() == dict);
289
+ }
290
+ }
291
+
292
+ memory_usage_ = sizeof(struct DecompressorDict);
293
+ memory_usage_ += dict_str_.size();
294
+ if (dict_allocation_) {
295
+ auto allocator = dict_allocation_.get_deleter().allocator;
296
+ if (allocator) {
297
+ memory_usage_ +=
298
+ allocator->UsableSize(dict_allocation_.get(), GetRawDict().size());
299
+ } else {
300
+ memory_usage_ += GetRawDict().size();
301
+ }
302
+ }
303
+ memory_usage_ += decompressor_->ApproximateOwnedMemoryUsage();
304
+ }
305
+
306
+ // ZSTD dictionary training implementations
307
+ std::string ZSTD_TrainDictionary(const std::string& samples,
308
+ const std::vector<size_t>& sample_lens,
309
+ size_t max_dict_bytes) {
310
+ #ifdef ZSTD
311
+ assert(samples.empty() == sample_lens.empty());
312
+ if (samples.empty()) {
313
+ return "";
314
+ }
315
+ std::string dict_data(max_dict_bytes, '\0');
316
+ size_t dict_len = ZDICT_trainFromBuffer(
317
+ &dict_data[0], max_dict_bytes, &samples[0], &sample_lens[0],
318
+ static_cast<unsigned>(sample_lens.size()));
319
+ if (ZDICT_isError(dict_len)) {
320
+ return "";
321
+ }
322
+ assert(dict_len <= max_dict_bytes);
323
+ dict_data.resize(dict_len);
324
+ return dict_data;
325
+ #else
326
+ assert(false);
327
+ (void)samples;
328
+ (void)sample_lens;
329
+ (void)max_dict_bytes;
330
+ return "";
331
+ #endif // ZSTD
332
+ }
333
+
334
+ std::string ZSTD_TrainDictionary(const std::string& samples,
335
+ size_t sample_len_shift,
336
+ size_t max_dict_bytes) {
337
+ #ifdef ZSTD
338
+ // skips potential partial sample at the end of "samples"
339
+ size_t num_samples = samples.size() >> sample_len_shift;
340
+ std::vector<size_t> sample_lens(num_samples, size_t(1) << sample_len_shift);
341
+ return ZSTD_TrainDictionary(samples, sample_lens, max_dict_bytes);
342
+ #else
343
+ assert(false);
344
+ (void)samples;
345
+ (void)sample_len_shift;
346
+ (void)max_dict_bytes;
347
+ return "";
348
+ #endif // ZSTD
349
+ }
350
+
351
+ std::string ZSTD_FinalizeDictionary(const std::string& samples,
352
+ const std::vector<size_t>& sample_lens,
353
+ size_t max_dict_bytes, int level) {
354
+ #ifdef ROCKSDB_ZDICT_FINALIZE
355
+ assert(samples.empty() == sample_lens.empty());
356
+ if (samples.empty()) {
357
+ return "";
358
+ }
359
+ if (level == CompressionOptions::kDefaultCompressionLevel) {
360
+ // NB: ZSTD_CLEVEL_DEFAULT is historically == 3
361
+ level = ZSTD_CLEVEL_DEFAULT;
362
+ }
363
+ std::string dict_data(max_dict_bytes, '\0');
364
+ size_t dict_len = ZDICT_finalizeDictionary(
365
+ dict_data.data(), max_dict_bytes, samples.data(),
366
+ std::min(static_cast<size_t>(samples.size()), max_dict_bytes),
367
+ samples.data(), sample_lens.data(),
368
+ static_cast<unsigned>(sample_lens.size()),
369
+ {level, 0 /* notificationLevel */, 0 /* dictID */});
370
+ if (ZDICT_isError(dict_len)) {
371
+ return "";
372
+ } else {
373
+ assert(dict_len <= max_dict_bytes);
374
+ dict_data.resize(dict_len);
375
+ return dict_data;
376
+ }
377
+ #else
378
+ assert(false);
379
+ (void)samples;
380
+ (void)sample_lens;
381
+ (void)max_dict_bytes;
382
+ (void)level;
383
+ return "";
384
+ #endif // ROCKSDB_ZDICT_FINALIZE
385
+ }
386
+
126
387
  // ***********************************************************************
127
388
  // BEGIN built-in implementation of customization interface
128
389
  // ***********************************************************************
@@ -162,69 +423,17 @@ class CompressorBase : public Compressor {
162
423
  CompressionOptions opts_;
163
424
  };
164
425
 
165
- class BuiltinCompressorV1 final : public CompressorBase {
166
- public:
167
- const char* Name() const override { return "BuiltinCompressorV1"; }
168
-
169
- explicit BuiltinCompressorV1(const CompressionOptions& opts,
170
- CompressionType type)
171
- : CompressorBase(opts), type_(type) {
172
- assert(type != kNoCompression);
173
- }
174
-
175
- CompressionType GetPreferredCompressionType() const override { return type_; }
176
-
177
- std::unique_ptr<Compressor> Clone() const override {
178
- return std::make_unique<BuiltinCompressorV1>(opts_, type_);
179
- }
180
-
181
- Status CompressBlock(Slice uncompressed_data, char* compressed_output,
182
- size_t* compressed_output_size,
183
- CompressionType* out_compression_type,
184
- ManagedWorkingArea* wa) override {
185
- std::optional<CompressionContext> tmp_ctx;
186
- CompressionContext* ctx = nullptr;
187
- if (wa != nullptr && wa->owner() == this) {
188
- ctx = static_cast<CompressionContext*>(wa->get());
189
- }
190
- if (ctx == nullptr) {
191
- tmp_ctx.emplace(type_, opts_);
192
- ctx = &*tmp_ctx;
193
- }
194
- CompressionInfo info(opts_, *ctx, CompressionDict::GetEmptyDict(), type_);
195
- std::string str_output;
196
- str_output.reserve(uncompressed_data.size());
197
- if (!OLD_CompressData(uncompressed_data, info,
198
- 1 /*compress_format_version*/, &str_output)) {
199
- // Maybe rejected or bypassed
200
- *compressed_output_size = str_output.size();
201
- *out_compression_type = kNoCompression;
202
- return Status::OK();
203
- }
204
- if (str_output.size() > *compressed_output_size) {
205
- // Compression rejected
206
- *out_compression_type = kNoCompression;
207
- return Status::OK();
208
- }
209
- std::memcpy(compressed_output, str_output.data(), str_output.size());
210
- *compressed_output_size = str_output.size();
211
- *out_compression_type = type_;
212
- return Status::OK();
213
- }
214
-
215
- protected:
216
- const CompressionType type_;
217
- };
218
-
219
426
  class CompressorWithSimpleDictBase : public CompressorBase {
220
427
  public:
221
428
  explicit CompressorWithSimpleDictBase(const CompressionOptions& opts,
222
429
  std::string&& dict_data = {})
223
430
  : CompressorBase(opts), dict_data_(std::move(dict_data)) {}
224
431
 
225
- size_t GetMaxSampleSizeIfWantDict(
226
- CacheEntryRole /*block_type*/) const override {
227
- return opts_.max_dict_bytes;
432
+ DictConfig GetDictGuidance(CacheEntryRole /*block_type*/) const override {
433
+ if (opts_.max_dict_bytes == 0) {
434
+ return DictDisabled{};
435
+ }
436
+ return DictSampling{opts_.max_dict_bytes};
228
437
  }
229
438
 
230
439
  // NOTE: empty dict is equivalent to no dict
@@ -236,13 +445,21 @@ class CompressorWithSimpleDictBase : public CompressorBase {
236
445
 
237
446
  std::unique_ptr<Compressor> MaybeCloneSpecialized(
238
447
  CacheEntryRole /*block_type*/,
239
- DictSampleArgs&& dict_samples) const final override {
240
- assert(dict_samples.Verify());
241
- if (dict_samples.empty()) {
242
- // Nothing to specialize on
243
- return nullptr;
448
+ DictConfigArgs&& dict_config) const final override {
449
+ if (auto* samples = std::get_if<DictSamples>(&dict_config)) {
450
+ assert(samples->Verify());
451
+ if (samples->empty()) {
452
+ return nullptr;
453
+ }
454
+ return CloneForDict(std::move(samples->sample_data));
455
+ } else if (auto* predef = std::get_if<DictPreDefined>(&dict_config)) {
456
+ if (predef->dict_data.empty()) {
457
+ return nullptr;
458
+ }
459
+ return CloneForDict(std::move(predef->dict_data));
244
460
  } else {
245
- return CloneForDict(std::move(dict_samples.sample_data));
461
+ assert(std::holds_alternative<DictDisabled>(dict_config));
462
+ return nullptr;
246
463
  }
247
464
  }
248
465
 
@@ -858,14 +1075,15 @@ class BuiltinZSTDCompressorV2 final : public CompressorBase {
858
1075
  std::move(dict_copy));
859
1076
  }
860
1077
 
861
- size_t GetMaxSampleSizeIfWantDict(
862
- CacheEntryRole /*block_type*/) const override {
1078
+ DictConfig GetDictGuidance(CacheEntryRole /*block_type*/) const override {
863
1079
  if (opts_.max_dict_bytes == 0) {
864
1080
  // Dictionary compression disabled
865
- return 0;
1081
+ return DictDisabled{};
866
1082
  } else {
867
- return opts_.zstd_max_train_bytes > 0 ? opts_.zstd_max_train_bytes
868
- : opts_.max_dict_bytes;
1083
+ size_t max_sample_bytes = opts_.zstd_max_train_bytes > 0
1084
+ ? opts_.zstd_max_train_bytes
1085
+ : opts_.max_dict_bytes;
1086
+ return DictSampling{max_sample_bytes};
869
1087
  }
870
1088
  }
871
1089
 
@@ -974,129 +1192,57 @@ class BuiltinZSTDCompressorV2 final : public CompressorBase {
974
1192
 
975
1193
  std::unique_ptr<Compressor> MaybeCloneSpecialized(
976
1194
  CacheEntryRole /*block_type*/,
977
- DictSampleArgs&& dict_samples) const override {
978
- assert(dict_samples.Verify());
979
- if (dict_samples.empty()) {
980
- // Nothing to specialize on
1195
+ DictConfigArgs&& dict_config) const override {
1196
+ // Handle DictDisabled
1197
+ // TODO: use holds_alternative
1198
+ if (auto* disabled = std::get_if<DictDisabled>(&dict_config)) {
1199
+ (void)disabled;
981
1200
  return nullptr;
982
1201
  }
983
- std::string dict_data;
984
- // Migrated from BlockBasedTableBuilder::EnterUnbuffered()
985
- if (opts_.zstd_max_train_bytes > 0) {
986
- assert(dict_samples.sample_data.size() <= opts_.zstd_max_train_bytes);
987
- if (opts_.use_zstd_dict_trainer) {
988
- dict_data = ZSTD_TrainDictionary(dict_samples.sample_data,
989
- dict_samples.sample_lens,
990
- opts_.max_dict_bytes);
991
- } else {
992
- dict_data = ZSTD_FinalizeDictionary(dict_samples.sample_data,
993
- dict_samples.sample_lens,
994
- opts_.max_dict_bytes, opts_.level);
995
- }
996
- } else {
997
- assert(dict_samples.sample_data.size() <= opts_.max_dict_bytes);
998
- // ZSTD "raw content dictionary" - "Any buffer is a valid raw content
999
- // dictionary." Or similar for other compressions.
1000
- dict_data = std::move(dict_samples.sample_data);
1001
- }
1002
- CompressionDict dict{std::move(dict_data), kZSTD, opts_.level};
1003
- return std::make_unique<BuiltinZSTDCompressorV2>(opts_, std::move(dict));
1004
- }
1005
-
1006
- std::shared_ptr<Decompressor> GetOptimizedDecompressor() const override;
1007
-
1008
- protected:
1009
- const CompressionDict dict_;
1010
- };
1011
1202
 
1012
- // NOTE: this implementation is intentionally SIMPLE based on existing code
1013
- // and NOT EFFICIENT because this is an old/deprecated format.
1014
- class BuiltinDecompressorV1 final : public Decompressor {
1015
- public:
1016
- const char* Name() const override { return "BuiltinDecompressorV1"; }
1017
-
1018
- Status ExtractUncompressedSize(Args& args) override {
1019
- CacheAllocationPtr throw_away_output;
1020
- return DoUncompress(args, &throw_away_output, &args.uncompressed_size);
1021
- }
1203
+ std::string dict_data;
1022
1204
 
1023
- Status DecompressBlock(const Args& args, char* uncompressed_output) override {
1024
- uint64_t same_uncompressed_size = 0;
1025
- CacheAllocationPtr output;
1026
- Status s = DoUncompress(args, &output, &same_uncompressed_size);
1027
- if (same_uncompressed_size != args.uncompressed_size) {
1028
- s = Status::Corruption("Compressed block size mismatch");
1029
- }
1030
- if (s.ok()) {
1031
- // NOTE: simple but inefficient
1032
- memcpy(uncompressed_output, output.get(), args.uncompressed_size);
1205
+ // Handle DictPreDefined - use the pre-defined dictionary directly
1206
+ if (auto* predef = std::get_if<DictPreDefined>(&dict_config)) {
1207
+ if (predef->dict_data.empty()) {
1208
+ return nullptr;
1209
+ }
1210
+ dict_data = std::move(predef->dict_data);
1033
1211
  }
1034
- return s;
1035
- }
1036
1212
 
1037
- protected:
1038
- Status DoUncompress(const Args& args, CacheAllocationPtr* out_data,
1039
- uint64_t* out_uncompressed_size) {
1040
- assert(args.working_area == nullptr);
1041
- assert(*out_uncompressed_size == 0);
1042
-
1043
- // NOTE: simple but inefficient
1044
- UncompressionContext dummy_ctx{args.compression_type};
1045
- UncompressionInfo info{dummy_ctx, UncompressionDict::GetEmptyDict(),
1046
- args.compression_type};
1047
- const char* error_message = nullptr;
1048
- size_t size_t_uncompressed_size = 0;
1049
- *out_data = OLD_UncompressData(
1050
- info, args.compressed_data.data(), args.compressed_data.size(),
1051
- &size_t_uncompressed_size, 1 /*compress_format_version*/,
1052
- nullptr /*allocator*/, &error_message);
1053
- if (*out_data == nullptr) {
1054
- if (error_message != nullptr) {
1055
- return Status::Corruption(error_message);
1213
+ // Handle DictSamples - train dictionary from samples
1214
+ if (auto* samples = std::get_if<DictSamples>(&dict_config)) {
1215
+ assert(samples->Verify());
1216
+ if (samples->empty()) {
1217
+ return nullptr;
1218
+ }
1219
+ // Migrated from BlockBasedTableBuilder::EnterUnbuffered()
1220
+ if (opts_.zstd_max_train_bytes > 0) {
1221
+ assert(samples->sample_data.size() <= opts_.zstd_max_train_bytes);
1222
+ if (opts_.use_zstd_dict_trainer) {
1223
+ dict_data = ZSTD_TrainDictionary(
1224
+ samples->sample_data, samples->sample_lens, opts_.max_dict_bytes);
1225
+ } else {
1226
+ dict_data = ZSTD_FinalizeDictionary(
1227
+ samples->sample_data, samples->sample_lens, opts_.max_dict_bytes,
1228
+ opts_.level);
1229
+ }
1056
1230
  } else {
1057
- return Status::Corruption("Corrupted compressed block contents");
1231
+ assert(samples->sample_data.size() <= opts_.max_dict_bytes);
1232
+ // ZSTD "raw content dictionary" - "Any buffer is a valid raw content
1233
+ // dictionary." Or similar for other compressions.
1234
+ dict_data = std::move(samples->sample_data);
1058
1235
  }
1059
1236
  }
1060
- *out_uncompressed_size = size_t_uncompressed_size;
1061
- assert(*out_uncompressed_size > 0);
1062
- return Status::OK();
1063
- }
1064
- };
1065
-
1066
- class BuiltinCompressionManagerV1 final : public CompressionManager {
1067
- public:
1068
- BuiltinCompressionManagerV1() = default;
1069
- ~BuiltinCompressionManagerV1() override = default;
1070
-
1071
- const char* Name() const override { return "BuiltinCompressionManagerV1"; }
1072
-
1073
- const char* CompatibilityName() const override { return "BuiltinV1"; }
1074
-
1075
- std::unique_ptr<Compressor> GetCompressor(const CompressionOptions& opts,
1076
- CompressionType type) override {
1077
- // At the time of deprecating the writing of new format_version=1 files,
1078
- // ZSTD was the last supported built-in compression type.
1079
- if (type > kZSTD) {
1080
- // Unrecognized; fall back on default compression
1081
- type = ColumnFamilyOptions{}.compression;
1082
- }
1083
- if (type == kNoCompression) {
1084
- return nullptr;
1085
- } else {
1086
- return std::make_unique<BuiltinCompressorV1>(opts, type);
1087
- }
1088
- }
1089
1237
 
1090
- std::shared_ptr<Decompressor> GetDecompressor() override {
1091
- return std::shared_ptr<Decompressor>(shared_from_this(), &decompressor_);
1238
+ CompressionDict dict{std::move(dict_data), kZSTD, opts_.level};
1239
+ return std::make_unique<BuiltinZSTDCompressorV2>(opts_, std::move(dict));
1092
1240
  }
1093
1241
 
1094
- bool SupportsCompressionType(CompressionType type) const override {
1095
- return CompressionTypeSupported(type);
1096
- }
1242
+ std::shared_ptr<Decompressor> GetOptimizedDecompressor() const override;
1097
1243
 
1098
1244
  protected:
1099
- BuiltinDecompressorV1 decompressor_;
1245
+ const CompressionDict dict_;
1100
1246
  };
1101
1247
 
1102
1248
  // Subroutines for BuiltinDecompressorV2
@@ -1632,10 +1778,13 @@ class BuiltinCompressionManagerV2 final : public CompressionManager {
1632
1778
  return nullptr;
1633
1779
  } else if (types_begin + 1 == types_end &&
1634
1780
  *types_begin == kSnappyCompression) {
1781
+ // Exclusively Snappy
1635
1782
  return GetSnappyDecompressor();
1636
- } else if (std::find(types_begin, types_end, kZSTD)) {
1783
+ } else if (std::find(types_begin, types_end, kZSTD) != types_end) {
1784
+ // Includes ZSTD
1637
1785
  return GetZstdDecompressor();
1638
1786
  } else {
1787
+ // Everything else
1639
1788
  return GetGeneralDecompressor();
1640
1789
  }
1641
1790
  }
@@ -1665,9 +1814,6 @@ class BuiltinCompressionManagerV2 final : public CompressionManager {
1665
1814
  }
1666
1815
  };
1667
1816
 
1668
- const std::shared_ptr<BuiltinCompressionManagerV1>
1669
- kBuiltinCompressionManagerV1 =
1670
- std::make_shared<BuiltinCompressionManagerV1>();
1671
1817
  const std::shared_ptr<BuiltinCompressionManagerV2>
1672
1818
  kBuiltinCompressionManagerV2 =
1673
1819
  std::make_shared<BuiltinCompressionManagerV2>();
@@ -1696,14 +1842,6 @@ Status CompressionManager::CreateFromString(
1696
1842
  std::call_once(loaded, [&]() {
1697
1843
  auto& library = *ObjectLibrary::Default();
1698
1844
  // TODO: try to enhance ObjectLibrary to support singletons
1699
- library.AddFactory<CompressionManager>(
1700
- kBuiltinCompressionManagerV1->CompatibilityName(),
1701
- [](const std::string& /*uri*/,
1702
- std::unique_ptr<CompressionManager>* guard,
1703
- std::string* /*errmsg*/) {
1704
- *guard = std::make_unique<BuiltinCompressionManagerV1>();
1705
- return guard->get();
1706
- });
1707
1845
  library.AddFactory<CompressionManager>(
1708
1846
  kBuiltinCompressionManagerV2->CompatibilityName(),
1709
1847
  [](const std::string& /*uri*/,
@@ -1750,30 +1888,50 @@ CompressionManager::FindCompatibleCompressionManager(Slice compatibility_name) {
1750
1888
  }
1751
1889
  }
1752
1890
 
1753
- const std::shared_ptr<CompressionManager>& GetBuiltinCompressionManager(
1754
- int compression_format_version) {
1755
- static const std::shared_ptr<CompressionManager> v1_as_base =
1756
- kBuiltinCompressionManagerV1;
1891
+ const std::shared_ptr<CompressionManager>& GetBuiltinV2CompressionManager() {
1757
1892
  static const std::shared_ptr<CompressionManager> v2_as_base =
1758
1893
  kBuiltinCompressionManagerV2;
1759
- static const std::shared_ptr<CompressionManager> none;
1760
- if (compression_format_version == 1) {
1761
- return v1_as_base;
1762
- } else if (compression_format_version == 2) {
1763
- return v2_as_base;
1764
- } else {
1765
- // Unrecognized. In some cases this is unexpected and the caller can
1766
- // rightfully crash.
1767
- return none;
1768
- }
1769
- }
1770
-
1771
- const std::shared_ptr<CompressionManager>& GetBuiltinV2CompressionManager() {
1772
- return GetBuiltinCompressionManager(2);
1894
+ return v2_as_base;
1773
1895
  }
1774
1896
 
1775
1897
  // ***********************************************************************
1776
1898
  // END built-in implementation of customization interface
1777
1899
  // ***********************************************************************
1778
1900
 
1901
+ Status LegacyForceBuiltinCompression(
1902
+ Compressor& builtin_compressor,
1903
+ Compressor::ManagedWorkingArea* working_area, Slice from,
1904
+ GrowableBuffer* to) {
1905
+ // For legacy cases that store compressed data even when it's larger than the
1906
+ // uncompressed data (!!!), we need a reliable upper bound on the compressed
1907
+ // size. This is based on consulting various algorithms documentation etc.
1908
+ // and adding ~4 bytes for encoded uncompressed size. (Snappy is the worst
1909
+ // case for multiplicative overhead at n + n/6, bounded by 19*n/16 to avoid
1910
+ // costly division. Bzip2 is the worst case for additive overhead at 600
1911
+ // bytes.)
1912
+ size_t n = from.size();
1913
+ size_t upper_bound = ((19 * n) >> 4) + 604;
1914
+ // The upper bound has only been established considering built-in compression
1915
+ // types through kZSTD. (Might need updating if this fails.)
1916
+ assert(builtin_compressor.GetPreferredCompressionType() <= kZSTD);
1917
+
1918
+ to->ResetForSize(upper_bound);
1919
+ CompressionType actual_type = kNoCompression;
1920
+ Status s = builtin_compressor.CompressBlock(
1921
+ from, to->data(), &to->MutableSize(), &actual_type, working_area);
1922
+ TEST_SYNC_POINT_CALLBACK("LegacyForceBuiltinCompression:TamperWithStatus",
1923
+ &s);
1924
+
1925
+ if (!s.ok()) {
1926
+ return s;
1927
+ }
1928
+ if (actual_type == kNoCompression) {
1929
+ // abort in debug builds
1930
+ assert(actual_type != kNoCompression);
1931
+ return Status::Corruption("Compression unexpectedly declined or aborted");
1932
+ }
1933
+ assert(actual_type == builtin_compressor.GetPreferredCompressionType());
1934
+ return Status::OK();
1935
+ }
1936
+
1779
1937
  } // namespace ROCKSDB_NAMESPACE