@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,13 +5,35 @@
5
5
 
6
6
  #include "db/wide/wide_column_serialization.h"
7
7
 
8
+ #include <chrono>
9
+ #include <limits>
10
+
11
+ #include "db/blob/blob_index.h"
8
12
  #include "db/wide/wide_columns_helper.h"
9
13
  #include "test_util/testharness.h"
10
14
  #include "util/coding.h"
15
+ #include "util/random.h"
11
16
 
12
17
  namespace ROCKSDB_NAMESPACE {
13
18
 
14
- TEST(WideColumnSerializationTest, Construct) {
19
+ class WideColumnSerializationTest : public testing::Test {
20
+ protected:
21
+ // Wrappers for private methods accessible via friend declaration.
22
+ static Status GetVersion(const Slice& input, uint32_t& version) {
23
+ return WideColumnSerialization::GetVersion(input, version);
24
+ }
25
+
26
+ static Status SerializeResolvedEntity(
27
+ const std::vector<WideColumn>& columns,
28
+ const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
29
+ const std::vector<std::string>& resolved_blob_values,
30
+ std::string& output) {
31
+ return WideColumnSerialization::SerializeResolvedEntity(
32
+ columns, blob_columns, resolved_blob_values, output);
33
+ }
34
+ };
35
+
36
+ TEST_F(WideColumnSerializationTest, Construct) {
15
37
  constexpr char foo[] = "foo";
16
38
  constexpr char bar[] = "bar";
17
39
 
@@ -87,7 +109,7 @@ TEST(WideColumnSerializationTest, Construct) {
87
109
  }
88
110
  }
89
111
 
90
- TEST(WideColumnSerializationTest, SerializeDeserialize) {
112
+ TEST_F(WideColumnSerializationTest, SerializeDeserialize) {
91
113
  WideColumns columns{{"foo", "bar"}, {"hello", "world"}};
92
114
  std::string output;
93
115
 
@@ -126,7 +148,7 @@ TEST(WideColumnSerializationTest, SerializeDeserialize) {
126
148
  }
127
149
  }
128
150
 
129
- TEST(WideColumnSerializationTest, SerializeDuplicateError) {
151
+ TEST_F(WideColumnSerializationTest, SerializeDuplicateError) {
130
152
  WideColumns columns{{"foo", "bar"}, {"foo", "baz"}};
131
153
  std::string output;
132
154
 
@@ -134,7 +156,7 @@ TEST(WideColumnSerializationTest, SerializeDuplicateError) {
134
156
  WideColumnSerialization::Serialize(columns, output).IsCorruption());
135
157
  }
136
158
 
137
- TEST(WideColumnSerializationTest, SerializeOutOfOrderError) {
159
+ TEST_F(WideColumnSerializationTest, SerializeOutOfOrderError) {
138
160
  WideColumns columns{{"hello", "world"}, {"foo", "bar"}};
139
161
  std::string output;
140
162
 
@@ -142,7 +164,7 @@ TEST(WideColumnSerializationTest, SerializeOutOfOrderError) {
142
164
  WideColumnSerialization::Serialize(columns, output).IsCorruption());
143
165
  }
144
166
 
145
- TEST(WideColumnSerializationTest, DeserializeVersionError) {
167
+ TEST_F(WideColumnSerializationTest, DeserializeVersionError) {
146
168
  // Can't decode version
147
169
 
148
170
  std::string buf;
@@ -155,7 +177,7 @@ TEST(WideColumnSerializationTest, DeserializeVersionError) {
155
177
  ASSERT_TRUE(std::strstr(s.getState(), "version"));
156
178
  }
157
179
 
158
- TEST(WideColumnSerializationTest, DeserializeUnsupportedVersion) {
180
+ TEST_F(WideColumnSerializationTest, DeserializeUnsupportedVersion) {
159
181
  // Unsupported version
160
182
  constexpr uint32_t future_version = 1000;
161
183
 
@@ -170,11 +192,11 @@ TEST(WideColumnSerializationTest, DeserializeUnsupportedVersion) {
170
192
  ASSERT_TRUE(std::strstr(s.getState(), "version"));
171
193
  }
172
194
 
173
- TEST(WideColumnSerializationTest, DeserializeNumberOfColumnsError) {
195
+ TEST_F(WideColumnSerializationTest, DeserializeNumberOfColumnsError) {
174
196
  // Can't decode number of columns
175
197
 
176
198
  std::string buf;
177
- PutVarint32(&buf, WideColumnSerialization::kCurrentVersion);
199
+ PutVarint32(&buf, WideColumnSerialization::kVersion1);
178
200
 
179
201
  Slice input(buf);
180
202
  WideColumns columns;
@@ -184,10 +206,10 @@ TEST(WideColumnSerializationTest, DeserializeNumberOfColumnsError) {
184
206
  ASSERT_TRUE(std::strstr(s.getState(), "number"));
185
207
  }
186
208
 
187
- TEST(WideColumnSerializationTest, DeserializeColumnsError) {
209
+ TEST_F(WideColumnSerializationTest, DeserializeV2Error) {
188
210
  std::string buf;
189
211
 
190
- PutVarint32(&buf, WideColumnSerialization::kCurrentVersion);
212
+ PutVarint32(&buf, WideColumnSerialization::kVersion1);
191
213
 
192
214
  constexpr uint32_t num_columns = 2;
193
215
  PutVarint32(&buf, num_columns);
@@ -277,10 +299,10 @@ TEST(WideColumnSerializationTest, DeserializeColumnsError) {
277
299
  }
278
300
  }
279
301
 
280
- TEST(WideColumnSerializationTest, DeserializeColumnsOutOfOrder) {
302
+ TEST_F(WideColumnSerializationTest, DeserializeV2OutOfOrder) {
281
303
  std::string buf;
282
304
 
283
- PutVarint32(&buf, WideColumnSerialization::kCurrentVersion);
305
+ PutVarint32(&buf, WideColumnSerialization::kVersion1);
284
306
 
285
307
  constexpr uint32_t num_columns = 2;
286
308
  PutVarint32(&buf, num_columns);
@@ -302,6 +324,521 @@ TEST(WideColumnSerializationTest, DeserializeColumnsOutOfOrder) {
302
324
  ASSERT_TRUE(std::strstr(s.getState(), "order"));
303
325
  }
304
326
 
327
+ TEST_F(WideColumnSerializationTest, DeserializeV2RejectsRecursiveType) {
328
+ // Manually construct a V2 entity where one column has type
329
+ // kTypeWideColumnEntity, which would create recursive nesting.
330
+ // Deserialization must reject this.
331
+ std::string buf;
332
+
333
+ PutVarint32(&buf, WideColumnSerialization::kVersion2);
334
+
335
+ constexpr uint32_t num_columns = 2;
336
+ PutVarint32(&buf, num_columns);
337
+
338
+ // Section 2: COLUMN TYPES -- first column inline, second recursive
339
+ buf.push_back(static_cast<char>(kTypeValue));
340
+ buf.push_back(static_cast<char>(kTypeWideColumnEntity));
341
+
342
+ // Section 3: SKIP INFO
343
+ PutVarint32(&buf, 2); // name_sizes_bytes (varint(1) + varint(1))
344
+ PutVarint32(&buf, 2); // value_sizes_bytes (varint(3) + varint(5))
345
+ PutVarint32(&buf, 2); // names_bytes ("a" + "b")
346
+
347
+ // Section 4: NAME SIZES
348
+ PutVarint32(&buf, 1); // "a"
349
+ PutVarint32(&buf, 1); // "b"
350
+
351
+ // Section 5: VALUE SIZES
352
+ PutVarint32(&buf, 3);
353
+ PutVarint32(&buf, 5);
354
+
355
+ // Section 6: NAMES
356
+ buf.append("ab");
357
+
358
+ // Section 7: VALUES (8 bytes of placeholder data)
359
+ buf.append(8, 'x');
360
+
361
+ // DeserializeV2 should reject with Corruption
362
+ {
363
+ Slice input(buf);
364
+ std::vector<WideColumn> columns;
365
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns;
366
+ const Status s =
367
+ WideColumnSerialization::DeserializeV2(input, columns, blob_columns);
368
+ ASSERT_TRUE(s.IsCorruption());
369
+ ASSERT_TRUE(std::strstr(s.getState(), "Unsupported wide column ValueType"));
370
+ }
371
+
372
+ // Deserialize (V1-only API) should also reject
373
+ {
374
+ Slice input(buf);
375
+ WideColumns columns;
376
+ const Status s = WideColumnSerialization::Deserialize(input, columns);
377
+ ASSERT_TRUE(s.IsCorruption());
378
+ }
379
+ }
380
+
381
+ // Helper: create a BlobIndex from EncodeBlob parameters.
382
+ static BlobIndex MakeBlobIndex(uint64_t file_number, uint64_t offset,
383
+ uint64_t size,
384
+ CompressionType compression = kNoCompression) {
385
+ std::string encoded;
386
+ BlobIndex::EncodeBlob(&encoded, file_number, offset, size, compression);
387
+ BlobIndex bi;
388
+ Slice s(encoded);
389
+ assert(bi.DecodeFrom(s).ok());
390
+ return bi;
391
+ }
392
+
393
+ // Helper: V2 serialize → DeserializeV2 round-trip, returning
394
+ // deserialized columns and blob column info.
395
+ static void V2SerializeAndDeserialize(
396
+ const std::vector<std::pair<std::string, std::string>>& columns,
397
+ const std::vector<std::pair<size_t, BlobIndex>>& blob_columns_in,
398
+ std::vector<WideColumn>* deserialized,
399
+ std::vector<std::pair<size_t, BlobIndex>>* blob_columns_out,
400
+ std::string* serialized_out) {
401
+ ASSERT_OK(WideColumnSerialization::SerializeV2(columns, blob_columns_in,
402
+ *serialized_out));
403
+
404
+ Slice input(*serialized_out);
405
+ ASSERT_OK(WideColumnSerialization::DeserializeV2(input, *deserialized,
406
+ *blob_columns_out));
407
+ ASSERT_EQ(deserialized->size(), columns.size());
408
+ for (size_t i = 0; i < columns.size(); ++i) {
409
+ ASSERT_EQ((*deserialized)[i].name(), columns[i].first);
410
+ }
411
+ }
412
+
413
+ // Helper: build WideColumns from string pairs.
414
+ static WideColumns ToWideColumns(
415
+ const std::vector<std::pair<std::string, std::string>>& columns) {
416
+ WideColumns wc;
417
+ wc.reserve(columns.size());
418
+ for (const auto& col : columns) {
419
+ wc.emplace_back(Slice(col.first), Slice(col.second));
420
+ }
421
+ return wc;
422
+ }
423
+
424
+ // Helper: deserialize and verify column names match expected.first
425
+ // and column values match expected_values[i].
426
+ static void VerifyDeserialize(
427
+ const std::string& serialized,
428
+ const std::vector<std::pair<std::string, std::string>>& expected,
429
+ const std::vector<std::string>& expected_values) {
430
+ Slice input(serialized);
431
+ WideColumns deserialized;
432
+ ASSERT_OK(WideColumnSerialization::Deserialize(input, deserialized));
433
+ ASSERT_EQ(deserialized.size(), expected.size());
434
+ for (size_t i = 0; i < expected.size(); ++i) {
435
+ ASSERT_EQ(deserialized[i].name(), expected[i].first);
436
+ ASSERT_EQ(deserialized[i].value(), expected_values[i]);
437
+ }
438
+ }
439
+
440
+ // Convenience overload: values come from expected[i].second.
441
+ static void VerifyDeserialize(
442
+ const std::string& serialized,
443
+ const std::vector<std::pair<std::string, std::string>>& expected) {
444
+ std::vector<std::string> values;
445
+ values.reserve(expected.size());
446
+ for (const auto& col : expected) {
447
+ values.push_back(col.second);
448
+ }
449
+ VerifyDeserialize(serialized, expected, values);
450
+ }
451
+
452
+ // Helper: create a random non-inlined BlobIndex using the given RNG.
453
+ // Only creates Blob or BlobTTL types (not InlinedTTL), because InlinedTTL
454
+ // stores a Slice pointing into the encoded string, which would become a
455
+ // dangling reference after this function returns.
456
+ static BlobIndex MakeRandomBlobIndex(Random& rng) {
457
+ std::string bi_str;
458
+ if (rng.Uniform(2) == 0) {
459
+ BlobIndex::EncodeBlob(&bi_str, rng.Uniform(1000), rng.Uniform(10000),
460
+ rng.Uniform(5000), kNoCompression);
461
+ } else {
462
+ BlobIndex::EncodeBlobTTL(&bi_str, rng.Uniform(1000000), rng.Uniform(1000),
463
+ rng.Uniform(10000), rng.Uniform(5000),
464
+ kSnappyCompression);
465
+ }
466
+ BlobIndex bi;
467
+ Slice s(bi_str);
468
+ assert(bi.DecodeFrom(s).ok());
469
+ return bi;
470
+ }
471
+
472
+ // Helper: V2 serialize with no blobs then GetValueOfDefaultColumn.
473
+ static void VerifyGetDefaultColumn(
474
+ const std::vector<std::pair<std::string, std::string>>& columns,
475
+ const Slice& expected_value) {
476
+ std::vector<std::pair<size_t, BlobIndex>> no_blobs;
477
+ std::string serialized;
478
+ ASSERT_OK(
479
+ WideColumnSerialization::SerializeV2(columns, no_blobs, serialized));
480
+
481
+ Slice input(serialized);
482
+ Slice value;
483
+ ASSERT_OK(WideColumnSerialization::GetValueOfDefaultColumn(input, value));
484
+ ASSERT_EQ(value, expected_value);
485
+ }
486
+
487
+ TEST_F(WideColumnSerializationTest, SerializeResolvedEntity) {
488
+ // Test resolve with mixed, all-blob, and no-blob configurations
489
+ struct TestCase {
490
+ std::vector<std::pair<std::string, std::string>> columns;
491
+ std::vector<std::pair<size_t, BlobIndex>> blob_cols;
492
+ std::vector<std::string> resolved_values;
493
+ std::vector<std::string> expected_values;
494
+ };
495
+
496
+ std::vector<TestCase> cases = {
497
+ // Mixed inline and blob
498
+ {.columns = {{"a", "inline_a"}, {"b", "ph"}, {"c", "inline_c"}},
499
+ .blob_cols = {{1, MakeBlobIndex(50, 500, 100)}},
500
+ .resolved_values = {"resolved_b"},
501
+ .expected_values = {"inline_a", "resolved_b", "inline_c"}},
502
+ // All blob columns
503
+ {.columns = {{"x", "ph1"}, {"y", "ph2"}, {"z", "ph3"}},
504
+ .blob_cols = {{0, MakeBlobIndex(10, 100, 50)},
505
+ {1, MakeBlobIndex(20, 200, 60)},
506
+ {2, MakeBlobIndex(30, 300, 70)}},
507
+ .resolved_values = {"val_x", "val_y", "val_z"},
508
+ .expected_values = {"val_x", "val_y", "val_z"}},
509
+ // No blob columns
510
+ {.columns = {{"alpha", "val_alpha"}, {"beta", "val_beta"}},
511
+ .blob_cols = {},
512
+ .resolved_values = {},
513
+ .expected_values = {"val_alpha", "val_beta"}},
514
+ };
515
+
516
+ for (const auto& tc : cases) {
517
+ std::string serialized;
518
+ std::vector<WideColumn> deserialized;
519
+ std::vector<std::pair<size_t, BlobIndex>> blob_out;
520
+ V2SerializeAndDeserialize(tc.columns, tc.blob_cols, &deserialized,
521
+ &blob_out, &serialized);
522
+
523
+ std::string resolved_output;
524
+ ASSERT_OK(WideColumnSerializationTest::SerializeResolvedEntity(
525
+ deserialized, blob_out, tc.resolved_values, resolved_output));
526
+
527
+ uint32_t v = 0;
528
+ ASSERT_OK(GetVersion(Slice(resolved_output), v));
529
+ ASSERT_EQ(v, WideColumnSerialization::kVersion1);
530
+
531
+ VerifyDeserialize(resolved_output, tc.columns, tc.expected_values);
532
+ }
533
+ }
534
+
535
+ TEST_F(WideColumnSerializationTest, V2GetValueOfDefaultColumn) {
536
+ // V2 with default column present
537
+ VerifyGetDefaultColumn({{"", "default_value"}, {"col1", "value1"}},
538
+ "default_value");
539
+ // V2 without default column
540
+ VerifyGetDefaultColumn({{"col1", "value1"}, {"col2", "value2"}}, Slice());
541
+ // V2 with zero columns
542
+ VerifyGetDefaultColumn({}, Slice());
543
+
544
+ // V1 fallback
545
+ {
546
+ WideColumns columns{{"", "v1_default"}, {"col1", "v1"}};
547
+ std::string serialized;
548
+ ASSERT_OK(WideColumnSerialization::Serialize(columns, serialized));
549
+
550
+ Slice input(serialized);
551
+ Slice value;
552
+ ASSERT_OK(WideColumnSerialization::GetValueOfDefaultColumn(input, value));
553
+ ASSERT_EQ(value, "v1_default");
554
+ }
555
+ }
556
+
557
+ TEST_F(WideColumnSerializationTest, V2BlobColumnRejectsDeserialize) {
558
+ std::vector<std::pair<std::string, std::string>> columns = {
559
+ {"a", "inline"}, {"b", "placeholder"}};
560
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns = {
561
+ {1, MakeBlobIndex(1, 2, 3)}};
562
+
563
+ std::string serialized;
564
+ ASSERT_OK(
565
+ WideColumnSerialization::SerializeV2(columns, blob_columns, serialized));
566
+
567
+ Slice input(serialized);
568
+ WideColumns deserialized;
569
+ ASSERT_TRUE(WideColumnSerialization::Deserialize(input, deserialized)
570
+ .IsNotSupported());
571
+ }
572
+
573
+ TEST_F(WideColumnSerializationTest, V2GetValueOfDefaultColumnBlobRef) {
574
+ // When default column (index 0) is a blob reference,
575
+ // GetValueOfDefaultColumn should return NotSupported.
576
+ std::vector<std::pair<std::string, std::string>> columns = {
577
+ {"", "placeholder"}, {"col1", "value1"}};
578
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns = {
579
+ {0, MakeBlobIndex(10, 100, 500)}};
580
+
581
+ std::string serialized;
582
+ ASSERT_OK(
583
+ WideColumnSerialization::SerializeV2(columns, blob_columns, serialized));
584
+
585
+ Slice input(serialized);
586
+ Slice value;
587
+ ASSERT_TRUE(WideColumnSerialization::GetValueOfDefaultColumn(input, value)
588
+ .IsNotSupported());
589
+ }
590
+
591
+ TEST_F(WideColumnSerializationTest, SerializeV2Errors) {
592
+ // Blob column index out of range
593
+ {
594
+ std::vector<std::pair<std::string, std::string>> columns = {{"a", "val"}};
595
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns = {
596
+ {5, MakeBlobIndex(1, 2, 3)}}; // index 5 but only 1 column
597
+
598
+ std::string output;
599
+ ASSERT_TRUE(
600
+ WideColumnSerialization::SerializeV2(columns, blob_columns, output)
601
+ .IsInvalidArgument());
602
+ }
603
+
604
+ // Columns out of order (V2)
605
+ {
606
+ std::vector<std::pair<std::string, std::string>> columns = {{"b", "val_b"},
607
+ {"a", "val_a"}};
608
+ std::vector<std::pair<size_t, BlobIndex>> no_blobs;
609
+
610
+ std::string output;
611
+ ASSERT_TRUE(WideColumnSerialization::SerializeV2(columns, no_blobs, output)
612
+ .IsCorruption());
613
+ }
614
+
615
+ // Duplicate column names (V2)
616
+ {
617
+ std::vector<std::pair<std::string, std::string>> columns = {{"a", "val1"},
618
+ {"a", "val2"}};
619
+ std::vector<std::pair<size_t, BlobIndex>> no_blobs;
620
+
621
+ std::string output;
622
+ ASSERT_TRUE(WideColumnSerialization::SerializeV2(columns, no_blobs, output)
623
+ .IsCorruption());
624
+ }
625
+ }
626
+
627
+ TEST_F(WideColumnSerializationTest, BlobIndexEncodeToRoundTrip) {
628
+ // Test EncodeTo produces identical output to static Encode methods
629
+ // for all three blob index types.
630
+ auto verify_encode_to = [](const std::string& encoded_static) {
631
+ BlobIndex bi;
632
+ Slice s(encoded_static);
633
+ ASSERT_OK(bi.DecodeFrom(s));
634
+ std::string encoded_instance;
635
+ bi.EncodeTo(&encoded_instance);
636
+ ASSERT_EQ(encoded_static, encoded_instance);
637
+ };
638
+
639
+ std::string blob_str;
640
+ std::string blob_ttl_str;
641
+ std::string inlined_str;
642
+ BlobIndex::EncodeBlob(&blob_str, 42, 1024, 2048, kSnappyCompression);
643
+ BlobIndex::EncodeBlobTTL(&blob_ttl_str, 9999, 10, 200, 3000,
644
+ kZlibCompression);
645
+ BlobIndex::EncodeInlinedTTL(&inlined_str, 12345, "inline_data");
646
+
647
+ verify_encode_to(blob_str);
648
+ verify_encode_to(blob_ttl_str);
649
+ verify_encode_to(inlined_str);
650
+ }
651
+
652
+ TEST_F(WideColumnSerializationTest, V2LayoutStructureVerification) {
653
+ // Verify the V2 binary layout structure by manually parsing sections
654
+ std::vector<std::pair<std::string, std::string>> columns = {
655
+ {"aa", "val_aa"}, {"bbb", "val_bbb"}};
656
+ std::vector<std::pair<size_t, BlobIndex>> empty_blob_columns;
657
+
658
+ std::string serialized;
659
+ ASSERT_OK(WideColumnSerialization::SerializeV2(columns, empty_blob_columns,
660
+ serialized));
661
+
662
+ Slice data(serialized);
663
+
664
+ // Section 1: HEADER
665
+ uint32_t version = 0;
666
+ ASSERT_TRUE(GetVarint32(&data, &version));
667
+ ASSERT_EQ(version, WideColumnSerialization::kVersion2);
668
+
669
+ uint32_t num_columns = 0;
670
+ ASSERT_TRUE(GetVarint32(&data, &num_columns));
671
+ ASSERT_EQ(num_columns, 2u);
672
+
673
+ // Section 2: SKIP INFO (3 varints)
674
+ uint32_t name_sizes_bytes = 0;
675
+ uint32_t value_sizes_bytes = 0;
676
+ uint32_t names_bytes = 0;
677
+ ASSERT_TRUE(GetVarint32(&data, &name_sizes_bytes));
678
+ ASSERT_TRUE(GetVarint32(&data, &value_sizes_bytes));
679
+ ASSERT_TRUE(GetVarint32(&data, &names_bytes));
680
+ // name sizes: varint(2) + varint(3) = 1 + 1 = 2 bytes
681
+ ASSERT_EQ(name_sizes_bytes, 2u);
682
+ // value sizes: varint(6) + varint(7) = 1 + 1 = 2 bytes
683
+ ASSERT_EQ(value_sizes_bytes, 2u);
684
+ // names: "aa" + "bbb" = 2 + 3 = 5 bytes
685
+ ASSERT_EQ(names_bytes, 5u);
686
+
687
+ // Section 3: COLUMN TYPES (2 bytes, both inline)
688
+ ASSERT_GE(data.size(), 2u);
689
+ ASSERT_EQ(static_cast<uint8_t>(data[0]), static_cast<uint8_t>(kTypeValue));
690
+ ASSERT_EQ(static_cast<uint8_t>(data[1]), static_cast<uint8_t>(kTypeValue));
691
+ data.remove_prefix(2);
692
+
693
+ // Section 4: NAME SIZES
694
+ uint32_t ns0 = 0;
695
+ uint32_t ns1 = 0;
696
+ ASSERT_TRUE(GetVarint32(&data, &ns0));
697
+ ASSERT_TRUE(GetVarint32(&data, &ns1));
698
+ ASSERT_EQ(ns0, 2u);
699
+ ASSERT_EQ(ns1, 3u);
700
+
701
+ // Section 5: VALUE SIZES
702
+ uint32_t vs0 = 0;
703
+ uint32_t vs1 = 0;
704
+ ASSERT_TRUE(GetVarint32(&data, &vs0));
705
+ ASSERT_TRUE(GetVarint32(&data, &vs1));
706
+ ASSERT_EQ(vs0, 6u); // "val_aa" = 6
707
+ ASSERT_EQ(vs1, 7u); // "val_bbb" = 7
708
+
709
+ // Section 6: COLUMN NAMES
710
+ ASSERT_GE(data.size(), 5u);
711
+ ASSERT_EQ(Slice(data.data(), 2), "aa");
712
+ ASSERT_EQ(Slice(data.data() + 2, 3), "bbb");
713
+ data.remove_prefix(5);
714
+
715
+ // Section 7: COLUMN VALUES
716
+ ASSERT_GE(data.size(), 13u);
717
+ ASSERT_EQ(Slice(data.data(), 6), "val_aa");
718
+ ASSERT_EQ(Slice(data.data() + 6, 7), "val_bbb");
719
+ }
720
+
721
+ // Randomized correctness test: serialize and deserialize with random column
722
+ // counts, name sizes, value sizes, and randomly chosen blob columns.
723
+ // Validates the full round-trip for both V1 (Serialize) and V2
724
+ // (SerializeV2) formats.
725
+ TEST_F(WideColumnSerializationTest, RandomizedSerializeDeserializeRoundTrip) {
726
+ uint32_t seed = static_cast<uint32_t>(
727
+ std::chrono::system_clock::now().time_since_epoch().count());
728
+ Random rng(seed);
729
+ SCOPED_TRACE("seed=" + std::to_string(seed));
730
+
731
+ constexpr int kNumIterations = 100;
732
+
733
+ for (int iter = 0; iter < kNumIterations; ++iter) {
734
+ int num_cols = rng.Uniform(17); // 0..16
735
+ int name_sz = 1 + rng.Uniform(64); // 1..64
736
+ int val_sz = rng.Uniform(1025); // 0..1024
737
+
738
+ // Generate sorted column names and random values
739
+ std::vector<std::pair<std::string, std::string>> columns;
740
+ columns.reserve(num_cols);
741
+ for (int c = 0; c < num_cols; ++c) {
742
+ // Build a sorted, unique name of exactly name_sz bytes.
743
+ // Use hex-encoded index as prefix to guarantee sort order,
744
+ // then pad with random characters.
745
+ char idx_str[16];
746
+ snprintf(idx_str, sizeof(idx_str), "%04x", c);
747
+ std::string name(idx_str);
748
+ if (static_cast<int>(name.size()) < name_sz) {
749
+ name.append(name_sz - name.size(),
750
+ static_cast<char>('a' + rng.Uniform(26)));
751
+ }
752
+ // Ensure exactly name_sz bytes. For name_sz < 4, use just the
753
+ // low-order hex digits to maintain sort order.
754
+ if (static_cast<int>(name.size()) > name_sz) {
755
+ name = name.substr(name.size() - name_sz);
756
+ }
757
+
758
+ // Random value content
759
+ std::string value(val_sz, '\0');
760
+ for (int j = 0; j < val_sz; ++j) {
761
+ value[j] = static_cast<char>(rng.Uniform(256));
762
+ }
763
+ columns.emplace_back(std::move(name), std::move(value));
764
+ }
765
+
766
+ // Randomly select some columns as blob columns
767
+ std::vector<std::pair<size_t, BlobIndex>> blob_columns;
768
+ for (int c = 0; c < num_cols; ++c) {
769
+ if (rng.Uniform(3) == 0) { // ~33% chance of being a blob column
770
+ blob_columns.emplace_back(c, MakeRandomBlobIndex(rng));
771
+ }
772
+ }
773
+
774
+ // V2 serialize → DeserializeV2 round-trip
775
+ std::string serialized;
776
+ std::vector<WideColumn> deserialized;
777
+ std::vector<std::pair<size_t, BlobIndex>> blob_out;
778
+ V2SerializeAndDeserialize(columns, blob_columns, &deserialized, &blob_out,
779
+ &serialized);
780
+
781
+ // Verify version and HasBlobColumns
782
+ uint32_t v = 0;
783
+ ASSERT_OK(GetVersion(Slice(serialized), v));
784
+ ASSERT_EQ(v, WideColumnSerialization::kVersion2);
785
+
786
+ bool hb = false;
787
+ ASSERT_OK(WideColumnSerialization::HasBlobColumns(Slice(serialized), hb));
788
+ ASSERT_EQ(hb, !blob_columns.empty());
789
+
790
+ // Verify blob column round-trip
791
+ ASSERT_EQ(blob_out.size(), blob_columns.size());
792
+ for (size_t b = 0; b < blob_columns.size(); ++b) {
793
+ ASSERT_EQ(blob_out[b].first, blob_columns[b].first);
794
+ const BlobIndex& orig = blob_columns[b].second;
795
+ const BlobIndex& decoded = blob_out[b].second;
796
+ ASSERT_EQ(decoded.IsInlined(), orig.IsInlined());
797
+ ASSERT_EQ(decoded.HasTTL(), orig.HasTTL());
798
+ if (!decoded.IsInlined()) {
799
+ ASSERT_EQ(decoded.file_number(), orig.file_number());
800
+ ASSERT_EQ(decoded.offset(), orig.offset());
801
+ ASSERT_EQ(decoded.size(), orig.size());
802
+ }
803
+ }
804
+
805
+ // Verify inline column values
806
+ size_t blob_idx = 0;
807
+ for (int c = 0; c < num_cols; ++c) {
808
+ if (blob_idx < blob_columns.size() &&
809
+ blob_columns[blob_idx].first == static_cast<size_t>(c)) {
810
+ ++blob_idx;
811
+ } else {
812
+ ASSERT_EQ(deserialized[c].value(), columns[c].second);
813
+ }
814
+ }
815
+
816
+ // If no blob columns, also verify Deserialize() and both overloads
817
+ if (blob_columns.empty()) {
818
+ VerifyDeserialize(serialized, columns);
819
+
820
+ // WideColumns overload should produce identical output
821
+ std::string serialized2;
822
+ WideColumns wc = ToWideColumns(columns);
823
+ ASSERT_OK(
824
+ WideColumnSerialization::SerializeV2(wc, blob_columns, serialized2));
825
+ ASSERT_EQ(serialized, serialized2);
826
+ }
827
+
828
+ // V1 Serialize round-trip
829
+ {
830
+ WideColumns wc = ToWideColumns(columns);
831
+ std::string serialized_v1;
832
+ ASSERT_OK(WideColumnSerialization::Serialize(wc, serialized_v1));
833
+
834
+ ASSERT_OK(GetVersion(Slice(serialized_v1), v));
835
+ ASSERT_EQ(v, WideColumnSerialization::kVersion1);
836
+
837
+ VerifyDeserialize(serialized_v1, columns);
838
+ }
839
+ }
840
+ }
841
+
305
842
  } // namespace ROCKSDB_NAMESPACE
306
843
 
307
844
  int main(int argc, char** argv) {
@@ -419,7 +419,7 @@ TEST_F(WriteCallbackTest, WriteCallBackTest) {
419
419
  WriteOptions write_options;
420
420
  ReadOptions read_options;
421
421
  string value;
422
- DB* db;
422
+ std::unique_ptr<DB> db;
423
423
  DBImpl* db_impl;
424
424
 
425
425
  ASSERT_OK(DestroyDB(dbname, options));
@@ -428,7 +428,7 @@ TEST_F(WriteCallbackTest, WriteCallBackTest) {
428
428
  Status s = DB::Open(options, dbname, &db);
429
429
  ASSERT_OK(s);
430
430
 
431
- db_impl = dynamic_cast<DBImpl*>(db);
431
+ db_impl = dynamic_cast<DBImpl*>(db.get());
432
432
  ASSERT_TRUE(db_impl);
433
433
 
434
434
  WriteBatch wb;
@@ -481,7 +481,7 @@ TEST_F(WriteCallbackTest, WriteCallBackTest) {
481
481
  ASSERT_TRUE(user_write_cb.write_enqueued_.load());
482
482
  ASSERT_TRUE(user_write_cb.wal_write_done_.load());
483
483
 
484
- delete db;
484
+ db.reset();
485
485
  ASSERT_OK(DestroyDB(dbname, options));
486
486
  }
487
487
 
@@ -1047,7 +1047,7 @@ class CfConsistencyStressTest : public StressTest {
1047
1047
  assert(thread);
1048
1048
  Status status;
1049
1049
 
1050
- DB* db_ptr = secondary_db_ ? secondary_db_ : db_;
1050
+ DB* db_ptr = secondary_db_ ? secondary_db_.get() : db_;
1051
1051
  const auto& cfhs = secondary_db_ ? secondary_cfhs_ : column_families_;
1052
1052
 
1053
1053
  // Take a snapshot to preserve the state of primary db.
@@ -877,5 +877,24 @@ Status DestroyUnverifiedSubdir(const std::string& dirname) {
877
877
  return s;
878
878
  }
879
879
 
880
+ Status DbStressDestroyDb(const std::string& db_path) {
881
+ Status s;
882
+ Options options;
883
+ // NOTE: using db_stress_listener_env in order to see obsolete MANIFEST files
884
+ options.env = db_stress_listener_env;
885
+ // Remove DB files in a principled way to avoid issues
886
+ if (FLAGS_use_blob_db) {
887
+ s = blob_db::DestroyBlobDB(db_path, options, blob_db::BlobDBOptions());
888
+ } else {
889
+ s = DestroyDB(db_path, options);
890
+ }
891
+ if (!s.ok()) {
892
+ return s;
893
+ }
894
+ // Remove everything else recursively, only reporting success if able to
895
+ // delete everything
896
+ return DestroyDir(db_stress_listener_env, db_path);
897
+ }
898
+
880
899
  } // namespace ROCKSDB_NAMESPACE
881
900
  #endif // GFLAGS