@nxtedition/rocksdb 13.5.7 → 13.5.9

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 (509) hide show
  1. package/binding.cc +248 -70
  2. package/binding.gyp +2 -2
  3. package/deps/rocksdb/rocksdb/BUCK +12 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  5. package/deps/rocksdb/rocksdb/Makefile +28 -23
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  12. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  15. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  16. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  26. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  27. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  28. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  29. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  31. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  32. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  33. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  59. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  60. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  61. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  63. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  64. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  65. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  66. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  67. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  68. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  69. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  70. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  71. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  87. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  88. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  89. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  90. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  91. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  92. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  93. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  94. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  95. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  96. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  97. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  98. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  99. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  100. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  101. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  102. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  104. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  105. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  106. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  107. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  108. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  109. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  110. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  111. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  112. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  113. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  114. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  115. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  116. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  117. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  118. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  119. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  120. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  124. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  125. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  126. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  127. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  129. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  130. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  131. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  132. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  133. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  134. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  135. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  136. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  137. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  138. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  139. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  140. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  141. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  142. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  143. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  144. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  145. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  146. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  147. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  148. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  149. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  150. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  153. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  154. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  155. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  156. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  157. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  158. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  160. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  161. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  163. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  164. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  165. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  166. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  168. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  169. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  170. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  171. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  172. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  173. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  174. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  175. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  176. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  177. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  178. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  180. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  181. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  182. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  191. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  193. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  194. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  195. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  196. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  198. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  199. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  200. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  201. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  202. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  204. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  205. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  206. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  207. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  210. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  212. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  213. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  214. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  215. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  218. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  220. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  221. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  224. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  226. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  228. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  229. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  230. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  232. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  234. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  235. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  238. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  241. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  242. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  243. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  245. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  249. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  253. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  254. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  256. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  257. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  258. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  260. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  269. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  270. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  276. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  277. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  278. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  279. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  281. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  283. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  284. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  285. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  286. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  288. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  289. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  290. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  291. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  292. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  293. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  294. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  295. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  296. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  297. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  298. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  299. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  300. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  301. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  302. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  303. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  304. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  305. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  306. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  307. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  308. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  309. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  310. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  311. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  312. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  314. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  315. package/deps/rocksdb/rocksdb/src.mk +17 -11
  316. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  325. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  327. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  328. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  329. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  330. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  334. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  335. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  338. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  340. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  342. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  343. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  345. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  349. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  350. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  351. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  352. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  353. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  354. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  356. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  357. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  362. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  364. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  366. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  367. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  368. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  369. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  370. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  371. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  372. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  374. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  376. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  377. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  380. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  381. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  382. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  384. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  385. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  386. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  388. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  391. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  393. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  395. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  396. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  397. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  398. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  399. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  400. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  401. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  402. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  403. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  404. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  405. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  406. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  408. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  409. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  416. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  426. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  428. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  430. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  433. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  435. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  436. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  437. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  439. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  442. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  443. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  458. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  464. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  467. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  468. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  479. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  482. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  485. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  486. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  499. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  500. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  504. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  505. package/deps/rocksdb/rocksdb.gyp +9 -4
  506. package/index.js +50 -9
  507. package/package.json +8 -1
  508. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  509. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -5,6 +5,10 @@
5
5
 
6
6
  #include "util/compression.h"
7
7
 
8
+ #include "options/options_helper.h"
9
+ #include "rocksdb/convenience.h"
10
+ #include "rocksdb/utilities/object_registry.h"
11
+
8
12
  namespace ROCKSDB_NAMESPACE {
9
13
 
10
14
  StreamingCompress* StreamingCompress::Create(CompressionType compression_type,
@@ -48,7 +52,7 @@ int ZSTDStreamingCompress::Compress(const char* input, size_t input_size,
48
52
  if (input_size == 0) {
49
53
  return 0;
50
54
  }
51
- #ifndef ZSTD_ADVANCED
55
+ #ifndef ZSTD
52
56
  (void)input;
53
57
  (void)input_size;
54
58
  (void)output;
@@ -77,7 +81,7 @@ int ZSTDStreamingCompress::Compress(const char* input, size_t input_size,
77
81
  }
78
82
 
79
83
  void ZSTDStreamingCompress::Reset() {
80
- #ifdef ZSTD_ADVANCED
84
+ #ifdef ZSTD
81
85
  ZSTD_CCtx_reset(cctx_, ZSTD_ResetDirective::ZSTD_reset_session_only);
82
86
  input_buffer_ = {/*src=*/nullptr, /*size=*/0, /*pos=*/0};
83
87
  #endif
@@ -91,7 +95,7 @@ int ZSTDStreamingUncompress::Uncompress(const char* input, size_t input_size,
91
95
  if (input_size == 0) {
92
96
  return 0;
93
97
  }
94
- #ifdef ZSTD_ADVANCED
98
+ #ifdef ZSTD
95
99
  if (input) {
96
100
  // New input
97
101
  input_buffer_ = {input, input_size, /*pos=*/0};
@@ -113,10 +117,938 @@ int ZSTDStreamingUncompress::Uncompress(const char* input, size_t input_size,
113
117
  }
114
118
 
115
119
  void ZSTDStreamingUncompress::Reset() {
116
- #ifdef ZSTD_ADVANCED
120
+ #ifdef ZSTD
117
121
  ZSTD_DCtx_reset(dctx_, ZSTD_ResetDirective::ZSTD_reset_session_only);
118
122
  input_buffer_ = {/*src=*/nullptr, /*size=*/0, /*pos=*/0};
119
123
  #endif
120
124
  }
121
125
 
126
+ // ***********************************************************************
127
+ // BEGIN built-in implementation of customization interface
128
+ // ***********************************************************************
129
+ Status Decompressor::ExtractUncompressedSize(Args& args) {
130
+ // Default implementation:
131
+ //
132
+ // Standard format for prepending uncompressed size to the compressed
133
+ // payload. (RocksDB compress_format_version=2 except Snappy)
134
+ //
135
+ // This is historically a varint32, but it is preliminarily generalized
136
+ // to varint64, in case that is supported on the write side for some
137
+ // algorithms.
138
+ if (LIKELY(GetVarint64(&args.compressed_data, &args.uncompressed_size))) {
139
+ if (LIKELY(args.uncompressed_size <= SIZE_MAX)) {
140
+ return Status::OK();
141
+ } else {
142
+ return Status::MemoryLimit("Uncompressed size too large for platform");
143
+ }
144
+ } else {
145
+ return Status::Corruption("Unable to extract uncompressed size");
146
+ }
147
+ }
148
+
149
+ const Slice& Decompressor::GetSerializedDict() const {
150
+ // Default: empty slice => no dictionary
151
+ static Slice kEmptySlice;
152
+ return kEmptySlice;
153
+ }
154
+
155
+ namespace {
156
+
157
+ class BuiltinCompressorV1 : public Compressor {
158
+ public:
159
+ const char* Name() const override { return "BuiltinCompressorV1"; }
160
+
161
+ explicit BuiltinCompressorV1(const CompressionOptions& opts,
162
+ CompressionType type)
163
+ : opts_(opts), type_(type) {
164
+ assert(type != kNoCompression);
165
+ }
166
+
167
+ CompressionType GetPreferredCompressionType() const override { return type_; }
168
+
169
+ Status CompressBlock(Slice uncompressed_data, std::string* compressed_output,
170
+ CompressionType* out_compression_type,
171
+ ManagedWorkingArea* wa) override {
172
+ std::optional<CompressionContext> tmp_ctx;
173
+ CompressionContext* ctx = nullptr;
174
+ if (wa != nullptr && wa->owner() == this) {
175
+ ctx = static_cast<CompressionContext*>(wa->get());
176
+ }
177
+ if (ctx == nullptr) {
178
+ tmp_ctx.emplace(type_, opts_);
179
+ ctx = &*tmp_ctx;
180
+ }
181
+ CompressionInfo info(opts_, *ctx, CompressionDict::GetEmptyDict(), type_);
182
+ if (!OLD_CompressData(uncompressed_data, info,
183
+ 1 /*compress_format_version*/, compressed_output)) {
184
+ *out_compression_type = kNoCompression;
185
+ return Status::OK();
186
+ }
187
+ *out_compression_type = type_;
188
+ return Status::OK();
189
+ }
190
+
191
+ protected:
192
+ const CompressionOptions opts_;
193
+ const CompressionType type_;
194
+ };
195
+
196
+ class BuiltinCompressorV2 : public Compressor {
197
+ public:
198
+ const char* Name() const override { return "BuiltinCompressorV2"; }
199
+
200
+ explicit BuiltinCompressorV2(const CompressionOptions& opts,
201
+ CompressionType type,
202
+ CompressionDict&& dict = {})
203
+ : opts_(opts), type_(type), dict_(std::move(dict)) {
204
+ assert(type != kNoCompression);
205
+ }
206
+
207
+ size_t GetMaxSampleSizeIfWantDict(
208
+ CacheEntryRole /*block_type*/) const override {
209
+ if (opts_.max_dict_bytes == 0) {
210
+ // Dictionary compression disabled
211
+ return 0;
212
+ } else {
213
+ return type_ == kZSTD && opts_.zstd_max_train_bytes > 0
214
+ ? opts_.zstd_max_train_bytes
215
+ : opts_.max_dict_bytes;
216
+ }
217
+ }
218
+
219
+ // NOTE: empty dict is equivalent to no dict
220
+ Slice GetSerializedDict() const override { return dict_.GetRawDict(); }
221
+
222
+ CompressionType GetPreferredCompressionType() const override { return type_; }
223
+
224
+ std::unique_ptr<Compressor> MaybeCloneSpecialized(
225
+ CacheEntryRole /*block_type*/, DictSampleArgs&& dict_samples) override {
226
+ assert(dict_samples.Verify());
227
+ if (dict_samples.empty()) {
228
+ // Nothing to specialize on
229
+ return nullptr;
230
+ }
231
+ std::string dict_data;
232
+ // Migrated from BlockBasedTableBuilder::EnterUnbuffered()
233
+ if (type_ == kZSTD && opts_.zstd_max_train_bytes > 0) {
234
+ assert(dict_samples.sample_data.size() <= opts_.zstd_max_train_bytes);
235
+ if (opts_.use_zstd_dict_trainer) {
236
+ dict_data = ZSTD_TrainDictionary(dict_samples.sample_data,
237
+ dict_samples.sample_lens,
238
+ opts_.max_dict_bytes);
239
+ } else {
240
+ dict_data = ZSTD_FinalizeDictionary(dict_samples.sample_data,
241
+ dict_samples.sample_lens,
242
+ opts_.max_dict_bytes, opts_.level);
243
+ }
244
+ } else {
245
+ assert(dict_samples.sample_data.size() <= opts_.max_dict_bytes);
246
+ // ZSTD "raw content dictionary" - "Any buffer is a valid raw content
247
+ // dictionary." Or similar for other compressions.
248
+ dict_data = std::move(dict_samples.sample_data);
249
+ }
250
+ CompressionDict dict{std::move(dict_data), type_, opts_.level};
251
+ return std::make_unique<BuiltinCompressorV2>(opts_, type_, std::move(dict));
252
+ }
253
+
254
+ // TODO: use ZSTD_CCtx directly
255
+ ManagedWorkingArea ObtainWorkingArea() override {
256
+ return ManagedWorkingArea(new CompressionContext(type_, opts_), this);
257
+ }
258
+ void ReleaseWorkingArea(WorkingArea* wa) override {
259
+ delete static_cast<CompressionContext*>(wa);
260
+ }
261
+ Status CompressBlock(Slice uncompressed_data, std::string* compressed_output,
262
+ CompressionType* out_compression_type,
263
+ ManagedWorkingArea* wa) override {
264
+ std::optional<CompressionContext> tmp_ctx;
265
+ CompressionContext* ctx = nullptr;
266
+ if (wa != nullptr && wa->owner() == this) {
267
+ ctx = static_cast<CompressionContext*>(wa->get());
268
+ }
269
+ CompressionType type = type_;
270
+ if (ctx == nullptr) {
271
+ tmp_ctx.emplace(type, opts_);
272
+ ctx = &*tmp_ctx;
273
+ }
274
+ CompressionInfo info(opts_, *ctx, dict_, type);
275
+ if (!OLD_CompressData(uncompressed_data, info,
276
+ 2 /*compress_format_version*/, compressed_output)) {
277
+ *out_compression_type = kNoCompression;
278
+ return Status::OK();
279
+ }
280
+ *out_compression_type = type;
281
+ return Status::OK();
282
+ }
283
+
284
+ protected:
285
+ const CompressionOptions opts_;
286
+ const CompressionType type_;
287
+ const CompressionDict dict_;
288
+ };
289
+
290
+ // NOTE: this implementation is intentionally SIMPLE based on existing code
291
+ // and NOT EFFICIENT because this is an old/deprecated format.
292
+ class BuiltinDecompressorV1 : public Decompressor {
293
+ public:
294
+ const char* Name() const override { return "BuiltinDecompressorV1"; }
295
+
296
+ Status ExtractUncompressedSize(Args& args) override {
297
+ CacheAllocationPtr throw_away_output;
298
+ return DoUncompress(args, &throw_away_output, &args.uncompressed_size);
299
+ }
300
+
301
+ Status DecompressBlock(const Args& args, char* uncompressed_output) override {
302
+ uint64_t same_uncompressed_size = 0;
303
+ CacheAllocationPtr output;
304
+ Status s = DoUncompress(args, &output, &same_uncompressed_size);
305
+ if (same_uncompressed_size != args.uncompressed_size) {
306
+ s = Status::Corruption("Compressed block size mismatch");
307
+ }
308
+ if (s.ok()) {
309
+ // NOTE: simple but inefficient
310
+ memcpy(uncompressed_output, output.get(), args.uncompressed_size);
311
+ }
312
+ return s;
313
+ }
314
+
315
+ protected:
316
+ Status DoUncompress(const Args& args, CacheAllocationPtr* out_data,
317
+ uint64_t* out_uncompressed_size) {
318
+ assert(args.working_area == nullptr);
319
+ assert(*out_uncompressed_size == 0);
320
+
321
+ // NOTE: simple but inefficient
322
+ UncompressionContext dummy_ctx{args.compression_type};
323
+ UncompressionInfo info{dummy_ctx, UncompressionDict::GetEmptyDict(),
324
+ args.compression_type};
325
+ const char* error_message = nullptr;
326
+ size_t size_t_uncompressed_size = 0;
327
+ *out_data = OLD_UncompressData(
328
+ info, args.compressed_data.data(), args.compressed_data.size(),
329
+ &size_t_uncompressed_size, 1 /*compress_format_version*/,
330
+ nullptr /*allocator*/, &error_message);
331
+ if (*out_data == nullptr) {
332
+ if (error_message != nullptr) {
333
+ return Status::Corruption(error_message);
334
+ } else {
335
+ return Status::Corruption("Corrupted compressed block contents");
336
+ }
337
+ }
338
+ *out_uncompressed_size = size_t_uncompressed_size;
339
+ assert(*out_uncompressed_size > 0);
340
+ return Status::OK();
341
+ }
342
+ };
343
+
344
+ class BuiltinCompressionManagerV1 : public CompressionManager {
345
+ public:
346
+ BuiltinCompressionManagerV1() = default;
347
+ ~BuiltinCompressionManagerV1() override = default;
348
+
349
+ const char* Name() const override { return "BuiltinCompressionManagerV1"; }
350
+
351
+ const char* CompatibilityName() const override { return "BuiltinV1"; }
352
+
353
+ std::unique_ptr<Compressor> GetCompressor(const CompressionOptions& opts,
354
+ CompressionType type) override {
355
+ // At the time of deprecating the writing of new format_version=1 files,
356
+ // ZSTD was the last supported built-in compression type.
357
+ if (type > kZSTD) {
358
+ // Unrecognized; fall back on default compression
359
+ type = ColumnFamilyOptions{}.compression;
360
+ }
361
+ if (type == kNoCompression) {
362
+ return nullptr;
363
+ } else {
364
+ return std::make_unique<BuiltinCompressorV1>(opts, type);
365
+ }
366
+ }
367
+
368
+ std::shared_ptr<Decompressor> GetDecompressor() override {
369
+ return std::shared_ptr<Decompressor>(shared_from_this(), &decompressor_);
370
+ }
371
+
372
+ bool SupportsCompressionType(CompressionType type) const override {
373
+ return CompressionTypeSupported(type);
374
+ }
375
+
376
+ protected:
377
+ BuiltinDecompressorV1 decompressor_;
378
+ };
379
+
380
+ // Subroutines for BuiltinDecompressorV2
381
+
382
+ Status Snappy_DecompressBlock(const Decompressor::Args& args,
383
+ char* uncompressed_output) {
384
+ #ifdef SNAPPY
385
+ if (!snappy::RawUncompress(args.compressed_data.data(),
386
+ args.compressed_data.size(),
387
+ uncompressed_output)) {
388
+ return Status::Corruption("Error decompressing snappy data");
389
+ }
390
+ return Status::OK();
391
+ #else
392
+ (void)args;
393
+ (void)uncompressed_output;
394
+ return Status::NotSupported("Snappy not supported in this build");
395
+ #endif
396
+ }
397
+
398
+ Status Zlib_DecompressBlock(const Decompressor::Args& args, Slice dict,
399
+ char* uncompressed_output) {
400
+ #ifdef ZLIB
401
+ // NOTE: uses "raw" format
402
+ constexpr int kWindowBits = -14;
403
+
404
+ z_stream _stream;
405
+ memset(&_stream, 0, sizeof(z_stream));
406
+
407
+ // For raw inflate, the windowBits should be -8..-15.
408
+ // If windowBits is bigger than zero, it will use either zlib
409
+ // header or gzip header. Adding 32 to it will do automatic detection.
410
+ int st = inflateInit2(&_stream, kWindowBits);
411
+ if (UNLIKELY(st != Z_OK)) {
412
+ return Status::Corruption("Failed to initialize zlib inflate: " +
413
+ std::to_string(st));
414
+ }
415
+
416
+ if (!dict.empty()) {
417
+ // Initialize the compression library's dictionary
418
+ st = inflateSetDictionary(&_stream,
419
+ reinterpret_cast<const Bytef*>(dict.data()),
420
+ static_cast<unsigned int>(dict.size()));
421
+ if (UNLIKELY(st != Z_OK)) {
422
+ return Status::Corruption("Failed to initialize zlib dictionary: " +
423
+ std::to_string(st));
424
+ }
425
+ }
426
+
427
+ _stream.next_in = const_cast<Bytef*>(
428
+ reinterpret_cast<const Bytef*>(args.compressed_data.data()));
429
+ _stream.avail_in = static_cast<unsigned int>(args.compressed_data.size());
430
+
431
+ _stream.next_out = reinterpret_cast<Bytef*>(uncompressed_output);
432
+ _stream.avail_out = static_cast<unsigned int>(args.uncompressed_size);
433
+
434
+ st = inflate(&_stream, Z_SYNC_FLUSH);
435
+ if (UNLIKELY(st != Z_STREAM_END)) {
436
+ inflateEnd(&_stream);
437
+ // NOTE: Z_OK is still corruption because it means we got the size wrong
438
+ return Status::Corruption("Failed zlib inflate: " + std::to_string(st));
439
+ }
440
+
441
+ // We should have no bytes left
442
+ if (_stream.avail_out != 0) {
443
+ inflateEnd(&_stream);
444
+ return Status::Corruption("Size mismatch decompressing zlib data");
445
+ }
446
+
447
+ inflateEnd(&_stream);
448
+ return Status::OK();
449
+ #else
450
+ (void)args;
451
+ (void)dict;
452
+ (void)uncompressed_output;
453
+ return Status::NotSupported("Zlib not supported in this build");
454
+ #endif
455
+ }
456
+
457
+ Status BZip2_DecompressBlock(const Decompressor::Args& args,
458
+ char* uncompressed_output) {
459
+ #ifdef BZIP2
460
+ auto uncompressed_size = static_cast<unsigned int>(args.uncompressed_size);
461
+ if (BZ_OK != BZ2_bzBuffToBuffDecompress(
462
+ uncompressed_output, &uncompressed_size,
463
+ const_cast<char*>(args.compressed_data.data()),
464
+ static_cast<unsigned int>(args.compressed_data.size()),
465
+ 0 /*small mem*/, 0 /*verbosity*/)) {
466
+ return Status::Corruption("Error decompressing bzip2 data");
467
+ }
468
+ if (uncompressed_size != args.uncompressed_size) {
469
+ return Status::Corruption("Size mismatch decompressing bzip2 data");
470
+ }
471
+ return Status::OK();
472
+ #else
473
+ (void)args;
474
+ (void)uncompressed_output;
475
+ return Status::NotSupported("BZip2 not supported in this build");
476
+ #endif
477
+ }
478
+
479
+ Status LZ4_DecompressBlock(const Decompressor::Args& args, Slice dict,
480
+ char* uncompressed_output) {
481
+ #ifdef LZ4
482
+ int expected_uncompressed_size = static_cast<int>(args.uncompressed_size);
483
+ #if LZ4_VERSION_NUMBER >= 10400 // r124+
484
+ LZ4_streamDecode_t* stream = LZ4_createStreamDecode();
485
+ if (!dict.empty()) {
486
+ LZ4_setStreamDecode(stream, dict.data(), static_cast<int>(dict.size()));
487
+ }
488
+ int uncompressed_size = LZ4_decompress_safe_continue(
489
+ stream, args.compressed_data.data(), uncompressed_output,
490
+ static_cast<int>(args.compressed_data.size()),
491
+ expected_uncompressed_size);
492
+ LZ4_freeStreamDecode(stream);
493
+ #else // up to r123
494
+ if (!dict.empty()) {
495
+ return Status::NotSupported(
496
+ "This build doesn't support dictionary compression with LZ4");
497
+ }
498
+ int uncompressed_size =
499
+ LZ4_decompress_safe(args.compressed_data.data(), uncompressed_output,
500
+ static_cast<int>(args.compressed_data.size()),
501
+ expected_uncompressed_size);
502
+ #endif // LZ4_VERSION_NUMBER >= 10400
503
+
504
+ if (uncompressed_size != expected_uncompressed_size) {
505
+ if (uncompressed_size < 0) {
506
+ return Status::Corruption("Error decompressing LZ4 data");
507
+ } else {
508
+ return Status::Corruption("Size mismatch decompressing LZ4 data");
509
+ }
510
+ }
511
+ return Status::OK();
512
+ #else
513
+ (void)args;
514
+ (void)dict;
515
+ (void)uncompressed_output;
516
+ return Status::NotSupported("LZ4 not supported in this build");
517
+ #endif
518
+ }
519
+
520
+ Status XPRESS_DecompressBlock(const Decompressor::Args& args,
521
+ char* uncompressed_output) {
522
+ #ifdef XPRESS
523
+ int64_t actual_uncompressed_size = port::xpress::DecompressToBuffer(
524
+ args.compressed_data.data(), args.compressed_data.size(),
525
+ uncompressed_output, args.uncompressed_size);
526
+ if (actual_uncompressed_size !=
527
+ static_cast<int64_t>(args.uncompressed_size)) {
528
+ if (actual_uncompressed_size < 0) {
529
+ return Status::Corruption("Error decompressing XPRESS data");
530
+ } else {
531
+ return Status::Corruption("Size mismatch decompressing XPRESS data");
532
+ }
533
+ }
534
+ return Status::OK();
535
+ #else
536
+ (void)args;
537
+ (void)uncompressed_output;
538
+ return Status::NotSupported("XPRESS not supported in this build");
539
+ #endif
540
+ }
541
+
542
+ template <bool kIsDigestedDict = false>
543
+ Status ZSTD_DecompressBlockWithContext(
544
+ const Decompressor::Args& args,
545
+ std::conditional_t<kIsDigestedDict, void*, Slice> dict,
546
+ ZSTDUncompressCachedData::ZSTDNativeContext zstd_context,
547
+ char* uncompressed_output) {
548
+ #ifdef ZSTD
549
+ size_t uncompressed_size;
550
+ assert(zstd_context != nullptr);
551
+ if constexpr (kIsDigestedDict) {
552
+ #ifdef ROCKSDB_ZSTD_DDICT
553
+ uncompressed_size = ZSTD_decompress_usingDDict(
554
+ zstd_context, uncompressed_output, args.uncompressed_size,
555
+ args.compressed_data.data(), args.compressed_data.size(),
556
+ static_cast<ZSTD_DDict*>(dict));
557
+ #else
558
+ static_assert(!kIsDigestedDict,
559
+ "Inconsistent expectation of ZSTD digested dict support");
560
+ #endif // ROCKSDB_ZSTD_DDICT
561
+ } else if (dict.empty()) {
562
+ uncompressed_size = ZSTD_decompressDCtx(
563
+ zstd_context, uncompressed_output, args.uncompressed_size,
564
+ args.compressed_data.data(), args.compressed_data.size());
565
+ } else {
566
+ uncompressed_size = ZSTD_decompress_usingDict(
567
+ zstd_context, uncompressed_output, args.uncompressed_size,
568
+ args.compressed_data.data(), args.compressed_data.size(), dict.data(),
569
+ dict.size());
570
+ }
571
+ if (ZSTD_isError(uncompressed_size)) {
572
+ return Status::Corruption(std::string("ZSTD ") +
573
+ ZSTD_getErrorName(uncompressed_size));
574
+ } else if (uncompressed_size != args.uncompressed_size) {
575
+ return Status::Corruption("ZSTD decompression size mismatch");
576
+ } else {
577
+ return Status::OK();
578
+ }
579
+ #else
580
+ (void)args;
581
+ (void)dict;
582
+ (void)zstd_context;
583
+ (void)uncompressed_output;
584
+ return Status::NotSupported("ZSTD not supported in this build");
585
+ #endif
586
+ }
587
+
588
+ template <bool kIsDigestedDict = false>
589
+ Status ZSTD_DecompressBlock(
590
+ const Decompressor::Args& args,
591
+ std::conditional_t<kIsDigestedDict, void*, Slice> dict,
592
+ const Decompressor* decompressor, char* uncompressed_output) {
593
+ if (args.working_area && args.working_area->owner() == decompressor) {
594
+ auto ctx = static_cast<UncompressionContext*>(args.working_area->get());
595
+ assert(ctx != nullptr);
596
+ if (ctx->GetZSTDContext() != nullptr) {
597
+ return ZSTD_DecompressBlockWithContext<kIsDigestedDict>(
598
+ args, dict, ctx->GetZSTDContext(), uncompressed_output);
599
+ }
600
+ }
601
+ UncompressionContext tmp_ctx{kZSTD};
602
+ return ZSTD_DecompressBlockWithContext<kIsDigestedDict>(
603
+ args, dict, tmp_ctx.GetZSTDContext(), uncompressed_output);
604
+ }
605
+
606
+ class BuiltinDecompressorV2 : public Decompressor {
607
+ public:
608
+ const char* Name() const override { return "BuiltinDecompressorV2"; }
609
+
610
+ Status ExtractUncompressedSize(Args& args) override {
611
+ assert(args.compression_type != kNoCompression);
612
+ if (args.compression_type == kSnappyCompression) {
613
+ // 1st exception to encoding of uncompressed size
614
+ #ifdef SNAPPY
615
+ size_t uncompressed_length = 0;
616
+ if (!snappy::GetUncompressedLength(args.compressed_data.data(),
617
+ args.compressed_data.size(),
618
+ &uncompressed_length)) {
619
+ return Status::Corruption("Error reading snappy compressed length");
620
+ }
621
+ args.uncompressed_size = uncompressed_length;
622
+ return Status::OK();
623
+ #else
624
+ return Status::NotSupported("Snappy not supported in this build");
625
+ #endif
626
+ } else if (args.compression_type == kXpressCompression) {
627
+ // 2nd exception to encoding of uncompressed size
628
+ #ifdef XPRESS
629
+ int64_t result = port::xpress::GetDecompressedSize(
630
+ args.compressed_data.data(), args.compressed_data.size());
631
+ if (result < 0) {
632
+ return Status::Corruption("Error reading XPRESS compressed length");
633
+ }
634
+ args.uncompressed_size = static_cast<size_t>(result);
635
+ return Status::OK();
636
+ #else
637
+ return Status::NotSupported("XPRESS not supported in this build");
638
+ #endif
639
+
640
+ } else {
641
+ // Extract encoded uncompressed size
642
+ return Decompressor::ExtractUncompressedSize(args);
643
+ }
644
+ }
645
+
646
+ Status DecompressBlock(const Args& args, char* uncompressed_output) override {
647
+ switch (args.compression_type) {
648
+ case kSnappyCompression:
649
+ return Snappy_DecompressBlock(args, uncompressed_output);
650
+ case kZlibCompression:
651
+ return Zlib_DecompressBlock(args, /*dict=*/Slice{},
652
+ uncompressed_output);
653
+ case kBZip2Compression:
654
+ return BZip2_DecompressBlock(args, uncompressed_output);
655
+ case kLZ4Compression:
656
+ case kLZ4HCCompression:
657
+ return LZ4_DecompressBlock(args, /*dict=*/Slice{}, uncompressed_output);
658
+ case kXpressCompression:
659
+ return XPRESS_DecompressBlock(args, uncompressed_output);
660
+ case kZSTD:
661
+ return ZSTD_DecompressBlock(args, /*dict=*/Slice{}, this,
662
+ uncompressed_output);
663
+ default:
664
+ return Status::NotSupported(
665
+ "Compression type not supported or not built-in: " +
666
+ CompressionTypeToString(args.compression_type));
667
+ }
668
+ }
669
+
670
+ Status MaybeCloneForDict(const Slice&,
671
+ std::unique_ptr<Decompressor>*) override;
672
+
673
+ size_t ApproximateOwnedMemoryUsage() const override {
674
+ return sizeof(BuiltinDecompressorV2);
675
+ }
676
+ };
677
+
678
+ class BuiltinDecompressorV2SnappyOnly : public BuiltinDecompressorV2 {
679
+ public:
680
+ const char* Name() const override {
681
+ return "BuiltinDecompressorV2SnappyOnly";
682
+ }
683
+
684
+ Status ExtractUncompressedSize(Args& args) override {
685
+ assert(args.compression_type == kSnappyCompression);
686
+ #ifdef SNAPPY
687
+ size_t uncompressed_length = 0;
688
+ if (!snappy::GetUncompressedLength(args.compressed_data.data(),
689
+ args.compressed_data.size(),
690
+ &uncompressed_length)) {
691
+ return Status::Corruption("Error reading snappy compressed length");
692
+ }
693
+ args.uncompressed_size = uncompressed_length;
694
+ return Status::OK();
695
+ #else
696
+ return Status::NotSupported("Snappy not supported in this build");
697
+ #endif
698
+ }
699
+
700
+ Status DecompressBlock(const Args& args, char* uncompressed_output) override {
701
+ assert(args.compression_type == kSnappyCompression);
702
+ return Snappy_DecompressBlock(args, uncompressed_output);
703
+ }
704
+ };
705
+
706
+ class BuiltinDecompressorV2WithDict : public BuiltinDecompressorV2 {
707
+ public:
708
+ explicit BuiltinDecompressorV2WithDict(const Slice& dict) : dict_(dict) {}
709
+
710
+ const char* Name() const override { return "BuiltinDecompressorV2WithDict"; }
711
+
712
+ Status DecompressBlock(const Args& args, char* uncompressed_output) override {
713
+ switch (args.compression_type) {
714
+ case kSnappyCompression:
715
+ // NOTE: quietly ignores the dictionary (for compatibility)
716
+ return Snappy_DecompressBlock(args, uncompressed_output);
717
+ case kZlibCompression:
718
+ return Zlib_DecompressBlock(args, dict_, uncompressed_output);
719
+ case kBZip2Compression:
720
+ // NOTE: quietly ignores the dictionary (for compatibility)
721
+ return BZip2_DecompressBlock(args, uncompressed_output);
722
+ case kLZ4Compression:
723
+ case kLZ4HCCompression:
724
+ return LZ4_DecompressBlock(args, dict_, uncompressed_output);
725
+ case kXpressCompression:
726
+ // NOTE: quietly ignores the dictionary (for compatibility)
727
+ return XPRESS_DecompressBlock(args, uncompressed_output);
728
+ case kZSTD:
729
+ return ZSTD_DecompressBlock(args, dict_, this, uncompressed_output);
730
+ default:
731
+ return Status::NotSupported(
732
+ "Compression type not supported or not built-in: " +
733
+ CompressionTypeToString(args.compression_type));
734
+ }
735
+ }
736
+
737
+ const Slice& GetSerializedDict() const override { return dict_; }
738
+
739
+ size_t ApproximateOwnedMemoryUsage() const override {
740
+ return sizeof(BuiltinDecompressorV2WithDict);
741
+ }
742
+
743
+ protected:
744
+ const Slice dict_;
745
+ };
746
+
747
+ Status BuiltinDecompressorV2::MaybeCloneForDict(
748
+ const Slice& dict, std::unique_ptr<Decompressor>* out) {
749
+ // Because of unfortunate decisions in handling built-in compression types,
750
+ // all the compression types before ZSTD that do not actually support
751
+ // dictionary compression pretend to support it. Specifically, we have to be
752
+ // able to read files with a compression dictionary block using those
753
+ // compression types even though the compression dictionary is ignored by
754
+ // the compression algorithm. And the Decompressor has to return the
755
+ // configured dictionary from GetSerializedDict() even if it is ignored. This
756
+ // unfortunately means that a new schema version (BuiltinV3?) would be needed
757
+ // toactually support dictionary compression in the future for these
758
+ // algorithms (if the libraries add support).
759
+ // TODO: can we make this a better/cleaner experience?
760
+ *out = std::make_unique<BuiltinDecompressorV2WithDict>(dict);
761
+ return Status::OK();
762
+ }
763
+
764
+ class BuiltinDecompressorV2OptimizeZstd : public BuiltinDecompressorV2 {
765
+ public:
766
+ const char* Name() const override {
767
+ return "BuiltinDecompressorV2OptimizeZstd";
768
+ }
769
+
770
+ ManagedWorkingArea ObtainWorkingArea(CompressionType preferred) override {
771
+ if (preferred == kZSTD) {
772
+ // TODO: evaluate whether it makes sense to use core local cache here.
773
+ // (Perhaps not, because explicit WorkingArea could be long-running.)
774
+ return ManagedWorkingArea(new UncompressionContext(kZSTD), this);
775
+ } else {
776
+ return {};
777
+ }
778
+ }
779
+
780
+ void ReleaseWorkingArea(WorkingArea* wa) override {
781
+ delete static_cast<UncompressionContext*>(wa);
782
+ }
783
+
784
+ Status DecompressBlock(const Args& args, char* uncompressed_output) override {
785
+ if (LIKELY(args.compression_type == kZSTD)) {
786
+ return ZSTD_DecompressBlock(args, /*dict=*/Slice{}, this,
787
+ uncompressed_output);
788
+ } else {
789
+ return BuiltinDecompressorV2::DecompressBlock(args, uncompressed_output);
790
+ }
791
+ }
792
+
793
+ Status MaybeCloneForDict(const Slice& /*serialized_dict*/,
794
+ std::unique_ptr<Decompressor>* /*out*/) override;
795
+ };
796
+
797
+ class BuiltinDecompressorV2OptimizeZstdWithDict
798
+ : public BuiltinDecompressorV2OptimizeZstd {
799
+ public:
800
+ BuiltinDecompressorV2OptimizeZstdWithDict(const Slice& dict)
801
+ :
802
+ #ifdef ROCKSDB_ZSTD_DDICT
803
+ dict_(dict),
804
+ ddict_(ZSTD_createDDict_byReference(dict.data(), dict.size())) {
805
+ assert(ddict_ != nullptr);
806
+ }
807
+ #else
808
+ dict_(dict) {
809
+ }
810
+ #endif // ROCKSDB_ZSTD_DDICT
811
+
812
+ const char* Name() const override {
813
+ return "BuiltinDecompressorV2OptimizeZstdWithDict";
814
+ }
815
+
816
+ ~BuiltinDecompressorV2OptimizeZstdWithDict() override {
817
+ #ifdef ROCKSDB_ZSTD_DDICT
818
+ size_t res = ZSTD_freeDDict(ddict_);
819
+ assert(res == 0); // Last I checked they can't fail
820
+ (void)res; // prevent unused var warning
821
+ #endif // ROCKSDB_ZSTD_DDICT
822
+ }
823
+
824
+ const Slice& GetSerializedDict() const override { return dict_; }
825
+
826
+ size_t ApproximateOwnedMemoryUsage() const override {
827
+ size_t sz = sizeof(BuiltinDecompressorV2WithDict);
828
+ #ifdef ROCKSDB_ZSTD_DDICT
829
+ sz += ZSTD_sizeof_DDict(ddict_);
830
+ #endif // ROCKSDB_ZSTD_DDICT
831
+ return sz;
832
+ }
833
+
834
+ Status DecompressBlock(const Args& args, char* uncompressed_output) override {
835
+ if (LIKELY(args.compression_type == kZSTD)) {
836
+ #ifdef ROCKSDB_ZSTD_DDICT
837
+ return ZSTD_DecompressBlock</*kIsDigestedDict=*/true>(
838
+ args, ddict_, this, uncompressed_output);
839
+ #else
840
+ return ZSTD_DecompressBlock(args, dict_, this, uncompressed_output);
841
+ #endif // ROCKSDB_ZSTD_DDICT
842
+ } else {
843
+ return BuiltinDecompressorV2WithDict(dict_).DecompressBlock(
844
+ args, uncompressed_output);
845
+ }
846
+ }
847
+
848
+ protected:
849
+ const Slice dict_;
850
+ #ifdef ROCKSDB_ZSTD_DDICT
851
+ ZSTD_DDict* const ddict_;
852
+ #endif // ROCKSDB_ZSTD_DDICT
853
+ };
854
+
855
+ Status BuiltinDecompressorV2OptimizeZstd::MaybeCloneForDict(
856
+ const Slice& serialized_dict, std::unique_ptr<Decompressor>* out) {
857
+ *out = std::make_unique<BuiltinDecompressorV2OptimizeZstdWithDict>(
858
+ serialized_dict);
859
+ return Status::OK();
860
+ }
861
+ class BuiltinCompressionManagerV2 : public CompressionManager {
862
+ public:
863
+ BuiltinCompressionManagerV2() = default;
864
+ ~BuiltinCompressionManagerV2() override = default;
865
+
866
+ const char* Name() const override { return "BuiltinCompressionManagerV2"; }
867
+
868
+ const char* CompatibilityName() const override { return "BuiltinV2"; }
869
+
870
+ std::unique_ptr<Compressor> GetCompressor(const CompressionOptions& opts,
871
+ CompressionType type) override {
872
+ if (opts.max_compressed_bytes_per_kb <= 0) {
873
+ // No acceptable compression ratio => no compression
874
+ return nullptr;
875
+ }
876
+ if (type > kLastBuiltinCompression) {
877
+ // Unrecognized; fall back on default compression
878
+ type = ColumnFamilyOptions{}.compression;
879
+ }
880
+ if (type == kNoCompression) {
881
+ return nullptr;
882
+ } else {
883
+ return std::make_unique<BuiltinCompressorV2>(opts, type);
884
+ }
885
+ }
886
+
887
+ std::shared_ptr<Decompressor> GetDecompressor() override {
888
+ return GetGeneralDecompressor();
889
+ }
890
+
891
+ std::shared_ptr<Decompressor> GetDecompressorOptimizeFor(
892
+ CompressionType optimize_for_type) override {
893
+ if (optimize_for_type == kZSTD) {
894
+ return GetZstdDecompressor();
895
+ } else {
896
+ return GetGeneralDecompressor();
897
+ }
898
+ }
899
+
900
+ std::shared_ptr<Decompressor> GetDecompressorForTypes(
901
+ const CompressionType* types_begin,
902
+ const CompressionType* types_end) override {
903
+ if (types_begin == types_end) {
904
+ return nullptr;
905
+ } else if (types_begin + 1 == types_end &&
906
+ *types_begin == kSnappyCompression) {
907
+ return GetSnappyDecompressor();
908
+ } else if (std::find(types_begin, types_end, kZSTD)) {
909
+ return GetZstdDecompressor();
910
+ } else {
911
+ return GetGeneralDecompressor();
912
+ }
913
+ }
914
+ std::shared_ptr<Decompressor> GetDecompressorForCompressor(
915
+ const Compressor& compressor) override {
916
+ #ifdef ROCKSDB_USE_RTTI
917
+ // To be extra safe, only optimize here if we are certain we are not
918
+ // looking at a wrapped compressor, so that we are sure it only uses that
919
+ // one compression type.
920
+ if (dynamic_cast<const BuiltinCompressorV2*>(&compressor)) {
921
+ CompressionType type = compressor.GetPreferredCompressionType();
922
+ return GetDecompressorForTypes(&type, &type + 1);
923
+ }
924
+ #endif
925
+ // Fallback
926
+ return CompressionManager::GetDecompressorForCompressor(compressor);
927
+ }
928
+
929
+ bool SupportsCompressionType(CompressionType type) const override {
930
+ return CompressionTypeSupported(type);
931
+ }
932
+
933
+ protected:
934
+ BuiltinDecompressorV2 decompressor_;
935
+ BuiltinDecompressorV2OptimizeZstd zstd_decompressor_;
936
+ BuiltinDecompressorV2SnappyOnly snappy_decompressor_;
937
+
938
+ inline std::shared_ptr<Decompressor> GetGeneralDecompressor() {
939
+ return std::shared_ptr<Decompressor>(shared_from_this(), &decompressor_);
940
+ }
941
+
942
+ inline std::shared_ptr<Decompressor> GetZstdDecompressor() {
943
+ return std::shared_ptr<Decompressor>(shared_from_this(),
944
+ &zstd_decompressor_);
945
+ }
946
+
947
+ inline std::shared_ptr<Decompressor> GetSnappyDecompressor() {
948
+ return std::shared_ptr<Decompressor>(shared_from_this(),
949
+ &snappy_decompressor_);
950
+ }
951
+ };
952
+
953
+ const std::shared_ptr<BuiltinCompressionManagerV1>
954
+ kBuiltinCompressionManagerV1 =
955
+ std::make_shared<BuiltinCompressionManagerV1>();
956
+ const std::shared_ptr<BuiltinCompressionManagerV2>
957
+ kBuiltinCompressionManagerV2 =
958
+ std::make_shared<BuiltinCompressionManagerV2>();
959
+
960
+ } // namespace
961
+
962
+ Status CompressionManager::CreateFromString(
963
+ const ConfigOptions& config_options, const std::string& value,
964
+ std::shared_ptr<CompressionManager>* result) {
965
+ if (value == kNullptrString || value.empty()) {
966
+ result->reset();
967
+ return Status::OK();
968
+ }
969
+
970
+ static std::once_flag loaded;
971
+ std::call_once(loaded, [&]() {
972
+ auto& library = *ObjectLibrary::Default();
973
+ // TODO: try to enhance ObjectLibrary to support singletons
974
+ library.AddFactory<CompressionManager>(
975
+ kBuiltinCompressionManagerV1->CompatibilityName(),
976
+ [](const std::string& /*uri*/,
977
+ std::unique_ptr<CompressionManager>* guard,
978
+ std::string* /*errmsg*/) {
979
+ *guard = std::make_unique<BuiltinCompressionManagerV1>();
980
+ return guard->get();
981
+ });
982
+ library.AddFactory<CompressionManager>(
983
+ kBuiltinCompressionManagerV2->CompatibilityName(),
984
+ [](const std::string& /*uri*/,
985
+ std::unique_ptr<CompressionManager>* guard,
986
+ std::string* /*errmsg*/) {
987
+ *guard = std::make_unique<BuiltinCompressionManagerV2>();
988
+ return guard->get();
989
+ });
990
+ });
991
+
992
+ std::string id;
993
+ std::unordered_map<std::string, std::string> opt_map;
994
+ Status status = Customizable::GetOptionsMap(config_options, result->get(),
995
+ value, &id, &opt_map);
996
+ if (!status.ok()) { // GetOptionsMap failed
997
+ return status;
998
+ } else if (id.empty()) { // We have no Id but have options. Not good
999
+ return Status::NotSupported("Cannot reset object ", id);
1000
+ } else {
1001
+ status = config_options.registry->NewSharedObject(id, result);
1002
+ }
1003
+ if (config_options.ignore_unsupported_options && status.IsNotSupported()) {
1004
+ return Status::OK();
1005
+ } else if (status.ok()) {
1006
+ status = Customizable::ConfigureNewObject(config_options, result->get(),
1007
+ opt_map);
1008
+ }
1009
+ return status;
1010
+ }
1011
+
1012
+ std::shared_ptr<CompressionManager>
1013
+ CompressionManager::FindCompatibleCompressionManager(Slice compatibility_name) {
1014
+ if (compatibility_name.compare(CompatibilityName()) == 0) {
1015
+ return shared_from_this();
1016
+ } else {
1017
+ std::shared_ptr<CompressionManager> out;
1018
+ Status s =
1019
+ CreateFromString(ConfigOptions(), compatibility_name.ToString(), &out);
1020
+ if (s.ok()) {
1021
+ return out;
1022
+ } else {
1023
+ return nullptr;
1024
+ }
1025
+ }
1026
+ }
1027
+
1028
+ const std::shared_ptr<CompressionManager>& GetBuiltinCompressionManager(
1029
+ int compression_format_version) {
1030
+ static const std::shared_ptr<CompressionManager> v1_as_base =
1031
+ kBuiltinCompressionManagerV1;
1032
+ static const std::shared_ptr<CompressionManager> v2_as_base =
1033
+ kBuiltinCompressionManagerV2;
1034
+ static const std::shared_ptr<CompressionManager> none;
1035
+ if (compression_format_version == 1) {
1036
+ return v1_as_base;
1037
+ } else if (compression_format_version == 2) {
1038
+ return v2_as_base;
1039
+ } else {
1040
+ // Unrecognized. In some cases this is unexpected and the caller can
1041
+ // rightfully crash.
1042
+ return none;
1043
+ }
1044
+ }
1045
+
1046
+ const std::shared_ptr<CompressionManager>& GetBuiltinV2CompressionManager() {
1047
+ return GetBuiltinCompressionManager(2);
1048
+ }
1049
+
1050
+ // ***********************************************************************
1051
+ // END built-in implementation of customization interface
1052
+ // ***********************************************************************
1053
+
122
1054
  } // namespace ROCKSDB_NAMESPACE