@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
@@ -39,20 +39,64 @@
39
39
 
40
40
  #include <algorithm>
41
41
  #include <cassert>
42
+ #include <cmath>
42
43
 
43
44
  #include "db/dbformat.h"
45
+ #include "monitoring/statistics_impl.h"
44
46
  #include "rocksdb/comparator.h"
47
+ #include "table/block_based/block_util.h"
45
48
  #include "table/block_based/data_block_footer.h"
46
49
  #include "util/coding.h"
47
50
 
48
51
  namespace ROCKSDB_NAMESPACE {
49
52
 
53
+ namespace {
54
+
55
+ // Tracks whether restart-point keys are uniformly distributed using Welford's
56
+ // online algorithm to incrementally compute the coefficient of variation (CV)
57
+ // of gaps between consecutive restart keys.
58
+ class UniformDataTracker {
59
+ public:
60
+ void AddKey(uint64_t key_value) {
61
+ if (num_keys_ > 0) {
62
+ double gap = static_cast<double>(key_value - prev_key_value_);
63
+ size_t gap_count = num_keys_;
64
+ double delta = gap - mean_;
65
+ mean_ += delta / static_cast<double>(gap_count);
66
+ double delta2 = gap - mean_;
67
+ m2_ += delta * delta2;
68
+ }
69
+ prev_key_value_ = key_value;
70
+ num_keys_++;
71
+ }
72
+
73
+ // Returns the coefficient of variation (CV) of the key gaps, or -1.0 if
74
+ // there are not enough data points to compute it.
75
+ double GetCV() const {
76
+ size_t gap_count = num_keys_ > 0 ? num_keys_ - 1 : 0;
77
+ if (gap_count < 2 || mean_ <= 0) {
78
+ return -1.0;
79
+ }
80
+ return std::sqrt(m2_ / static_cast<double>(gap_count)) / mean_;
81
+ }
82
+
83
+ private:
84
+ uint64_t prev_key_value_ = 0;
85
+ size_t num_keys_ = 0;
86
+ double mean_ = 0;
87
+ double m2_ = 0;
88
+ };
89
+
90
+ } // namespace
91
+
50
92
  BlockBuilder::BlockBuilder(
51
93
  int block_restart_interval, bool use_delta_encoding,
52
94
  bool use_value_delta_encoding,
53
95
  BlockBasedTableOptions::DataBlockIndexType index_type,
54
96
  double data_block_hash_table_util_ratio, size_t ts_sz,
55
- bool persist_user_defined_timestamps, bool is_user_key)
97
+ bool persist_user_defined_timestamps, bool is_user_key,
98
+ bool use_separated_kv_storage, Statistics* statistics,
99
+ double uniform_cv_threshold)
56
100
  : block_restart_interval_(block_restart_interval),
57
101
  use_delta_encoding_(use_delta_encoding),
58
102
  use_value_delta_encoding_(use_value_delta_encoding),
@@ -60,7 +104,10 @@ BlockBuilder::BlockBuilder(
60
104
  is_user_key_(is_user_key),
61
105
  restarts_(1, 0), // First restart point is at offset 0
62
106
  counter_(0),
63
- finished_(false) {
107
+ finished_(false),
108
+ uniform_cv_threshold_(uniform_cv_threshold),
109
+ statistics_(statistics),
110
+ use_separated_kv_storage_(use_separated_kv_storage) {
64
111
  switch (index_type) {
65
112
  case BlockBasedTableOptions::kDataBlockBinarySearch:
66
113
  break;
@@ -72,20 +119,24 @@ BlockBuilder::BlockBuilder(
72
119
  assert(0);
73
120
  }
74
121
  assert(block_restart_interval_ >= 1);
75
- estimate_ = sizeof(uint32_t) + sizeof(uint32_t);
122
+ estimate_ = sizeof(uint32_t) + sizeof(uint32_t) +
123
+ (use_separated_kv_storage_ ? sizeof(uint32_t) : 0);
76
124
  }
77
125
 
78
126
  void BlockBuilder::Reset() {
79
127
  buffer_.clear();
80
128
  restarts_.resize(1); // First restart point is at offset 0
81
129
  assert(restarts_[0] == 0);
82
- estimate_ = sizeof(uint32_t) + sizeof(uint32_t);
130
+ estimate_ = sizeof(uint32_t) + sizeof(uint32_t) +
131
+ (use_separated_kv_storage_ ? sizeof(uint32_t) : 0);
83
132
  counter_ = 0;
84
133
  finished_ = false;
85
134
  last_key_.clear();
86
135
  if (data_block_hash_index_builder_.Valid()) {
87
136
  data_block_hash_index_builder_.Reset();
88
137
  }
138
+ values_buffer_.clear();
139
+
89
140
  #ifndef NDEBUG
90
141
  add_with_last_key_called_ = false;
91
142
  #endif
@@ -116,6 +167,12 @@ size_t BlockBuilder::EstimateSizeAfterKV(const Slice& key,
116
167
  estimate += sizeof(uint32_t); // a new restart entry.
117
168
  }
118
169
 
170
+ // For separated KV storage, value_offset varint is written at restart points
171
+ if (use_separated_kv_storage_ &&
172
+ (counter_ == 0 || counter_ >= block_restart_interval_)) {
173
+ estimate += VarintLength(values_buffer_.size());
174
+ }
175
+
119
176
  estimate += sizeof(int32_t); // varint for shared prefix length.
120
177
  // Note: this is an imprecise estimate as we will have to encoded size, one
121
178
  // for shared key and one for non-shared key.
@@ -128,24 +185,34 @@ size_t BlockBuilder::EstimateSizeAfterKV(const Slice& key,
128
185
  }
129
186
 
130
187
  Slice BlockBuilder::Finish() {
188
+ bool is_uniform = ScanForUniformity();
189
+
131
190
  // Append restart array
191
+ size_t values_buffer_offset = buffer_.size();
192
+
193
+ if (use_separated_kv_storage_) {
194
+ buffer_.append(values_buffer_);
195
+ }
196
+
132
197
  for (size_t i = 0; i < restarts_.size(); i++) {
133
198
  PutFixed32(&buffer_, restarts_[i]);
134
199
  }
135
200
 
136
- uint32_t num_restarts = static_cast<uint32_t>(restarts_.size());
137
- BlockBasedTableOptions::DataBlockIndexType index_type =
138
- BlockBasedTableOptions::kDataBlockBinarySearch;
201
+ DataBlockFooter footer;
202
+ footer.num_restarts = static_cast<uint32_t>(restarts_.size());
203
+ footer.index_type = BlockBasedTableOptions::kDataBlockBinarySearch;
204
+ footer.is_uniform = is_uniform;
139
205
  if (data_block_hash_index_builder_.Valid() &&
140
206
  CurrentSizeEstimate() <= kMaxBlockSizeSupportedByHashIndex) {
141
207
  data_block_hash_index_builder_.Finish(buffer_);
142
- index_type = BlockBasedTableOptions::kDataBlockBinaryAndHash;
208
+ footer.index_type = BlockBasedTableOptions::kDataBlockBinaryAndHash;
143
209
  }
144
210
 
145
- // footer is a packed format of data_block_index_type and num_restarts
146
- uint32_t block_footer = PackIndexTypeAndNumRestarts(index_type, num_restarts);
147
-
148
- PutFixed32(&buffer_, block_footer);
211
+ if (use_separated_kv_storage_) {
212
+ footer.separated_kv = true;
213
+ footer.values_section_offset = static_cast<uint32_t>(values_buffer_offset);
214
+ }
215
+ footer.EncodeTo(&buffer_);
149
216
  finished_ = true;
150
217
  return Slice(buffer_);
151
218
  }
@@ -221,28 +288,45 @@ inline void BlockBuilder::AddWithLastKeyImpl(const Slice& key,
221
288
  }
222
289
 
223
290
  const size_t non_shared = key_to_persist.size() - shared;
224
-
291
+ const size_t previous_value_offset = values_buffer_.size();
225
292
  if (use_value_delta_encoding_) {
226
- // Add "<shared><non_shared>" to buffer_
227
- PutVarint32Varint32(&buffer_, static_cast<uint32_t>(shared),
228
- static_cast<uint32_t>(non_shared));
293
+ if (use_separated_kv_storage_ && counter_ == 0) {
294
+ // Add "<shared><non_shared><value_offset>" to buffer_
295
+ PutVarint32(&buffer_, static_cast<uint32_t>(shared),
296
+ static_cast<uint32_t>(non_shared),
297
+ static_cast<uint32_t>(values_buffer_.size()));
298
+ } else {
299
+ // Add "<shared><non_shared>" to buffer_
300
+ PutVarint32(&buffer_, static_cast<uint32_t>(shared),
301
+ static_cast<uint32_t>(non_shared));
302
+ }
229
303
  } else {
230
- // Add "<shared><non_shared><value_size>" to buffer_
231
- PutVarint32Varint32Varint32(&buffer_, static_cast<uint32_t>(shared),
232
- static_cast<uint32_t>(non_shared),
233
- static_cast<uint32_t>(value.size()));
304
+ if (use_separated_kv_storage_ && counter_ == 0) {
305
+ // Add "<shared><non_shared><value_size><value_offset>" to buffer_
306
+ PutVarint32(&buffer_, static_cast<uint32_t>(shared),
307
+ static_cast<uint32_t>(non_shared),
308
+ static_cast<uint32_t>(value.size()),
309
+ static_cast<uint32_t>(values_buffer_.size()));
310
+ } else {
311
+ // Add "<shared><non_shared><value_size>" to buffer_
312
+ PutVarint32(&buffer_, static_cast<uint32_t>(shared),
313
+ static_cast<uint32_t>(non_shared),
314
+ static_cast<uint32_t>(value.size()));
315
+ }
234
316
  }
235
317
 
236
- // Add string delta to buffer_ followed by value
318
+ // Add string delta to buffer_
237
319
  buffer_.append(key_to_persist.data() + shared, non_shared);
320
+
321
+ auto& values_buffer = use_separated_kv_storage_ ? values_buffer_ : buffer_;
238
322
  // Use value delta encoding only when the key has shared bytes. This would
239
323
  // simplify the decoding, where it can figure which decoding to use simply by
240
324
  // looking at the shared bytes size.
241
325
  if (shared != 0 && use_value_delta_encoding_) {
242
326
  assert(delta_value != nullptr);
243
- buffer_.append(delta_value->data(), delta_value->size());
327
+ values_buffer.append(delta_value->data(), delta_value->size());
244
328
  } else {
245
- buffer_.append(value.data(), value.size());
329
+ values_buffer.append(value.data(), value.size());
246
330
  }
247
331
 
248
332
  // TODO(yuzhangyu): make user defined timestamp work with block hash index.
@@ -256,7 +340,8 @@ inline void BlockBuilder::AddWithLastKeyImpl(const Slice& key,
256
340
  }
257
341
 
258
342
  counter_++;
259
- estimate_ += buffer_.size() - buffer_size;
343
+ estimate_ += buffer_.size() - buffer_size + values_buffer_.size() -
344
+ previous_value_offset;
260
345
  }
261
346
 
262
347
  const Slice BlockBuilder::MaybeStripTimestampFromKey(std::string* key_buf,
@@ -272,4 +357,63 @@ const Slice BlockBuilder::MaybeStripTimestampFromKey(std::string* key_buf,
272
357
  }
273
358
  return stripped_key;
274
359
  }
360
+
361
+ Slice BlockBuilder::GetRestartKey(uint32_t index, const char* limit) const {
362
+ assert(index < restarts_.size());
363
+ const char* p = buffer_.data() + restarts_[index];
364
+ uint32_t shared;
365
+ uint32_t non_shared;
366
+ // When separated KV storage is enabled, restart point entries include an
367
+ // extra value_offset varint that must be consumed to find the key delta.
368
+ uint32_t value_offset;
369
+ uint32_t* value_offset_ptr =
370
+ use_separated_kv_storage_ ? &value_offset : nullptr;
371
+ if (use_value_delta_encoding_) {
372
+ p = DecodeKeyV4()(p, limit, &shared, &non_shared, value_offset_ptr);
373
+ } else {
374
+ p = DecodeKey()(p, limit, &shared, &non_shared, value_offset_ptr);
375
+ }
376
+ assert(p != nullptr);
377
+ assert(shared == 0);
378
+ (void)shared;
379
+ return Slice(p, non_shared);
380
+ }
381
+
382
+ bool BlockBuilder::ScanForUniformity() const {
383
+ if (uniform_cv_threshold_ < 0 || restarts_.size() < 3) {
384
+ return false;
385
+ }
386
+
387
+ const char* limit = buffer_.data() + buffer_.size();
388
+
389
+ Slice first_key = GetRestartKey(0, limit);
390
+ Slice last_key =
391
+ GetRestartKey(static_cast<uint32_t>(restarts_.size() - 1), limit);
392
+
393
+ // Keys must be long enough for ReadBe64FromKey which strips internal bytes
394
+ if (!is_user_key_ && (first_key.size() < kNumInternalBytes ||
395
+ last_key.size() < kNumInternalBytes)) {
396
+ return false;
397
+ }
398
+
399
+ size_t prefix_len = first_key.difference_offset(last_key);
400
+
401
+ UniformDataTracker tracker;
402
+ for (size_t i = 0; i < restarts_.size(); i++) {
403
+ Slice key = GetRestartKey(static_cast<uint32_t>(i), limit);
404
+ if (!is_user_key_ && key.size() < kNumInternalBytes) {
405
+ return false;
406
+ }
407
+ tracker.AddKey(ReadBe64FromKey(key, is_user_key_, prefix_len));
408
+ }
409
+
410
+ double cv = tracker.GetCV();
411
+ if (statistics_ != nullptr && cv >= 0) {
412
+ RecordInHistogram(statistics_, BLOCK_KEY_DISTRIBUTION_CV,
413
+ static_cast<uint64_t>(cv * 10000));
414
+ }
415
+
416
+ return cv >= 0 && cv < uniform_cv_threshold_;
417
+ }
418
+
275
419
  } // namespace ROCKSDB_NAMESPACE
@@ -18,20 +18,22 @@
18
18
 
19
19
  namespace ROCKSDB_NAMESPACE {
20
20
 
21
+ class Statistics;
22
+
21
23
  class BlockBuilder {
22
24
  public:
23
25
  BlockBuilder(const BlockBuilder&) = delete;
24
26
  void operator=(const BlockBuilder&) = delete;
25
27
 
26
- explicit BlockBuilder(int block_restart_interval,
27
- bool use_delta_encoding = true,
28
- bool use_value_delta_encoding = false,
29
- BlockBasedTableOptions::DataBlockIndexType index_type =
30
- BlockBasedTableOptions::kDataBlockBinarySearch,
31
- double data_block_hash_table_util_ratio = 0.75,
32
- size_t ts_sz = 0,
33
- bool persist_user_defined_timestamps = true,
34
- bool is_user_key = false);
28
+ explicit BlockBuilder(
29
+ int block_restart_interval, bool use_delta_encoding = true,
30
+ bool use_value_delta_encoding = false,
31
+ BlockBasedTableOptions::DataBlockIndexType index_type =
32
+ BlockBasedTableOptions::kDataBlockBinarySearch,
33
+ double data_block_hash_table_util_ratio = 0.75, size_t ts_sz = 0,
34
+ bool persist_user_defined_timestamps = true, bool is_user_key = false,
35
+ bool use_separated_kv_storage = false, Statistics* statistics = nullptr,
36
+ double uniform_cv_threshold = -1.0);
35
37
 
36
38
  // Reset the contents as if the BlockBuilder was just constructed.
37
39
  void Reset();
@@ -90,6 +92,10 @@ class BlockBuilder {
90
92
  const Slice* const delta_value,
91
93
  bool skip_delta_encoding, size_t buffer_size);
92
94
 
95
+ bool ScanForUniformity() const;
96
+
97
+ Slice GetRestartKey(uint32_t index, const char* limit) const;
98
+
93
99
  inline const Slice MaybeStripTimestampFromKey(std::string* key_buf,
94
100
  const Slice& key);
95
101
 
@@ -124,6 +130,16 @@ class BlockBuilder {
124
130
  bool finished_; // Has Finish() been called?
125
131
  std::string last_key_;
126
132
  DataBlockHashIndexBuilder data_block_hash_index_builder_;
133
+ const double uniform_cv_threshold_;
134
+ Statistics* statistics_;
135
+
136
+ const bool use_separated_kv_storage_; // When enabled, keys are stored first,
137
+ // followed by values in a separate
138
+ // section. Value offset is stored as
139
+ // varint only at restart points; for
140
+ // other entries, offset is computed
141
+ // as prev_offset + prev_length.
142
+ std::string values_buffer_;
127
143
  #ifndef NDEBUG
128
144
  bool add_with_last_key_called_ = false;
129
145
  #endif
@@ -11,15 +11,17 @@ namespace ROCKSDB_NAMESPACE {
11
11
 
12
12
  void BlockCreateContext::Create(std::unique_ptr<Block_kData>* parsed_out,
13
13
  BlockContents&& block) {
14
- parsed_out->reset(new Block_kData(
15
- std::move(block), table_options->read_amp_bytes_per_bit, statistics));
14
+ parsed_out->reset(new Block_kData(std::move(block),
15
+ table_options->read_amp_bytes_per_bit,
16
+ statistics, data_block_restart_interval));
16
17
  parsed_out->get()->InitializeDataBlockProtectionInfo(protection_bytes_per_key,
17
18
  raw_ucmp);
18
19
  }
19
20
  void BlockCreateContext::Create(std::unique_ptr<Block_kIndex>* parsed_out,
20
21
  BlockContents&& block) {
21
22
  parsed_out->reset(new Block_kIndex(std::move(block),
22
- /*read_amp_bytes_per_bit*/ 0, statistics));
23
+ /*read_amp_bytes_per_bit*/ 0, statistics,
24
+ index_block_restart_interval));
23
25
  parsed_out->get()->InitializeIndexBlockProtectionInfo(
24
26
  protection_bytes_per_key, raw_ucmp, index_value_is_full,
25
27
  index_has_first_key);
@@ -28,7 +30,8 @@ void BlockCreateContext::Create(
28
30
  std::unique_ptr<Block_kFilterPartitionIndex>* parsed_out,
29
31
  BlockContents&& block) {
30
32
  parsed_out->reset(new Block_kFilterPartitionIndex(
31
- std::move(block), /*read_amp_bytes_per_bit*/ 0, statistics));
33
+ std::move(block), /*read_amp_bytes_per_bit*/ 0, statistics,
34
+ index_block_restart_interval));
32
35
  parsed_out->get()->InitializeIndexBlockProtectionInfo(
33
36
  protection_bytes_per_key, raw_ucmp, index_value_is_full,
34
37
  index_has_first_key);
@@ -85,7 +85,9 @@ struct BlockCreateContext : public Cache::CreateContext {
85
85
  uint8_t _protection_bytes_per_key,
86
86
  const Comparator* _raw_ucmp,
87
87
  bool _index_value_is_full = false,
88
- bool _index_has_first_key = false)
88
+ bool _index_has_first_key = false,
89
+ uint32_t _data_block_restart_interval = 0,
90
+ uint32_t _index_block_restart_interval = 0)
89
91
  : table_options(_table_options),
90
92
  ioptions(_ioptions),
91
93
  statistics(_statistics),
@@ -93,7 +95,9 @@ struct BlockCreateContext : public Cache::CreateContext {
93
95
  raw_ucmp(_raw_ucmp),
94
96
  protection_bytes_per_key(_protection_bytes_per_key),
95
97
  index_value_is_full(_index_value_is_full),
96
- index_has_first_key(_index_has_first_key) {}
98
+ index_has_first_key(_index_has_first_key),
99
+ data_block_restart_interval(_data_block_restart_interval),
100
+ index_block_restart_interval(_index_block_restart_interval) {}
97
101
 
98
102
  const BlockBasedTableOptions* table_options = nullptr;
99
103
  const ImmutableOptions* ioptions = nullptr;
@@ -104,6 +108,9 @@ struct BlockCreateContext : public Cache::CreateContext {
104
108
  uint8_t protection_bytes_per_key = 0;
105
109
  bool index_value_is_full;
106
110
  bool index_has_first_key;
111
+ // Restart intervals from table properties (0 if not available)
112
+ uint32_t data_block_restart_interval = 0;
113
+ uint32_t index_block_restart_interval = 0;
107
114
 
108
115
  // For TypedCacheInterface
109
116
  template <typename TBlocklike>