@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,10 +5,12 @@
5
5
 
6
6
  #include "db/wide/wide_column_serialization.h"
7
7
 
8
- #include <algorithm>
9
8
  #include <cassert>
10
- #include <limits>
9
+ #include <cstring>
11
10
 
11
+ #include "db/blob/blob_fetcher.h"
12
+ #include "db/blob/blob_index.h"
13
+ #include "db/blob/prefetch_buffer_collection.h"
12
14
  #include "db/wide/wide_columns_helper.h"
13
15
  #include "rocksdb/slice.h"
14
16
  #include "util/autovector.h"
@@ -16,15 +18,46 @@
16
18
 
17
19
  namespace ROCKSDB_NAMESPACE {
18
20
 
21
+ Status WideColumnSerialization::BuildBlobIndexMap(
22
+ size_t num_columns,
23
+ const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
24
+ std::vector<const BlobIndex*>& blob_index_map) {
25
+ if (Status s = ValidateWideColumnLimit(num_columns, "Too many wide columns");
26
+ !s.ok()) {
27
+ return s;
28
+ }
29
+
30
+ blob_index_map.assign(num_columns, nullptr);
31
+ for (const auto& blob_col : blob_columns) {
32
+ if (blob_col.first >= blob_index_map.size()) {
33
+ return Status::InvalidArgument("Blob column index out of range");
34
+ }
35
+ blob_index_map[blob_col.first] = &blob_col.second;
36
+ }
37
+
38
+ return Status::OK();
39
+ }
40
+
41
+ bool WideColumnSerialization::ContainsBlobType(const char* type_bytes,
42
+ uint32_t num_columns) {
43
+ for (uint32_t i = 0; i < num_columns; ++i) {
44
+ if (static_cast<uint8_t>(type_bytes[i]) == kTypeBlobIndex) {
45
+ return true;
46
+ }
47
+ }
48
+ return false;
49
+ }
50
+
19
51
  Status WideColumnSerialization::Serialize(const WideColumns& columns,
20
52
  std::string& output) {
21
53
  const size_t num_columns = columns.size();
22
54
 
23
- if (num_columns > static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
24
- return Status::InvalidArgument("Too many wide columns");
55
+ if (Status sv = ValidateWideColumnLimit(num_columns, "Too many wide columns");
56
+ !sv.ok()) {
57
+ return sv;
25
58
  }
26
59
 
27
- PutVarint32(&output, kCurrentVersion);
60
+ PutVarint32(&output, kVersion1);
28
61
 
29
62
  PutVarint32(&output, static_cast<uint32_t>(num_columns));
30
63
 
@@ -34,19 +67,23 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
34
67
  const WideColumn& column = columns[i];
35
68
 
36
69
  const Slice& name = column.name();
37
- if (name.size() >
38
- static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
39
- return Status::InvalidArgument("Wide column name too long");
70
+ if (Status s_name =
71
+ ValidateWideColumnLimit(name.size(), "Wide column name too long");
72
+ !s_name.ok()) {
73
+ return s_name;
40
74
  }
41
75
 
42
- if (prev_name && prev_name->compare(name) >= 0) {
43
- return Status::Corruption("Wide columns out of order");
76
+ if (prev_name) {
77
+ if (Status so = ValidateColumnOrder(*prev_name, name); !so.ok()) {
78
+ return so;
79
+ }
44
80
  }
45
81
 
46
82
  const Slice& value = column.value();
47
- if (value.size() >
48
- static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
49
- return Status::InvalidArgument("Wide column value too long");
83
+ if (Status s_val =
84
+ ValidateWideColumnLimit(value.size(), "Wide column value too long");
85
+ !s_val.ok()) {
86
+ return s_val;
50
87
  }
51
88
 
52
89
  PutLengthPrefixedSlice(&output, name);
@@ -64,28 +101,151 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
64
101
  return Status::OK();
65
102
  }
66
103
 
67
- Status WideColumnSerialization::Deserialize(Slice& input,
68
- WideColumns& columns) {
69
- assert(columns.empty());
70
-
71
- uint32_t version = 0;
72
- if (!GetVarint32(&input, &version)) {
73
- return Status::Corruption("Error decoding wide column version");
104
+ template <typename GetName, typename GetValue>
105
+ Status WideColumnSerialization::SerializeV2Impl(
106
+ size_t num_columns,
107
+ const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
108
+ std::string& output, GetName get_name, GetValue get_value) {
109
+ std::vector<const BlobIndex*> blob_index_map;
110
+ if (Status s = BuildBlobIndexMap(num_columns, blob_columns, blob_index_map);
111
+ !s.ok()) {
112
+ return s;
74
113
  }
114
+ assert(blob_index_map.size() == num_columns);
115
+
116
+ // First pass: validate column ordering, compute sizes, serialize blob
117
+ // indices, and build column types.
118
+ std::vector<std::string> serialized_blob_indices(num_columns);
119
+ std::vector<uint32_t> name_sizes(num_columns);
120
+ std::vector<uint32_t> value_sizes(num_columns);
121
+ std::string column_types;
122
+ column_types.reserve(num_columns);
123
+
124
+ Slice prev_name_storage;
125
+ bool has_prev = false;
126
+ uint32_t name_sizes_bytes = 0;
127
+ uint32_t names_bytes = 0;
128
+ uint32_t total_value_sizes_bytes = 0;
129
+ uint32_t total_values_bytes = 0;
130
+
131
+ for (size_t i = 0; i < num_columns; ++i) {
132
+ const Slice name = get_name(i);
133
+ const Slice value = get_value(i);
134
+
135
+ if (Status sn =
136
+ ValidateWideColumnLimit(name.size(), "Wide column name too long");
137
+ !sn.ok()) {
138
+ return sn;
139
+ }
75
140
 
76
- if (version > kCurrentVersion) {
77
- return Status::NotSupported("Unsupported wide column version");
78
- }
141
+ if (has_prev) {
142
+ if (Status so = ValidateColumnOrder(prev_name_storage, name); !so.ok()) {
143
+ return so;
144
+ }
145
+ }
79
146
 
80
- uint32_t num_columns = 0;
81
- if (!GetVarint32(&input, &num_columns)) {
82
- return Status::Corruption("Error decoding number of wide columns");
147
+ name_sizes[i] = static_cast<uint32_t>(name.size());
148
+ name_sizes_bytes += VarintLength(name_sizes[i]);
149
+ names_bytes += name_sizes[i];
150
+
151
+ if (blob_index_map[i] != nullptr) {
152
+ const BlobIndex* blob_idx = blob_index_map[i];
153
+ blob_idx->EncodeTo(&serialized_blob_indices[i]);
154
+ value_sizes[i] = static_cast<uint32_t>(serialized_blob_indices[i].size());
155
+ column_types.push_back(static_cast<char>(kTypeBlobIndex));
156
+ } else {
157
+ if (Status svl = ValidateWideColumnLimit(value.size(),
158
+ "Wide column value too long");
159
+ !svl.ok()) {
160
+ return svl;
161
+ }
162
+ value_sizes[i] = static_cast<uint32_t>(value.size());
163
+ column_types.push_back(static_cast<char>(kTypeValue));
164
+ }
165
+
166
+ total_value_sizes_bytes += VarintLength(value_sizes[i]);
167
+ total_values_bytes += value_sizes[i];
168
+
169
+ prev_name_storage = name;
170
+ has_prev = true;
83
171
  }
84
172
 
85
- if (!num_columns) {
173
+ // Second pass: write all V2 sections to output.
174
+ // Pre-allocate output string.
175
+ const size_t total_size =
176
+ VarintLength(kVersion2) +
177
+ VarintLength(static_cast<uint32_t>(num_columns)) +
178
+ num_columns + // column types
179
+ VarintLength(name_sizes_bytes) + VarintLength(total_value_sizes_bytes) +
180
+ VarintLength(names_bytes) + name_sizes_bytes + total_value_sizes_bytes +
181
+ names_bytes + total_values_bytes;
182
+
183
+ const size_t base_offset = output.size();
184
+ output.reserve(base_offset + total_size);
185
+
186
+ // Sections 1-3: header, skip info, column types
187
+ PutVarint32(&output, kVersion2);
188
+ PutVarint32(&output, static_cast<uint32_t>(num_columns));
189
+ PutVarint32(&output, name_sizes_bytes);
190
+ PutVarint32(&output, total_value_sizes_bytes);
191
+ PutVarint32(&output, names_bytes);
192
+ output.append(column_types);
193
+
194
+ // Sections 4-7: resize to final size, then write all 4 sections in a
195
+ // single loop using independent pointers. Each section's start offset is
196
+ // known from the sizes computed in the first pass.
197
+ if (num_columns == 0) {
86
198
  return Status::OK();
87
199
  }
88
200
 
201
+ const size_t sec4_offset = output.size();
202
+ output.resize(base_offset + total_size);
203
+
204
+ char* s4 = &output[sec4_offset]; // section 4: name sizes
205
+ char* s5 = s4 + name_sizes_bytes; // section 5: value sizes
206
+ char* s6 = s5 + total_value_sizes_bytes; // section 6: names
207
+ char* s7 = s6 + names_bytes; // section 7: values
208
+
209
+ for (size_t i = 0; i < num_columns; ++i) {
210
+ s4 = EncodeVarint32(s4, name_sizes[i]);
211
+ s5 = EncodeVarint32(s5, value_sizes[i]);
212
+
213
+ memcpy(s6, get_name(i).data(), name_sizes[i]);
214
+ s6 += name_sizes[i];
215
+
216
+ if (blob_index_map[i] != nullptr) {
217
+ memcpy(s7, serialized_blob_indices[i].data(), value_sizes[i]);
218
+ } else {
219
+ memcpy(s7, get_value(i).data(), value_sizes[i]);
220
+ }
221
+ s7 += value_sizes[i];
222
+ }
223
+
224
+ return Status::OK();
225
+ }
226
+
227
+ Status WideColumnSerialization::SerializeV2(
228
+ const std::vector<std::pair<std::string, std::string>>& columns,
229
+ const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
230
+ std::string& output) {
231
+ return SerializeV2Impl(
232
+ columns.size(), blob_columns, output,
233
+ [&](size_t i) { return Slice(columns[i].first); },
234
+ [&](size_t i) { return Slice(columns[i].second); });
235
+ }
236
+
237
+ Status WideColumnSerialization::SerializeV2(
238
+ const WideColumns& columns,
239
+ const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
240
+ std::string& output) {
241
+ return SerializeV2Impl(
242
+ columns.size(), blob_columns, output,
243
+ [&](size_t i) { return columns[i].name(); },
244
+ [&](size_t i) { return columns[i].value(); });
245
+ }
246
+
247
+ Status WideColumnSerialization::DeserializeV1(
248
+ Slice& input, uint32_t num_columns, std::vector<WideColumn>& columns) {
89
249
  columns.reserve(num_columns);
90
250
 
91
251
  autovector<uint32_t, 16> column_value_sizes;
@@ -97,8 +257,11 @@ Status WideColumnSerialization::Deserialize(Slice& input,
97
257
  return Status::Corruption("Error decoding wide column name");
98
258
  }
99
259
 
100
- if (!columns.empty() && columns.back().name().compare(name) >= 0) {
101
- return Status::Corruption("Wide columns out of order");
260
+ if (!columns.empty()) {
261
+ if (Status so = ValidateColumnOrder(columns.back().name(), name);
262
+ !so.ok()) {
263
+ return so;
264
+ }
102
265
  }
103
266
 
104
267
  columns.emplace_back(name, Slice());
@@ -129,12 +292,324 @@ Status WideColumnSerialization::Deserialize(Slice& input,
129
292
  return Status::OK();
130
293
  }
131
294
 
295
+ Status WideColumnSerialization::DeserializeV2Impl(
296
+ Slice& input, uint32_t num_columns, std::vector<WideColumn>& columns,
297
+ std::vector<ValueType>& column_types) {
298
+ // Section 2: SKIP INFO (3 varints)
299
+ uint32_t name_sizes_bytes = 0;
300
+ uint32_t value_sizes_bytes = 0;
301
+ uint32_t names_bytes = 0;
302
+ if (!GetVarint32(&input, &name_sizes_bytes)) {
303
+ return Status::Corruption("Error decoding wide column name sizes bytes");
304
+ }
305
+ if (!GetVarint32(&input, &value_sizes_bytes)) {
306
+ return Status::Corruption("Error decoding wide column value sizes bytes");
307
+ }
308
+ if (!GetVarint32(&input, &names_bytes)) {
309
+ return Status::Corruption("Error decoding wide column names bytes");
310
+ }
311
+
312
+ // Section 3: COLUMN TYPES (N bytes, each is a ValueType)
313
+ if (input.size() < num_columns) {
314
+ return Status::Corruption("Error decoding wide column types");
315
+ }
316
+ column_types.resize(num_columns);
317
+ for (uint32_t i = 0; i < num_columns; ++i) {
318
+ column_types[i] = static_cast<ValueType>(input[i]);
319
+ if (!IsValidColumnValueType(column_types[i])) {
320
+ return Status::Corruption("Unsupported wide column ValueType");
321
+ }
322
+ }
323
+ input.remove_prefix(num_columns);
324
+
325
+ // Validate that sections 4-6 fit in the remaining input
326
+ const size_t metadata_size =
327
+ name_sizes_bytes + value_sizes_bytes + names_bytes;
328
+ if (input.size() < metadata_size) {
329
+ return Status::Corruption("Error decoding wide column sections");
330
+ }
331
+
332
+ // Set up 4 pointers into sections 4-7 for single-loop parsing.
333
+ // Skip info gives us exact boundaries for each section.
334
+ const char* s4 = input.data(); // section 4: name sizes
335
+ const char* s4_limit = s4 + name_sizes_bytes;
336
+ const char* s5 = s4_limit; // section 5: value sizes
337
+ const char* s5_limit = s5 + value_sizes_bytes;
338
+ const char* s6 = s5_limit; // section 6: names
339
+ const char* s7 = s6 + names_bytes; // section 7: values
340
+ const char* input_end = input.data() + input.size();
341
+
342
+ columns.reserve(num_columns);
343
+ size_t name_pos = 0;
344
+ size_t value_pos = 0;
345
+
346
+ for (uint32_t i = 0; i < num_columns; ++i) {
347
+ // Decode name size from section 4
348
+ uint32_t ns = 0;
349
+ const char* s4_next = GetVarint32Ptr(s4, s4_limit, &ns);
350
+ if (s4_next == nullptr) {
351
+ return Status::Corruption("Error decoding wide column name size");
352
+ }
353
+ s4 = s4_next;
354
+
355
+ // Decode value size from section 5
356
+ uint32_t vs = 0;
357
+ const char* s5_next = GetVarint32Ptr(s5, s5_limit, &vs);
358
+ if (s5_next == nullptr) {
359
+ return Status::Corruption("Error decoding wide column value size");
360
+ }
361
+ s5 = s5_next;
362
+
363
+ // Read name from section 6
364
+ if (name_pos + ns > names_bytes) {
365
+ return Status::Corruption("Error decoding wide column name");
366
+ }
367
+ Slice name(s6 + name_pos, ns);
368
+
369
+ if (!columns.empty()) {
370
+ if (Status so = ValidateColumnOrder(columns.back().name(), name);
371
+ !so.ok()) {
372
+ return so;
373
+ }
374
+ }
375
+
376
+ // Read value from section 7
377
+ if (s7 + value_pos + vs > input_end) {
378
+ return Status::Corruption("Error decoding wide column value payload");
379
+ }
380
+
381
+ columns.emplace_back(name, Slice(s7 + value_pos, vs));
382
+ name_pos += ns;
383
+ value_pos += vs;
384
+ }
385
+
386
+ return Status::OK();
387
+ }
388
+
389
+ Status WideColumnSerialization::Deserialize(Slice& input,
390
+ WideColumns& columns) {
391
+ assert(columns.empty());
392
+
393
+ // Reuse DeserializeV2, then reject any blob references.
394
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns;
395
+ if (Status s = DeserializeV2(input, columns, blob_columns); !s.ok()) {
396
+ return s;
397
+ }
398
+
399
+ if (!blob_columns.empty()) {
400
+ return Status::NotSupported(
401
+ "Wide column contains blob references. Use DeserializeV2.");
402
+ }
403
+
404
+ return Status::OK();
405
+ }
406
+
407
+ Status WideColumnSerialization::DeserializeV2(
408
+ Slice& input, std::vector<WideColumn>& columns,
409
+ std::vector<std::pair<size_t, BlobIndex>>& blob_columns) {
410
+ assert(columns.empty());
411
+ assert(blob_columns.empty());
412
+
413
+ uint32_t version = 0;
414
+ if (!GetVarint32(&input, &version)) {
415
+ return Status::Corruption("Error decoding wide column version");
416
+ }
417
+
418
+ if (version > kVersion2) {
419
+ return Status::NotSupported("Unsupported wide column version");
420
+ }
421
+
422
+ uint32_t num_columns = 0;
423
+ if (!GetVarint32(&input, &num_columns)) {
424
+ return Status::Corruption("Error decoding number of wide columns");
425
+ }
426
+
427
+ if (!num_columns) {
428
+ return Status::OK();
429
+ }
430
+
431
+ if (version >= kVersion2) {
432
+ // V2 layout: parse columns and extract blob column info
433
+ std::vector<ValueType> column_types;
434
+
435
+ if (Status s = DeserializeV2Impl(input, num_columns, columns, column_types);
436
+ !s.ok()) {
437
+ return s;
438
+ }
439
+ assert(column_types.size() == num_columns);
440
+ assert(columns.size() == num_columns);
441
+
442
+ // Decode blob indices from value data
443
+ for (uint32_t i = 0; i < num_columns; ++i) {
444
+ if (column_types[i] == kTypeBlobIndex) {
445
+ BlobIndex blob_idx;
446
+ Slice blob_slice = columns[i].value();
447
+ if (Status bs = blob_idx.DecodeFrom(blob_slice); !bs.ok()) {
448
+ return Status::Corruption("Error decoding blob index in wide column");
449
+ }
450
+ blob_columns.emplace_back(i, blob_idx);
451
+ }
452
+ }
453
+ } else {
454
+ return DeserializeV1(input, num_columns, columns);
455
+ }
456
+
457
+ return Status::OK();
458
+ }
459
+
460
+ Status WideColumnSerialization::HasBlobColumns(const Slice& input,
461
+ bool& has_blob_columns) {
462
+ has_blob_columns = false;
463
+
464
+ Slice input_ref = input;
465
+
466
+ uint32_t version = 0;
467
+ if (!GetVarint32(&input_ref, &version)) {
468
+ return Status::Corruption("Error decoding wide column version");
469
+ }
470
+
471
+ // Version 1 never has blob columns
472
+ if (version < kVersion2) {
473
+ return Status::OK();
474
+ }
475
+
476
+ uint32_t num_columns = 0;
477
+ if (!GetVarint32(&input_ref, &num_columns)) {
478
+ return Status::Corruption("Error decoding number of wide columns");
479
+ }
480
+
481
+ if (!num_columns) {
482
+ return Status::OK();
483
+ }
484
+
485
+ // V2: Skip over SKIP INFO (3 varints) to reach COLUMN TYPES section.
486
+ uint32_t unused_name_sizes_bytes = 0;
487
+ uint32_t unused_value_sizes_bytes = 0;
488
+ uint32_t unused_names_bytes = 0;
489
+ if (!GetVarint32(&input_ref, &unused_name_sizes_bytes) ||
490
+ !GetVarint32(&input_ref, &unused_value_sizes_bytes) ||
491
+ !GetVarint32(&input_ref, &unused_names_bytes)) {
492
+ return Status::Corruption("Error decoding wide column skip info");
493
+ }
494
+ if (input_ref.size() < num_columns) {
495
+ return Status::Corruption("Error decoding wide column types");
496
+ }
497
+ has_blob_columns = ContainsBlobType(input_ref.data(), num_columns);
498
+
499
+ return Status::OK();
500
+ }
501
+
502
+ Status WideColumnSerialization::GetVersion(const Slice& input,
503
+ uint32_t& version) {
504
+ Slice input_ref = input;
505
+
506
+ version = 0;
507
+ if (!GetVarint32(&input_ref, &version)) {
508
+ return Status::Corruption("Error decoding wide column version");
509
+ }
510
+
511
+ return Status::OK();
512
+ }
513
+
132
514
  Status WideColumnSerialization::GetValueOfDefaultColumn(Slice& input,
133
515
  Slice& value) {
516
+ Slice input_ref = input;
517
+
518
+ uint32_t version = 0;
519
+ if (!GetVarint32(&input_ref, &version)) {
520
+ return Status::Corruption("Error decoding wide column version");
521
+ }
522
+
523
+ if (version > kVersion2) {
524
+ return Status::NotSupported("Unsupported wide column version");
525
+ }
526
+
527
+ uint32_t num_columns = 0;
528
+ if (!GetVarint32(&input_ref, &num_columns)) {
529
+ return Status::Corruption("Error decoding number of wide columns");
530
+ }
531
+
532
+ if (!num_columns) {
533
+ value.clear();
534
+ return Status::OK();
535
+ }
536
+
537
+ if (version >= kVersion2) {
538
+ // V2 fast path: use skip info to jump directly to values without
539
+ // scanning through variable-length sections.
540
+
541
+ // Read SKIP INFO (3 varints, immediately after header)
542
+ uint32_t name_sizes_bytes = 0;
543
+ uint32_t value_sizes_bytes = 0;
544
+ uint32_t names_bytes = 0;
545
+ if (!GetVarint32(&input_ref, &name_sizes_bytes)) {
546
+ return Status::Corruption("Error decoding wide column name sizes bytes");
547
+ }
548
+ if (!GetVarint32(&input_ref, &value_sizes_bytes)) {
549
+ return Status::Corruption("Error decoding wide column value sizes bytes");
550
+ }
551
+ if (!GetVarint32(&input_ref, &names_bytes)) {
552
+ return Status::Corruption("Error decoding wide column names bytes");
553
+ }
554
+
555
+ // Read COLUMN TYPES (N bytes)
556
+ if (input_ref.size() < num_columns) {
557
+ return Status::Corruption("Error decoding wide column types");
558
+ }
559
+ // Check if default column (index 0) is a blob reference
560
+ if (static_cast<uint8_t>(input_ref[0]) == kTypeBlobIndex) {
561
+ return Status::NotSupported(
562
+ "Wide column contains blob references. Use DeserializeV2.");
563
+ }
564
+ input_ref.remove_prefix(num_columns);
565
+
566
+ // Peek first name size from NAME SIZES section
567
+ if (input_ref.size() < name_sizes_bytes) {
568
+ return Status::Corruption("Error decoding wide column name sizes");
569
+ }
570
+ Slice name_sizes_section(input_ref.data(), name_sizes_bytes);
571
+ uint32_t first_name_size = 0;
572
+ if (!GetVarint32(&name_sizes_section, &first_name_size)) {
573
+ return Status::Corruption("Error decoding wide column name size");
574
+ }
575
+ input_ref.remove_prefix(name_sizes_bytes);
576
+
577
+ // Peek first value size from VALUE SIZES section
578
+ if (input_ref.size() < value_sizes_bytes) {
579
+ return Status::Corruption("Error decoding wide column value sizes");
580
+ }
581
+ Slice value_sizes_section(input_ref.data(), value_sizes_bytes);
582
+ uint32_t first_value_size = 0;
583
+ if (!GetVarint32(&value_sizes_section, &first_value_size)) {
584
+ return Status::Corruption("Error decoding wide column value size");
585
+ }
586
+ // Skip entire VALUE SIZES section using value_sizes_bytes
587
+ input_ref.remove_prefix(value_sizes_bytes);
588
+
589
+ // Check if the first column is the default column (empty name)
590
+ if (first_name_size != 0) {
591
+ value.clear();
592
+ return Status::OK();
593
+ }
594
+
595
+ // Skip NAMES section
596
+ if (input_ref.size() < names_bytes) {
597
+ return Status::Corruption("Error decoding wide column names");
598
+ }
599
+ input_ref.remove_prefix(names_bytes);
600
+
601
+ // Read the first value from VALUES section
602
+ if (input_ref.size() < first_value_size) {
603
+ return Status::Corruption("Error decoding wide column value payload");
604
+ }
605
+ value = Slice(input_ref.data(), first_value_size);
606
+ return Status::OK();
607
+ }
608
+
609
+ // V1 fallback: full deserialization
134
610
  WideColumns columns;
135
611
 
136
- const Status s = Deserialize(input, columns);
137
- if (!s.ok()) {
612
+ if (Status s = Deserialize(input, columns); !s.ok()) {
138
613
  return s;
139
614
  }
140
615
 
@@ -148,4 +623,145 @@ Status WideColumnSerialization::GetValueOfDefaultColumn(Slice& input,
148
623
  return Status::OK();
149
624
  }
150
625
 
626
+ Status WideColumnSerialization::ResolveEntityBlobColumns(
627
+ const Slice& entity_value, const Slice& user_key,
628
+ const BlobFetcher* blob_fetcher, PrefetchBufferCollection* prefetch_buffers,
629
+ std::string& resolved_entity, bool& resolved, uint64_t* total_bytes_read,
630
+ uint64_t* num_blobs_resolved) {
631
+ assert(blob_fetcher);
632
+
633
+ resolved = false;
634
+
635
+ std::vector<WideColumn> columns;
636
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns;
637
+
638
+ Slice input_copy = entity_value;
639
+ if (Status s = DeserializeV2(input_copy, columns, blob_columns); !s.ok()) {
640
+ return s;
641
+ }
642
+
643
+ if (blob_columns.empty()) {
644
+ return Status::OK();
645
+ }
646
+
647
+ resolved = true;
648
+
649
+ // Fetch each blob value
650
+ std::vector<std::string> resolved_blob_values;
651
+ resolved_blob_values.reserve(blob_columns.size());
652
+
653
+ for (const auto& blob_col : blob_columns) {
654
+ const BlobIndex& blob_idx = blob_col.second;
655
+
656
+ if (blob_idx.IsInlined()) {
657
+ resolved_blob_values.emplace_back(blob_idx.value().data(),
658
+ blob_idx.value().size());
659
+ continue;
660
+ }
661
+
662
+ FilePrefetchBuffer* prefetch_buffer =
663
+ prefetch_buffers ? prefetch_buffers->GetOrCreatePrefetchBuffer(
664
+ blob_idx.file_number())
665
+ : nullptr;
666
+
667
+ uint64_t bytes_read = 0;
668
+
669
+ PinnableSlice blob_value;
670
+ const Status fetch_s = blob_fetcher->FetchBlob(
671
+ user_key, blob_idx, prefetch_buffer, &blob_value, &bytes_read);
672
+ if (!fetch_s.ok()) {
673
+ return fetch_s;
674
+ }
675
+
676
+ resolved_blob_values.emplace_back(blob_value.data(), blob_value.size());
677
+
678
+ if (total_bytes_read) {
679
+ *total_bytes_read += bytes_read;
680
+ }
681
+ }
682
+
683
+ if (num_blobs_resolved) {
684
+ *num_blobs_resolved += blob_columns.size();
685
+ }
686
+
687
+ return SerializeResolvedEntity(columns, blob_columns, resolved_blob_values,
688
+ resolved_entity);
689
+ }
690
+
691
+ Status WideColumnSerialization::GetValueOfDefaultColumnResolvingBlobs(
692
+ const Slice& entity_value, const Slice& user_key,
693
+ const BlobFetcher* blob_fetcher, PinnableSlice& result, bool& resolved) {
694
+ assert(blob_fetcher);
695
+
696
+ resolved = false;
697
+
698
+ std::vector<WideColumn> columns;
699
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns;
700
+
701
+ Slice input_copy = entity_value;
702
+ if (Status s = DeserializeV2(input_copy, columns, blob_columns); !s.ok()) {
703
+ return s;
704
+ }
705
+
706
+ // The default column (empty name) is always at index 0 when present
707
+ // (columns are sorted by name).
708
+ if (columns.empty() || columns[0].name() != kDefaultWideColumnName) {
709
+ result.PinSelf(Slice());
710
+ return Status::OK();
711
+ }
712
+
713
+ // Check if the default column (index 0) is a blob reference
714
+ for (const auto& blob_col : blob_columns) {
715
+ if (blob_col.first == 0) {
716
+ const BlobIndex& blob_idx = blob_col.second;
717
+
718
+ resolved = true;
719
+
720
+ if (blob_idx.IsInlined()) {
721
+ result.PinSelf(blob_idx.value());
722
+ return Status::OK();
723
+ }
724
+
725
+ return blob_fetcher->FetchBlob(user_key, blob_idx,
726
+ nullptr /* prefetch_buffer */, &result,
727
+ nullptr /* bytes_read */);
728
+ }
729
+ }
730
+
731
+ // Default column is inline
732
+ result.PinSelf(columns[0].value());
733
+ return Status::OK();
734
+ }
735
+
736
+ Status WideColumnSerialization::SerializeResolvedEntity(
737
+ const std::vector<WideColumn>& columns,
738
+ const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
739
+ const std::vector<std::string>& resolved_blob_values, std::string& output) {
740
+ assert(blob_columns.size() == resolved_blob_values.size());
741
+
742
+ // blob_columns is sorted by column index and typically small, so use a
743
+ // linear scan with a cursor instead of an unordered_map.
744
+ size_t blob_cursor = 0;
745
+
746
+ // Build result columns with resolved blob values
747
+ WideColumns result_columns;
748
+ result_columns.reserve(columns.size());
749
+
750
+ for (size_t i = 0; i < columns.size(); ++i) {
751
+ if (blob_cursor < blob_columns.size() &&
752
+ blob_columns[blob_cursor].first == i) {
753
+ // This is a blob column - use the resolved value
754
+ result_columns.emplace_back(columns[i].name(),
755
+ Slice(resolved_blob_values[blob_cursor]));
756
+ ++blob_cursor;
757
+ } else {
758
+ // This is an inline column - use the original value
759
+ result_columns.emplace_back(columns[i].name(), columns[i].value());
760
+ }
761
+ }
762
+
763
+ // Serialize using V1 format (all values inline)
764
+ return Serialize(result_columns, output);
765
+ }
766
+
151
767
  } // namespace ROCKSDB_NAMESPACE