@nxtedition/rocksdb 15.4.1 → 16.0.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 (401) hide show
  1. package/binding.cc +70 -23
  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/index.js +70 -10
  395. package/iterator.js +25 -3
  396. package/max_rev_operator.h +9 -5
  397. package/package.json +1 -1
  398. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  399. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -0,0 +1,562 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #include "utilities/trie_index/bitvector.h"
7
+
8
+ #include <algorithm>
9
+ #include <cassert>
10
+ #include <cstring>
11
+
12
+ #include "port/lang.h"
13
+ #include "util/coding.h"
14
+
15
+ namespace ROCKSDB_NAMESPACE {
16
+ namespace trie_index {
17
+
18
+ // ============================================================================
19
+ // Bitvector serialization format:
20
+ //
21
+ // [num_bits : uint64_t (fixed 8 bytes)]
22
+ // [num_ones : uint64_t (fixed 8 bytes)]
23
+ // [words : num_words * 8 bytes, where num_words = ceil(num_bits/64)]
24
+ // [rank_lut : num_rank_samples * 4 bytes (uint32_t), padded to 8]
25
+ // [select1_hints : num_select1_hints * 4 bytes (uint32_t), padded to 8]
26
+ // [select0_hints : num_select0_hints * 4 bytes (uint32_t), padded to 8]
27
+ //
28
+ // num_rank_samples = num_bits / kBitsPerRankSample + 1
29
+ // (The +1 is for the sentinel entry at the end that stores total popcount.)
30
+ //
31
+ // num_select1_hints = ceil(num_ones / kOnesPerSelectHint) if num_ones > 0,
32
+ // else 0. Analogously for num_select0_hints with (num_bits - num_ones).
33
+ //
34
+ // Using uint32_t for rank LUT entries halves the LUT memory overhead compared
35
+ // to uint64_t. See bitvector.h for why this is safe for trie index bitvectors.
36
+ // ============================================================================
37
+
38
+ size_t Bitvector::SerializedSize() const {
39
+ // Header: 2 uint64_t (num_bits, num_ones).
40
+ // Words: num_words * 8 bytes.
41
+ // Rank LUT: num_rank_samples * 4 bytes, padded to 8.
42
+ // FindNthOneBit hints: num_select1_hints * 4 bytes, padded to 8.
43
+ // FindNthZeroBit hints: num_select0_hints * 4 bytes, padded to 8.
44
+ size_t rank_bytes = num_rank_samples_ * sizeof(uint32_t);
45
+ size_t rank_padded = (rank_bytes + 7) & ~size_t(7);
46
+ size_t s1_bytes = num_select1_hints_ * sizeof(uint32_t);
47
+ size_t s1_padded = (s1_bytes + 7) & ~size_t(7);
48
+ size_t s0_bytes = num_select0_hints_ * sizeof(uint32_t);
49
+ size_t s0_padded = (s0_bytes + 7) & ~size_t(7);
50
+ return 2 * sizeof(uint64_t) + num_words_ * sizeof(uint64_t) + rank_padded +
51
+ s1_padded + s0_padded;
52
+ }
53
+
54
+ void Bitvector::EncodeTo(std::string* output) const {
55
+ size_t old_size = output->size();
56
+ size_t needed = SerializedSize();
57
+ output->resize(old_size + needed);
58
+ char* dst = &(*output)[old_size];
59
+
60
+ // Write header: num_bits, num_ones
61
+ memcpy(dst, &num_bits_, sizeof(uint64_t));
62
+ dst += sizeof(uint64_t);
63
+ memcpy(dst, &num_ones_, sizeof(uint64_t));
64
+ dst += sizeof(uint64_t);
65
+
66
+ // Write words
67
+ if (num_words_ > 0) {
68
+ memcpy(dst, words_, num_words_ * sizeof(uint64_t));
69
+ dst += num_words_ * sizeof(uint64_t);
70
+ }
71
+
72
+ // Helper lambda to write a uint32_t array with 8-byte aligned padding.
73
+ auto write_u32_array = [&](const uint32_t* arr, uint64_t count) {
74
+ if (count > 0) {
75
+ size_t bytes = count * sizeof(uint32_t);
76
+ memcpy(dst, arr, bytes);
77
+ size_t padded = (bytes + 7) & ~size_t(7);
78
+ if (padded > bytes) {
79
+ memset(dst + bytes, 0, padded - bytes);
80
+ }
81
+ dst += padded;
82
+ }
83
+ };
84
+
85
+ // Write rank LUT, select1 hints, select0 hints.
86
+ write_u32_array(rank_lut_, num_rank_samples_);
87
+ write_u32_array(select1_hints_, num_select1_hints_);
88
+ write_u32_array(select0_hints_, num_select0_hints_);
89
+ }
90
+
91
+ Status Bitvector::InitFromData(const char* data, size_t data_size,
92
+ size_t* bytes_consumed) {
93
+ const char* start = data;
94
+
95
+ // Read header
96
+ if (data_size < 2 * sizeof(uint64_t)) {
97
+ return Status::Corruption("Bitvector: insufficient data for header");
98
+ }
99
+ memcpy(&num_bits_, data, sizeof(uint64_t));
100
+ data += sizeof(uint64_t);
101
+ memcpy(&num_ones_, data, sizeof(uint64_t));
102
+ data += sizeof(uint64_t);
103
+ data_size -= 2 * sizeof(uint64_t);
104
+
105
+ // Validate header fields from untrusted data.
106
+ if (num_ones_ > num_bits_) {
107
+ return Status::Corruption("Bitvector: num_ones exceeds num_bits");
108
+ }
109
+ // The rank LUT uses uint32_t entries, so num_bits must fit in uint32_t.
110
+ // This also prevents integer overflow in derived size computations below.
111
+ if (num_bits_ > UINT32_MAX) {
112
+ return Status::Corruption(
113
+ "Bitvector: num_bits exceeds uint32_t range for rank LUT");
114
+ }
115
+
116
+ // Compute derived sizes
117
+ num_words_ = (num_bits_ + 63) / 64;
118
+ num_rank_samples_ = num_bits_ / kBitsPerRankSample + 1;
119
+ // Select hints: ceil(count / kOnesPerSelectHint) entries for ones/zeros.
120
+ // If there are 0 ones (or 0 zeros), there are 0 hints.
121
+ num_select1_hints_ =
122
+ (num_ones_ > 0) ? (num_ones_ - 1) / kOnesPerSelectHint + 1 : 0;
123
+ uint64_t num_zeros = num_bits_ - num_ones_;
124
+ num_select0_hints_ =
125
+ (num_zeros > 0) ? (num_zeros - 1) / kOnesPerSelectHint + 1 : 0;
126
+
127
+ // Read words
128
+ size_t words_bytes = num_words_ * sizeof(uint64_t);
129
+ if (data_size < words_bytes) {
130
+ return Status::Corruption("Bitvector: insufficient data for words");
131
+ }
132
+ // The data pointer must be 8-byte aligned for safe uint64_t access.
133
+ // This is guaranteed by the serialization format (header is 16 bytes,
134
+ // and the overall buffer comes from aligned block cache allocations).
135
+ if (reinterpret_cast<uintptr_t>(data) % alignof(uint64_t) != 0) {
136
+ return Status::Corruption("Bitvector: words data not 8-byte aligned");
137
+ }
138
+ words_ = reinterpret_cast<const uint64_t*>(data);
139
+ data += words_bytes;
140
+ data_size -= words_bytes;
141
+
142
+ // Helper lambda: read a padded uint32_t array from the stream.
143
+ auto read_u32_array = [&](const uint32_t** out, uint64_t count,
144
+ const char* name) -> Status {
145
+ if (count == 0) {
146
+ *out = nullptr;
147
+ return Status::OK();
148
+ }
149
+ size_t bytes = count * sizeof(uint32_t);
150
+ size_t padded = (bytes + 7) & ~size_t(7);
151
+ if (data_size < padded) {
152
+ return Status::Corruption(
153
+ std::string("Bitvector: insufficient data for ") + name);
154
+ }
155
+ if (reinterpret_cast<uintptr_t>(data) % alignof(uint32_t) != 0) {
156
+ return Status::Corruption(std::string("Bitvector: ") + name +
157
+ " not 4-byte aligned");
158
+ }
159
+ *out = reinterpret_cast<const uint32_t*>(data);
160
+ data += padded;
161
+ data_size -= padded;
162
+ return Status::OK();
163
+ };
164
+
165
+ Status s;
166
+ s = read_u32_array(&rank_lut_, num_rank_samples_, "rank LUT");
167
+ if (!s.ok()) {
168
+ return s;
169
+ }
170
+ s = read_u32_array(&select1_hints_, num_select1_hints_, "select1 hints");
171
+ if (!s.ok()) {
172
+ return s;
173
+ }
174
+ s = read_u32_array(&select0_hints_, num_select0_hints_, "select0 hints");
175
+ if (!s.ok()) {
176
+ return s;
177
+ }
178
+
179
+ // Validate select hint values. Each hint is a rank LUT index used to
180
+ // narrow the FindNthOneBit/FindNthZeroBit search range. An out-of-bounds
181
+ // hint would cause rank_lut_[hint] to read past the LUT array.
182
+ for (uint64_t i = 0; i < num_select1_hints_; i++) {
183
+ if (select1_hints_[i] >= num_rank_samples_) {
184
+ return Status::Corruption(
185
+ "Bitvector: select1 hint value exceeds rank LUT size");
186
+ }
187
+ }
188
+ for (uint64_t i = 0; i < num_select0_hints_; i++) {
189
+ if (select0_hints_[i] >= num_rank_samples_) {
190
+ return Status::Corruption(
191
+ "Bitvector: select0 hint value exceeds rank LUT size");
192
+ }
193
+ }
194
+
195
+ *bytes_consumed = static_cast<size_t>(data - start);
196
+
197
+ return Status::OK();
198
+ }
199
+
200
+ void Bitvector::BuildFrom(const BitvectorBuilder& builder) {
201
+ num_bits_ = builder.NumBits();
202
+ num_words_ = (num_bits_ + 63) / 64;
203
+ num_rank_samples_ = num_bits_ / kBitsPerRankSample + 1;
204
+
205
+ // We need to build rank LUT first to know num_ones_, then compute hint
206
+ // counts. Two-pass: first allocate for words + rank LUT, build rank LUT
207
+ // to get num_ones_, then resize to include select hints.
208
+ size_t words_bytes = num_words_ * sizeof(uint64_t);
209
+ size_t rank_bytes = num_rank_samples_ * sizeof(uint32_t);
210
+
211
+ // Phase 1: allocate words + rank LUT.
212
+ owned_data_.resize(words_bytes + rank_bytes, '\0');
213
+ if (num_words_ > 0) {
214
+ memcpy(&owned_data_[0], builder.Words().data(), words_bytes);
215
+ }
216
+ words_ = reinterpret_cast<const uint64_t*>(owned_data_.data());
217
+ rank_lut_ =
218
+ reinterpret_cast<const uint32_t*>(owned_data_.data() + words_bytes);
219
+ assert(reinterpret_cast<uintptr_t>(rank_lut_) % alignof(uint32_t) == 0);
220
+
221
+ BuildRankLUT();
222
+
223
+ // Phase 2: compute hint counts and reallocate to include them.
224
+ num_select1_hints_ =
225
+ (num_ones_ > 0) ? (num_ones_ - 1) / kOnesPerSelectHint + 1 : 0;
226
+ uint64_t num_zeros = num_bits_ - num_ones_;
227
+ num_select0_hints_ =
228
+ (num_zeros > 0) ? (num_zeros - 1) / kOnesPerSelectHint + 1 : 0;
229
+
230
+ size_t s1_bytes = num_select1_hints_ * sizeof(uint32_t);
231
+ size_t s0_bytes = num_select0_hints_ * sizeof(uint32_t);
232
+ owned_data_.resize(words_bytes + rank_bytes + s1_bytes + s0_bytes, '\0');
233
+
234
+ // Recompute all pointers after resize (string may have reallocated).
235
+ RecomputePointers();
236
+ assert(reinterpret_cast<uintptr_t>(rank_lut_) % alignof(uint32_t) == 0);
237
+
238
+ BuildSelectHints();
239
+ }
240
+
241
+ void Bitvector::BuildRankLUT() {
242
+ // The rank LUT is mutable during construction, so we const_cast here.
243
+ // After BuildRankLUT() completes, rank_lut_ is treated as read-only.
244
+ uint32_t* lut = const_cast<uint32_t*>(rank_lut_);
245
+
246
+ // Guard: uint32_t can hold values up to ~4 billion. The maximum cumulative
247
+ // rank is num_ones_ (at most num_bits_), so asserting num_bits_ fits in
248
+ // uint32_t guarantees all rank LUT entries fit.
249
+ assert(num_bits_ <= UINT32_MAX);
250
+
251
+ uint64_t cumulative = 0;
252
+ for (uint64_t s = 0; s < num_rank_samples_; s++) {
253
+ lut[s] = static_cast<uint32_t>(cumulative);
254
+ // Sum popcount for the kWordsPerRankSample words in this sample interval.
255
+ uint64_t word_start = s * kWordsPerRankSample;
256
+ uint64_t word_end = std::min(word_start + kWordsPerRankSample, num_words_);
257
+ for (uint64_t w = word_start; w < word_end; w++) {
258
+ cumulative += Popcount(words_[w]);
259
+ }
260
+ }
261
+ // Total number of 1-bits is the cumulative count after all words.
262
+ num_ones_ = cumulative;
263
+ }
264
+
265
+ void Bitvector::BuildSelectHints() {
266
+ // Build select1 hints: for each k, select1_hints_[k] is the rank LUT
267
+ // index of the sample interval containing the (k * kOnesPerSelectHint)-th
268
+ // 1-bit.
269
+ if (num_select1_hints_ > 0) {
270
+ uint32_t* hints = const_cast<uint32_t*>(select1_hints_);
271
+ uint64_t sample_idx = 0;
272
+ for (uint64_t k = 0; k < num_select1_hints_; k++) {
273
+ uint64_t target = k * kOnesPerSelectHint;
274
+ // Advance sample_idx until rank_lut_[sample_idx+1] > target.
275
+ while (sample_idx + 1 < num_rank_samples_ &&
276
+ rank_lut_[sample_idx + 1] <= target) {
277
+ sample_idx++;
278
+ }
279
+ hints[k] = static_cast<uint32_t>(sample_idx);
280
+ }
281
+ }
282
+
283
+ // Build select0 hints analogously using zero counts.
284
+ if (num_select0_hints_ > 0) {
285
+ uint32_t* hints = const_cast<uint32_t*>(select0_hints_);
286
+ uint64_t sample_idx = 0;
287
+ for (uint64_t k = 0; k < num_select0_hints_; k++) {
288
+ uint64_t target = k * kOnesPerSelectHint;
289
+ while (sample_idx + 1 < num_rank_samples_ &&
290
+ ((sample_idx + 1) * kBitsPerRankSample -
291
+ rank_lut_[sample_idx + 1]) <= target) {
292
+ sample_idx++;
293
+ }
294
+ hints[k] = static_cast<uint32_t>(sample_idx);
295
+ }
296
+ }
297
+ }
298
+
299
+ // FindNthOneBit is now inline in bitvector.h for hot-path performance.
300
+
301
+ uint64_t Bitvector::FindNthZeroBit(uint64_t i) const {
302
+ uint64_t num_zeros = num_bits_ - num_ones_;
303
+ if (i >= num_zeros) {
304
+ return num_bits_;
305
+ }
306
+
307
+ // Use select0 hints to narrow the search range.
308
+ uint64_t lo;
309
+ uint64_t hi;
310
+ if (num_select0_hints_ > 0) {
311
+ uint64_t hint_idx = i / kOnesPerSelectHint;
312
+ lo = select0_hints_[hint_idx];
313
+ hi = (hint_idx + 1 < num_select0_hints_) ? select0_hints_[hint_idx + 1]
314
+ : num_rank_samples_ - 1;
315
+ } else {
316
+ lo = 0;
317
+ hi = num_rank_samples_ - 1;
318
+ }
319
+
320
+ // Linear scan within the narrowed range.
321
+ while (lo < hi) {
322
+ uint64_t zeros_next = (lo + 1) * kBitsPerRankSample - rank_lut_[lo + 1];
323
+ if (zeros_next <= i) {
324
+ lo++;
325
+ } else {
326
+ break;
327
+ }
328
+ }
329
+
330
+ uint64_t zeros_at_lo = lo * kBitsPerRankSample - rank_lut_[lo];
331
+ uint64_t remaining = i - zeros_at_lo;
332
+ uint64_t word_start = lo * kWordsPerRankSample;
333
+ uint64_t word_end = std::min(word_start + kWordsPerRankSample, num_words_);
334
+
335
+ for (uint64_t w = word_start; w < word_end; w++) {
336
+ // For the last word, we may have fewer than 64 valid bits. We need to
337
+ // mask off the padding bits so they don't count as zeros.
338
+ uint64_t valid_bits = 64;
339
+ if (w == num_words_ - 1 && num_bits_ % 64 != 0) {
340
+ valid_bits = num_bits_ % 64;
341
+ }
342
+ uint64_t zeros_in_word = valid_bits - Popcount(words_[w]);
343
+ if (remaining < zeros_in_word) {
344
+ // The target 0-bit is in this word. Invert to get 1-bits at zero
345
+ // positions, mask off padding, then find the n-th set bit in the word.
346
+ uint64_t word = ~words_[w];
347
+ if (valid_bits < 64) {
348
+ word &= (uint64_t(1) << valid_bits) - 1;
349
+ }
350
+ return w * 64 + FindNthSetBitInWord(word, remaining);
351
+ }
352
+ remaining -= zeros_in_word;
353
+ }
354
+
355
+ assert(false);
356
+ return num_bits_;
357
+ }
358
+
359
+ uint64_t Bitvector::NextSetBit(uint64_t pos) const {
360
+ if (pos >= num_bits_) {
361
+ return num_bits_;
362
+ }
363
+
364
+ uint64_t word_idx = pos / 64;
365
+ uint64_t bit_idx = pos % 64;
366
+
367
+ // Check remaining bits in the current word.
368
+ uint64_t word = words_[word_idx] >> bit_idx;
369
+ if (word != 0) {
370
+ uint64_t result = pos + Ctz(word);
371
+ return (result < num_bits_) ? result : num_bits_;
372
+ }
373
+
374
+ // Scan subsequent words.
375
+ for (uint64_t w = word_idx + 1; w < num_words_; w++) {
376
+ if (words_[w] != 0) {
377
+ uint64_t result = w * 64 + Ctz(words_[w]);
378
+ return (result < num_bits_) ? result : num_bits_;
379
+ }
380
+ }
381
+ return num_bits_;
382
+ }
383
+
384
+ uint64_t Bitvector::DistanceToNextSetBit(uint64_t pos) const {
385
+ assert(pos < num_bits_);
386
+ assert(GetBit(pos)); // pos must be a set bit.
387
+
388
+ // Find the next set bit after pos (exclusive).
389
+ uint64_t next = NextSetBit(pos + 1);
390
+ return next - pos;
391
+ }
392
+
393
+ // ============================================================================
394
+ // EliasFano implementation
395
+ // ============================================================================
396
+
397
+ void EliasFano::BuildFrom(const uint64_t* values, uint64_t count,
398
+ uint64_t universe) {
399
+ count_ = count;
400
+ universe_ = universe;
401
+
402
+ if (count == 0) {
403
+ low_bits_ = 0;
404
+ low_mask_ = 0;
405
+ low_words_ = nullptr;
406
+ num_low_words_ = 0;
407
+ // Build an empty high bitvector so it serializes/deserializes correctly.
408
+ // Without this, high_bv_ stays default-constructed (num_rank_samples_=0),
409
+ // but InitFromData computes num_rank_samples_=1 for 0-bit bitvectors,
410
+ // causing a size mismatch on deserialization.
411
+ BitvectorBuilder empty_builder;
412
+ high_bv_.BuildFrom(empty_builder);
413
+ return;
414
+ }
415
+
416
+ // Compute low_bits = floor(log2(universe / count)).
417
+ // When universe <= count, low_bits = 0 (all bits are high).
418
+ // FloorLog2 returns floor(log2(x)) for x >= 1.
419
+ if (universe > count) {
420
+ low_bits_ = static_cast<uint64_t>(FloorLog2(universe / count));
421
+ } else {
422
+ low_bits_ = 0;
423
+ }
424
+ low_mask_ =
425
+ (low_bits_ < 64) ? ((uint64_t(1) << low_bits_) - 1) : ~uint64_t(0);
426
+
427
+ // Build high-bits bitvector.
428
+ // The high part of each value is (value >> low_bits_). The bitvector
429
+ // has a 1-bit at position high[i] + i for each element i, with 0-bits
430
+ // filling the gaps. Total length = max_high + count.
431
+ uint64_t max_high =
432
+ (count > 0 && low_bits_ < 64) ? (values[count - 1] >> low_bits_) : 0;
433
+ uint64_t high_len = max_high + count;
434
+
435
+ BitvectorBuilder high_builder;
436
+ high_builder.Reserve(high_len + 1);
437
+
438
+ uint64_t prev_high = 0;
439
+ for (uint64_t i = 0; i < count; i++) {
440
+ assert(i == 0 || values[i] >= values[i - 1]); // Must be monotone.
441
+ uint64_t high = (low_bits_ < 64) ? (values[i] >> low_bits_) : 0;
442
+ // Append (high - prev_high) zeros followed by a 1.
443
+ assert(high >= prev_high);
444
+ high_builder.AppendMultiple(false, high - prev_high);
445
+ high_builder.Append(true);
446
+ prev_high = high;
447
+ }
448
+
449
+ high_bv_.BuildFrom(high_builder);
450
+
451
+ // Build packed low-bits array.
452
+ uint64_t total_low_bits = count * low_bits_;
453
+ num_low_words_ = (total_low_bits + 63) / 64;
454
+ owned_low_data_.resize(num_low_words_ * sizeof(uint64_t), '\0');
455
+ uint64_t* low_buf = reinterpret_cast<uint64_t*>(&owned_low_data_[0]);
456
+ low_words_ = low_buf;
457
+
458
+ // Pack low bits: value i's low bits go at bit position i * low_bits_.
459
+ for (uint64_t i = 0; i < count; i++) {
460
+ uint64_t low = values[i] & low_mask_;
461
+ uint64_t bit_pos = i * low_bits_;
462
+ uint64_t word_idx = bit_pos / 64;
463
+ uint64_t bit_idx = bit_pos % 64;
464
+ low_buf[word_idx] |= low << bit_idx;
465
+ // Handle word boundary crossing.
466
+ if (bit_idx > 0 && bit_idx + low_bits_ > 64) {
467
+ low_buf[word_idx + 1] |= low >> (64 - bit_idx);
468
+ }
469
+ }
470
+ }
471
+
472
+ size_t EliasFano::SerializedSize() const {
473
+ // 3 uint64_t header + high bitvector + low words (8-byte aligned).
474
+ size_t low_bytes = num_low_words_ * sizeof(uint64_t);
475
+ return 3 * sizeof(uint64_t) + high_bv_.SerializedSize() + low_bytes;
476
+ }
477
+
478
+ void EliasFano::EncodeTo(std::string* output) const {
479
+ size_t old_size = output->size();
480
+ // Header: count, universe, low_bits
481
+ PutFixed64(output, count_);
482
+ PutFixed64(output, universe_);
483
+ PutFixed64(output, low_bits_);
484
+
485
+ // High bitvector
486
+ high_bv_.EncodeTo(output);
487
+
488
+ // Low words
489
+ size_t low_bytes = num_low_words_ * sizeof(uint64_t);
490
+ if (low_bytes > 0) {
491
+ size_t cur = output->size();
492
+ output->resize(cur + low_bytes);
493
+ memcpy(&(*output)[cur], low_words_, low_bytes);
494
+ }
495
+ (void)old_size;
496
+ }
497
+
498
+ Status EliasFano::InitFromData(const char* data, size_t data_size,
499
+ size_t* bytes_consumed) {
500
+ const char* start = data;
501
+
502
+ // Read header: count, universe, low_bits.
503
+ if (data_size < 3 * sizeof(uint64_t)) {
504
+ return Status::Corruption("EliasFano: insufficient data for header");
505
+ }
506
+ memcpy(&count_, data, sizeof(uint64_t));
507
+ data += sizeof(uint64_t);
508
+ memcpy(&universe_, data, sizeof(uint64_t));
509
+ data += sizeof(uint64_t);
510
+ memcpy(&low_bits_, data, sizeof(uint64_t));
511
+ data += sizeof(uint64_t);
512
+ data_size -= 3 * sizeof(uint64_t);
513
+
514
+ // Validate header fields from untrusted data.
515
+ if (low_bits_ > 63) {
516
+ return Status::Corruption("EliasFano: low_bits exceeds 63");
517
+ }
518
+ // Upper-bound on count_: a sequence with > 2^30 elements would require
519
+ // tens of GB of data. This prevents integer overflow in subsequent
520
+ // count_ * low_bits_ and count_ * sizeof(...) arithmetic. Block checksums
521
+ // are the first line of defense; this is defense-in-depth for the
522
+ // deserialization path.
523
+ static constexpr uint64_t kMaxReasonableCount = uint64_t(1) << 30;
524
+ if (count_ > kMaxReasonableCount) {
525
+ return Status::Corruption("EliasFano: count exceeds reasonable limit");
526
+ }
527
+ low_mask_ =
528
+ (low_bits_ < 64) ? ((uint64_t(1) << low_bits_) - 1) : ~uint64_t(0);
529
+
530
+ // Read high bitvector.
531
+ size_t consumed = 0;
532
+ Status s = high_bv_.InitFromData(data, data_size, &consumed);
533
+ if (!s.ok()) {
534
+ return s;
535
+ }
536
+ data += consumed;
537
+ data_size -= consumed;
538
+
539
+ // Read low words. The multiplication is safe from overflow because
540
+ // count_ <= 2^30 and low_bits_ <= 63, so count_ * low_bits_ <= 2^36.
541
+ uint64_t total_low_bits = count_ * low_bits_;
542
+ num_low_words_ = (total_low_bits + 63) / 64;
543
+ size_t low_bytes = num_low_words_ * sizeof(uint64_t);
544
+ if (data_size < low_bytes) {
545
+ return Status::Corruption("EliasFano: insufficient data for low words");
546
+ }
547
+ if (low_bytes > 0) {
548
+ if (reinterpret_cast<uintptr_t>(data) % alignof(uint64_t) != 0) {
549
+ return Status::Corruption("EliasFano: low words not 8-byte aligned");
550
+ }
551
+ low_words_ = reinterpret_cast<const uint64_t*>(data);
552
+ } else {
553
+ low_words_ = nullptr;
554
+ }
555
+ data += low_bytes;
556
+
557
+ *bytes_consumed = static_cast<size_t>(data - start);
558
+ return Status::OK();
559
+ }
560
+
561
+ } // namespace trie_index
562
+ } // namespace ROCKSDB_NAMESPACE