@nxtedition/rocksdb 5.2.21 → 5.2.26

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 (909) hide show
  1. package/binding.cc +216 -252
  2. package/binding.gyp +78 -72
  3. package/deps/rocksdb/build_version.cc +70 -4
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  5. package/deps/rocksdb/rocksdb/Makefile +459 -469
  6. package/deps/rocksdb/rocksdb/README.md +4 -4
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  32. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  33. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  34. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  35. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  36. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  51. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  56. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  57. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  60. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  61. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  62. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  63. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  64. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  65. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  67. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  68. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  69. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  71. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  74. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  75. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  96. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  97. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  98. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  100. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  101. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  102. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  103. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  104. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  105. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  106. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  107. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  108. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  110. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  111. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  112. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  122. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  124. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  125. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  126. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  127. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  128. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  129. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  130. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  131. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  132. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  133. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  134. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  135. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  136. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  137. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  138. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  139. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  140. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  141. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  142. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  143. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  144. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  145. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  146. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  147. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  148. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  149. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  150. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  151. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  152. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  153. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  154. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  155. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  156. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  157. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  158. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  159. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  160. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  161. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  162. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  163. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  164. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  165. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  166. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  167. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  168. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  169. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  170. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  171. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  172. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  174. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  175. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  176. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  178. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  180. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  182. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  183. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  184. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  185. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  186. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  187. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  188. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  189. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  190. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  191. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  192. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  193. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  194. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  195. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  196. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  197. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  198. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  199. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  200. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  201. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  202. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  203. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  204. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  205. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  206. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  207. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  210. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  212. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  213. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  216. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  217. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  218. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  219. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  220. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  223. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  224. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  226. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  227. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  228. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  229. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  230. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  231. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  232. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  233. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  234. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  235. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  236. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  237. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  238. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  239. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  240. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  241. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  242. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  243. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  244. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  245. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  246. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  247. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  248. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  249. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  250. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  251. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  252. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  253. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  254. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  255. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  256. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  257. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  258. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  259. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  260. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  261. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  262. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  263. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  264. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  265. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  266. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  267. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  268. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  269. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  270. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  271. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  273. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  274. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  280. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  285. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  286. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  287. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  288. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  289. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  290. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  291. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  292. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  293. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  294. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  295. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  296. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  297. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  298. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  299. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  300. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  301. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  302. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  303. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  304. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  305. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  306. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  307. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  308. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  309. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  310. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  313. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  315. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  316. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  317. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  318. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  319. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  320. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  321. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  324. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  325. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  326. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  327. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  334. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  335. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  336. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  342. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  343. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  344. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  345. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  346. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  348. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  349. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  350. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  353. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  354. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  357. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  358. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  359. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  360. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  361. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  362. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  363. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  364. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  365. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  366. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  367. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  368. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  371. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  372. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  373. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  375. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  376. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  378. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  380. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  381. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  382. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  383. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  386. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  387. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  389. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  407. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  408. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  410. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  412. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  413. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  414. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  415. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  416. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  417. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  418. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  419. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  420. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  421. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  422. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  423. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  424. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  425. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  426. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  427. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  428. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  429. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  430. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  431. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  432. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  433. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  434. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  435. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  436. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  437. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  438. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  439. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  440. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  441. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  442. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  443. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  444. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  445. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  446. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  447. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  448. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  449. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  450. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  451. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  452. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  453. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  454. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  455. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  456. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  457. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  458. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  459. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  460. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  461. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  462. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  463. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  464. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  465. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  466. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  467. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  468. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  469. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  470. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  471. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  472. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  473. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  474. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  475. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  476. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  477. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  478. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  479. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  480. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  481. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  482. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  483. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  484. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  485. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  486. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  487. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  488. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  489. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  490. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  491. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  492. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  493. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  494. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  495. package/deps/rocksdb/rocksdb/python.mk +9 -0
  496. package/deps/rocksdb/rocksdb/src.mk +82 -34
  497. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  498. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  499. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  500. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  501. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  502. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  503. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  504. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  505. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  506. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  507. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  508. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  514. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  515. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  516. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  517. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  518. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  519. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  520. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  521. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  522. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  523. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  524. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  525. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  526. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  527. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  529. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  530. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  531. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  532. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  534. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  535. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  536. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  537. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  538. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  539. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  540. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  541. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  542. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  543. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  544. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  546. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  547. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  548. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  549. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  550. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  551. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  552. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  553. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  554. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  555. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  556. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  557. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  558. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  559. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  560. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  561. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  562. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  563. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  564. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  565. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  566. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  567. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  568. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  569. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  570. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  571. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  572. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  573. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  574. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  575. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  576. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  577. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  578. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  579. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  580. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  581. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  582. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  586. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  587. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  588. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  589. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  590. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  591. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  592. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  593. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  594. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  595. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  596. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  597. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  598. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  599. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  600. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  601. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  602. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  603. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  604. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  605. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  606. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  607. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  608. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  609. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  610. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  611. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  612. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  613. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  614. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  615. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  616. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  617. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  618. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  619. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  620. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  621. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  622. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  623. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  624. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  625. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  626. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  627. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  628. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  629. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  630. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  631. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  632. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  633. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  634. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  635. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  636. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  637. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  638. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  639. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  640. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  641. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  642. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  643. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  644. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  645. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  646. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  647. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  648. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  649. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  650. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  651. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  652. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  653. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  654. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  655. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  656. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  657. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  658. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  659. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  660. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  661. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  662. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  663. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  664. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  665. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  666. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  667. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  668. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  669. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  670. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  671. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  672. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  673. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  674. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  675. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  676. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  677. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  678. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  679. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  680. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  681. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  682. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  683. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  684. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  685. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  686. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  687. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  688. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  689. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  690. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  691. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  692. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  693. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  694. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  695. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  696. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  697. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  698. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  699. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  700. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  701. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  702. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  703. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  704. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  705. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  706. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  707. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  708. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  709. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  710. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  711. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  712. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  713. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  714. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  715. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  716. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  717. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  718. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  719. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  720. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  721. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  722. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  723. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  724. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  725. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  726. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  727. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  728. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  729. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  730. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  731. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  732. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  733. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  734. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  741. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  742. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  743. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  744. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  745. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  746. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  747. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  748. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  749. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  750. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  751. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  752. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  753. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  754. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  755. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  756. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  757. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  758. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  759. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  760. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  761. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  762. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  763. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  764. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  765. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  766. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  767. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  768. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  769. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  770. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  771. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  772. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  773. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  774. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  775. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  776. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  777. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  778. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  779. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  780. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  786. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  787. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  788. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  789. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  790. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  791. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  792. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  793. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  794. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  795. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  796. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  797. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  798. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  799. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  802. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  803. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  804. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  805. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  806. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  807. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  808. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  809. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  810. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  811. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  812. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  813. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  814. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  815. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  816. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  817. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  818. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  821. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  822. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  823. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  824. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  825. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  826. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  827. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  828. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  829. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  830. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  831. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  832. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  833. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  834. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  835. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  836. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  837. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  838. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  839. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  840. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  841. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  842. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  843. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  844. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  845. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  846. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  847. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  848. package/deps/rocksdb/rocksdb.gyp +425 -446
  849. package/package.json +8 -8
  850. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  851. package/prebuilds/darwin-x86/node.napi.node +0 -0
  852. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  853. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  854. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  855. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  856. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  857. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  858. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  859. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  860. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  861. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  862. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  863. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  864. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  865. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  866. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  867. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  868. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  869. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  870. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  871. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  872. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  873. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  874. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  904. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  905. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  906. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  907. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  908. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  909. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -10,18 +10,31 @@
10
10
  #include "rocksdb/filter_policy.h"
11
11
 
12
12
  #include <array>
13
+ #include <climits>
14
+ #include <cstring>
13
15
  #include <deque>
14
16
  #include <limits>
15
-
17
+ #include <memory>
18
+
19
+ #include "cache/cache_entry_roles.h"
20
+ #include "cache/cache_reservation_manager.h"
21
+ #include "logging/logging.h"
22
+ #include "port/lang.h"
23
+ #include "rocksdb/convenience.h"
24
+ #include "rocksdb/rocksdb_namespace.h"
16
25
  #include "rocksdb/slice.h"
26
+ #include "rocksdb/utilities/object_registry.h"
17
27
  #include "table/block_based/block_based_filter_block.h"
28
+ #include "table/block_based/block_based_table_reader.h"
18
29
  #include "table/block_based/filter_policy_internal.h"
19
30
  #include "table/block_based/full_filter_block.h"
20
- #include "third-party/folly/folly/ConstexprMath.h"
21
31
  #include "util/bloom_impl.h"
22
32
  #include "util/coding.h"
23
33
  #include "util/hash.h"
34
+ #include "util/math.h"
35
+ #include "util/ribbon_config.h"
24
36
  #include "util/ribbon_impl.h"
37
+ #include "util/string_util.h"
25
38
 
26
39
  namespace ROCKSDB_NAMESPACE {
27
40
 
@@ -41,15 +54,24 @@ Slice FinishAlwaysFalse(std::unique_ptr<const char[]>* /*buf*/) {
41
54
  return Slice(nullptr, 0);
42
55
  }
43
56
 
57
+ Slice FinishAlwaysTrue(std::unique_ptr<const char[]>* /*buf*/) {
58
+ return Slice("\0\0\0\0\0\0", 6);
59
+ }
60
+
44
61
  // Base class for filter builders using the XXH3 preview hash,
45
62
  // also known as Hash64 or GetSliceHash64.
46
- class XXH3pFilterBitsBuilder : public BuiltinFilterBitsBuilder {
63
+ class XXPH3FilterBitsBuilder : public BuiltinFilterBitsBuilder {
47
64
  public:
48
- explicit XXH3pFilterBitsBuilder(
49
- std::atomic<int64_t>* aggregate_rounding_balance)
50
- : aggregate_rounding_balance_(aggregate_rounding_balance) {}
65
+ explicit XXPH3FilterBitsBuilder(
66
+ std::atomic<int64_t>* aggregate_rounding_balance,
67
+ std::shared_ptr<CacheReservationManager> cache_res_mgr,
68
+ bool detect_filter_construct_corruption)
69
+ : aggregate_rounding_balance_(aggregate_rounding_balance),
70
+ cache_res_mgr_(cache_res_mgr),
71
+ detect_filter_construct_corruption_(
72
+ detect_filter_construct_corruption) {}
51
73
 
52
- ~XXH3pFilterBitsBuilder() override {}
74
+ ~XXPH3FilterBitsBuilder() override {}
53
75
 
54
76
  virtual void AddKey(const Slice& key) override {
55
77
  uint64_t hash = GetSliceHash64(key);
@@ -57,19 +79,50 @@ class XXH3pFilterBitsBuilder : public BuiltinFilterBitsBuilder {
57
79
  // though only adjacent repetition, which we want to immediately
58
80
  // recognize and collapse for estimating true filter space
59
81
  // requirements.
60
- if (hash_entries_.empty() || hash != hash_entries_.back()) {
61
- hash_entries_.push_back(hash);
82
+ if (hash_entries_info_.entries.empty() ||
83
+ hash != hash_entries_info_.entries.back()) {
84
+ if (detect_filter_construct_corruption_) {
85
+ hash_entries_info_.xor_checksum ^= hash;
86
+ }
87
+ hash_entries_info_.entries.push_back(hash);
88
+ if (cache_res_mgr_ &&
89
+ // Traditional rounding to whole bucket size
90
+ ((hash_entries_info_.entries.size() %
91
+ kUint64tHashEntryCacheResBucketSize) ==
92
+ kUint64tHashEntryCacheResBucketSize / 2)) {
93
+ hash_entries_info_.cache_res_bucket_handles.emplace_back(nullptr);
94
+ Status s = cache_res_mgr_->MakeCacheReservation(
95
+ kUint64tHashEntryCacheResBucketSize * sizeof(hash),
96
+ &hash_entries_info_.cache_res_bucket_handles.back());
97
+ s.PermitUncheckedError();
98
+ }
62
99
  }
63
100
  }
64
101
 
102
+ virtual size_t EstimateEntriesAdded() override {
103
+ return hash_entries_info_.entries.size();
104
+ }
105
+
106
+ virtual Status MaybePostVerify(const Slice& filter_content) override;
107
+
65
108
  protected:
66
109
  static constexpr uint32_t kMetadataLen = 5;
67
110
 
68
- // For delegating between XXH3pFilterBitsBuilders
69
- void SwapEntriesWith(XXH3pFilterBitsBuilder* other) {
70
- std::swap(hash_entries_, other->hash_entries_);
111
+ // Number of hash entries to accumulate before charging their memory usage to
112
+ // the cache when cache reservation is available
113
+ static const std::size_t kUint64tHashEntryCacheResBucketSize =
114
+ CacheReservationManagerImpl<
115
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
116
+ sizeof(uint64_t);
117
+
118
+ // For delegating between XXPH3FilterBitsBuilders
119
+ void SwapEntriesWith(XXPH3FilterBitsBuilder* other) {
120
+ assert(other != nullptr);
121
+ hash_entries_info_.Swap(&(other->hash_entries_info_));
71
122
  }
72
123
 
124
+ void ResetEntries() { hash_entries_info_.Reset(); }
125
+
73
126
  virtual size_t RoundDownUsableSpace(size_t available_size) = 0;
74
127
 
75
128
  // To choose size using malloc_usable_size, we have to actually allocate.
@@ -130,7 +183,7 @@ class XXH3pFilterBitsBuilder : public BuiltinFilterBitsBuilder {
130
183
  // Filter blocks are loaded into block cache with their block trailer.
131
184
  // We need to make sure that's accounted for in choosing a
132
185
  // fragmentation-friendly size.
133
- const size_t kExtraPadding = kBlockTrailerSize;
186
+ const size_t kExtraPadding = BlockBasedTable::kBlockTrailerSize;
134
187
  size_t requested = rv + kExtraPadding;
135
188
 
136
189
  // Allocate and get usable size
@@ -170,26 +223,95 @@ class XXH3pFilterBitsBuilder : public BuiltinFilterBitsBuilder {
170
223
  return rv;
171
224
  }
172
225
 
173
- // A deque avoids unnecessary copying of already-saved values
174
- // and has near-minimal peak memory use.
175
- std::deque<uint64_t> hash_entries_;
226
+ // TODO: Ideally we want to verify the hash entry
227
+ // as it is added to the filter and eliminate this function
228
+ // for speeding up and leaving fewer spaces for undetected memory/CPU
229
+ // corruption. For Ribbon Filter, it's bit harder.
230
+ // Possible solution:
231
+ // pass a custom iterator that tracks the xor checksum as
232
+ // it iterates to ResetAndFindSeedToSolve
233
+ Status MaybeVerifyHashEntriesChecksum() {
234
+ if (!detect_filter_construct_corruption_) {
235
+ return Status::OK();
236
+ }
237
+
238
+ uint64_t actual_hash_entries_xor_checksum = 0;
239
+ for (uint64_t h : hash_entries_info_.entries) {
240
+ actual_hash_entries_xor_checksum ^= h;
241
+ }
242
+
243
+ if (actual_hash_entries_xor_checksum == hash_entries_info_.xor_checksum) {
244
+ return Status::OK();
245
+ } else {
246
+ // Since these hash entries are corrupted and they will not be used
247
+ // anymore, we can reset them and release memory.
248
+ ResetEntries();
249
+ return Status::Corruption("Filter's hash entries checksum mismatched");
250
+ }
251
+ }
176
252
 
177
253
  // See BloomFilterPolicy::aggregate_rounding_balance_. If nullptr,
178
254
  // always "round up" like historic behavior.
179
255
  std::atomic<int64_t>* aggregate_rounding_balance_;
256
+
257
+ // For reserving memory used in (new) Bloom and Ribbon Filter construction
258
+ std::shared_ptr<CacheReservationManager> cache_res_mgr_;
259
+
260
+ // For managing cache reservation for final filter in (new) Bloom and Ribbon
261
+ // Filter construction
262
+ std::deque<std::unique_ptr<CacheReservationManager::CacheReservationHandle>>
263
+ final_filter_cache_res_handles_;
264
+
265
+ bool detect_filter_construct_corruption_;
266
+
267
+ struct HashEntriesInfo {
268
+ // A deque avoids unnecessary copying of already-saved values
269
+ // and has near-minimal peak memory use.
270
+ std::deque<uint64_t> entries;
271
+
272
+ // If cache_res_mgr_ != nullptr,
273
+ // it manages cache reservation for buckets of hash entries in (new) Bloom
274
+ // or Ribbon Filter construction.
275
+ // Otherwise, it is empty.
276
+ std::deque<std::unique_ptr<CacheReservationManager::CacheReservationHandle>>
277
+ cache_res_bucket_handles;
278
+
279
+ // If detect_filter_construct_corruption_ == true,
280
+ // it records the xor checksum of hash entries.
281
+ // Otherwise, it is 0.
282
+ uint64_t xor_checksum = 0;
283
+
284
+ void Swap(HashEntriesInfo* other) {
285
+ assert(other != nullptr);
286
+ std::swap(entries, other->entries);
287
+ std::swap(cache_res_bucket_handles, other->cache_res_bucket_handles);
288
+ std::swap(xor_checksum, other->xor_checksum);
289
+ }
290
+
291
+ void Reset() {
292
+ entries.clear();
293
+ cache_res_bucket_handles.clear();
294
+ xor_checksum = 0;
295
+ }
296
+ };
297
+
298
+ HashEntriesInfo hash_entries_info_;
180
299
  };
181
300
 
182
301
  // #################### FastLocalBloom implementation ################## //
183
302
  // ############## also known as format_version=5 Bloom filter ########## //
184
303
 
185
304
  // See description in FastLocalBloomImpl
186
- class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
305
+ class FastLocalBloomBitsBuilder : public XXPH3FilterBitsBuilder {
187
306
  public:
188
307
  // Non-null aggregate_rounding_balance implies optimize_filters_for_memory
189
308
  explicit FastLocalBloomBitsBuilder(
190
309
  const int millibits_per_key,
191
- std::atomic<int64_t>* aggregate_rounding_balance)
192
- : XXH3pFilterBitsBuilder(aggregate_rounding_balance),
310
+ std::atomic<int64_t>* aggregate_rounding_balance,
311
+ std::shared_ptr<CacheReservationManager> cache_res_mgr,
312
+ bool detect_filter_construct_corruption)
313
+ : XXPH3FilterBitsBuilder(aggregate_rounding_balance, cache_res_mgr,
314
+ detect_filter_construct_corruption),
193
315
  millibits_per_key_(millibits_per_key) {
194
316
  assert(millibits_per_key >= 1000);
195
317
  }
@@ -200,13 +322,28 @@ class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
200
322
 
201
323
  ~FastLocalBloomBitsBuilder() override {}
202
324
 
325
+ using FilterBitsBuilder::Finish;
326
+
203
327
  virtual Slice Finish(std::unique_ptr<const char[]>* buf) override {
204
- size_t num_entries = hash_entries_.size();
328
+ return Finish(buf, nullptr);
329
+ }
330
+
331
+ virtual Slice Finish(std::unique_ptr<const char[]>* buf,
332
+ Status* status) override {
333
+ size_t num_entries = hash_entries_info_.entries.size();
205
334
  size_t len_with_metadata = CalculateSpace(num_entries);
206
335
 
207
336
  std::unique_ptr<char[]> mutable_buf;
337
+ std::unique_ptr<CacheReservationManager::CacheReservationHandle>
338
+ final_filter_cache_res_handle;
208
339
  len_with_metadata =
209
340
  AllocateMaybeRounding(len_with_metadata, num_entries, &mutable_buf);
341
+ // Cache reservation for mutable_buf
342
+ if (cache_res_mgr_) {
343
+ Status s = cache_res_mgr_->MakeCacheReservation(
344
+ len_with_metadata * sizeof(char), &final_filter_cache_res_handle);
345
+ s.PermitUncheckedError();
346
+ }
210
347
 
211
348
  assert(mutable_buf);
212
349
  assert(len_with_metadata >= kMetadataLen);
@@ -219,10 +356,25 @@ class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
219
356
 
220
357
  uint32_t len = static_cast<uint32_t>(len_with_metadata - kMetadataLen);
221
358
  if (len > 0) {
359
+ TEST_SYNC_POINT_CALLBACK(
360
+ "XXPH3FilterBitsBuilder::Finish::"
361
+ "TamperHashEntries",
362
+ &hash_entries_info_.entries);
222
363
  AddAllEntries(mutable_buf.get(), len, num_probes);
364
+ Status verify_hash_entries_checksum_status =
365
+ MaybeVerifyHashEntriesChecksum();
366
+ if (!verify_hash_entries_checksum_status.ok()) {
367
+ if (status) {
368
+ *status = verify_hash_entries_checksum_status;
369
+ }
370
+ return FinishAlwaysTrue(buf);
371
+ }
223
372
  }
224
373
 
225
- assert(hash_entries_.empty());
374
+ bool keep_entries_for_postverify = detect_filter_construct_corruption_;
375
+ if (!keep_entries_for_postverify) {
376
+ ResetEntries();
377
+ }
226
378
 
227
379
  // See BloomFilterPolicy::GetBloomBitsReader re: metadata
228
380
  // -1 = Marker for newer Bloom implementations
@@ -233,8 +385,18 @@ class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
233
385
  mutable_buf[len + 2] = static_cast<char>(num_probes);
234
386
  // rest of metadata stays zero
235
387
 
388
+ auto TEST_arg_pair __attribute__((__unused__)) =
389
+ std::make_pair(&mutable_buf, len_with_metadata);
390
+ TEST_SYNC_POINT_CALLBACK("XXPH3FilterBitsBuilder::Finish::TamperFilter",
391
+ &TEST_arg_pair);
392
+
236
393
  Slice rv(mutable_buf.get(), len_with_metadata);
237
394
  *buf = std::move(mutable_buf);
395
+ final_filter_cache_res_handles_.push_back(
396
+ std::move(final_filter_cache_res_handle));
397
+ if (status) {
398
+ *status = Status::OK();
399
+ }
238
400
  return rv;
239
401
  }
240
402
 
@@ -301,12 +463,12 @@ class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
301
463
  void AddAllEntries(char* data, uint32_t len, int num_probes) {
302
464
  // Simple version without prefetching:
303
465
  //
304
- // for (auto h : hash_entries_) {
466
+ // for (auto h : hash_entries_info_.entries) {
305
467
  // FastLocalBloomImpl::AddHash(Lower32of64(h), Upper32of64(h), len,
306
468
  // num_probes, data);
307
469
  // }
308
470
 
309
- const size_t num_entries = hash_entries_.size();
471
+ const size_t num_entries = hash_entries_info_.entries.size();
310
472
  constexpr size_t kBufferMask = 7;
311
473
  static_assert(((kBufferMask + 1) & kBufferMask) == 0,
312
474
  "Must be power of 2 minus 1");
@@ -316,12 +478,14 @@ class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
316
478
 
317
479
  // Prime the buffer
318
480
  size_t i = 0;
481
+ std::deque<uint64_t>::iterator hash_entries_it =
482
+ hash_entries_info_.entries.begin();
319
483
  for (; i <= kBufferMask && i < num_entries; ++i) {
320
- uint64_t h = hash_entries_.front();
321
- hash_entries_.pop_front();
484
+ uint64_t h = *hash_entries_it;
322
485
  FastLocalBloomImpl::PrepareHash(Lower32of64(h), len, data,
323
486
  /*out*/ &byte_offsets[i]);
324
487
  hashes[i] = Upper32of64(h);
488
+ ++hash_entries_it;
325
489
  }
326
490
 
327
491
  // Process and buffer
@@ -332,11 +496,11 @@ class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
332
496
  FastLocalBloomImpl::AddHashPrepared(hash_ref, num_probes,
333
497
  data + byte_offset_ref);
334
498
  // And buffer
335
- uint64_t h = hash_entries_.front();
336
- hash_entries_.pop_front();
499
+ uint64_t h = *hash_entries_it;
337
500
  FastLocalBloomImpl::PrepareHash(Lower32of64(h), len, data,
338
501
  /*out*/ &byte_offset_ref);
339
502
  hash_ref = Upper32of64(h);
503
+ ++hash_entries_it;
340
504
  }
341
505
 
342
506
  // Finish processing
@@ -351,7 +515,7 @@ class FastLocalBloomBitsBuilder : public XXH3pFilterBitsBuilder {
351
515
  };
352
516
 
353
517
  // See description in FastLocalBloomImpl
354
- class FastLocalBloomBitsReader : public FilterBitsReader {
518
+ class FastLocalBloomBitsReader : public BuiltinFilterBitsReader {
355
519
  public:
356
520
  FastLocalBloomBitsReader(const char* data, int num_probes, uint32_t len_bytes)
357
521
  : data_(data), num_probes_(num_probes), len_bytes_(len_bytes) {}
@@ -386,6 +550,11 @@ class FastLocalBloomBitsReader : public FilterBitsReader {
386
550
  }
387
551
  }
388
552
 
553
+ bool HashMayMatch(const uint64_t h) override {
554
+ return FastLocalBloomImpl::HashMayMatch(Lower32of64(h), Upper32of64(h),
555
+ len_bytes_, num_probes_, data_);
556
+ }
557
+
389
558
  private:
390
559
  const char* data_;
391
560
  const int num_probes_;
@@ -399,6 +568,7 @@ struct Standard128RibbonRehasherTypesAndSettings {
399
568
  // These are schema-critical. Any change almost certainly changes
400
569
  // underlying data.
401
570
  static constexpr bool kIsFilter = true;
571
+ static constexpr bool kHomogeneous = false;
402
572
  static constexpr bool kFirstCoeffAlwaysOne = true;
403
573
  static constexpr bool kUseSmash = false;
404
574
  using CoeffRow = ROCKSDB_NAMESPACE::Unsigned128;
@@ -415,15 +585,19 @@ struct Standard128RibbonRehasherTypesAndSettings {
415
585
  using Standard128RibbonTypesAndSettings =
416
586
  ribbon::StandardRehasherAdapter<Standard128RibbonRehasherTypesAndSettings>;
417
587
 
418
- class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
588
+ class Standard128RibbonBitsBuilder : public XXPH3FilterBitsBuilder {
419
589
  public:
420
590
  explicit Standard128RibbonBitsBuilder(
421
591
  double desired_one_in_fp_rate, int bloom_millibits_per_key,
422
- std::atomic<int64_t>* aggregate_rounding_balance, Logger* info_log)
423
- : XXH3pFilterBitsBuilder(aggregate_rounding_balance),
592
+ std::atomic<int64_t>* aggregate_rounding_balance,
593
+ std::shared_ptr<CacheReservationManager> cache_res_mgr,
594
+ bool detect_filter_construct_corruption, Logger* info_log)
595
+ : XXPH3FilterBitsBuilder(aggregate_rounding_balance, cache_res_mgr,
596
+ detect_filter_construct_corruption),
424
597
  desired_one_in_fp_rate_(desired_one_in_fp_rate),
425
598
  info_log_(info_log),
426
- bloom_fallback_(bloom_millibits_per_key, aggregate_rounding_balance) {
599
+ bloom_fallback_(bloom_millibits_per_key, aggregate_rounding_balance,
600
+ cache_res_mgr, detect_filter_construct_corruption) {
427
601
  assert(desired_one_in_fp_rate >= 1.0);
428
602
  }
429
603
 
@@ -433,20 +607,32 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
433
607
 
434
608
  ~Standard128RibbonBitsBuilder() override {}
435
609
 
610
+ using FilterBitsBuilder::Finish;
611
+
436
612
  virtual Slice Finish(std::unique_ptr<const char[]>* buf) override {
437
- if (hash_entries_.size() > kMaxRibbonEntries) {
438
- ROCKS_LOG_WARN(info_log_, "Too many keys for Ribbon filter: %llu",
439
- static_cast<unsigned long long>(hash_entries_.size()));
613
+ return Finish(buf, nullptr);
614
+ }
615
+
616
+ virtual Slice Finish(std::unique_ptr<const char[]>* buf,
617
+ Status* status) override {
618
+ if (hash_entries_info_.entries.size() > kMaxRibbonEntries) {
619
+ ROCKS_LOG_WARN(
620
+ info_log_, "Too many keys for Ribbon filter: %llu",
621
+ static_cast<unsigned long long>(hash_entries_info_.entries.size()));
440
622
  SwapEntriesWith(&bloom_fallback_);
441
- assert(hash_entries_.empty());
442
- return bloom_fallback_.Finish(buf);
623
+ assert(hash_entries_info_.entries.empty());
624
+ return bloom_fallback_.Finish(buf, status);
443
625
  }
444
- if (hash_entries_.size() == 0) {
626
+ if (hash_entries_info_.entries.size() == 0) {
445
627
  // Save a conditional in Ribbon queries by using alternate reader
446
628
  // for zero entries added.
629
+ if (status) {
630
+ *status = Status::OK();
631
+ }
447
632
  return FinishAlwaysFalse(buf);
448
633
  }
449
- uint32_t num_entries = static_cast<uint32_t>(hash_entries_.size());
634
+ uint32_t num_entries =
635
+ static_cast<uint32_t>(hash_entries_info_.entries.size());
450
636
  uint32_t num_slots;
451
637
  size_t len_with_metadata;
452
638
 
@@ -455,36 +641,88 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
455
641
  // Bloom fall-back indicator
456
642
  if (num_slots == 0) {
457
643
  SwapEntriesWith(&bloom_fallback_);
458
- assert(hash_entries_.empty());
459
- return bloom_fallback_.Finish(buf);
644
+ assert(hash_entries_info_.entries.empty());
645
+ return bloom_fallback_.Finish(buf, status);
460
646
  }
461
647
 
462
648
  uint32_t entropy = 0;
463
- if (!hash_entries_.empty()) {
464
- entropy = Lower32of64(hash_entries_.front());
649
+ if (!hash_entries_info_.entries.empty()) {
650
+ entropy = Lower32of64(hash_entries_info_.entries.front());
465
651
  }
466
652
 
467
653
  BandingType banding;
654
+ std::size_t bytes_banding = ribbon::StandardBanding<
655
+ Standard128RibbonTypesAndSettings>::EstimateMemoryUsage(num_slots);
656
+ Status status_banding_cache_res = Status::OK();
657
+
658
+ // Cache reservation for banding
659
+ std::unique_ptr<CacheReservationManager::CacheReservationHandle>
660
+ banding_res_handle;
661
+ if (cache_res_mgr_) {
662
+ status_banding_cache_res = cache_res_mgr_->MakeCacheReservation(
663
+ bytes_banding, &banding_res_handle);
664
+ }
665
+
666
+ if (status_banding_cache_res.IsIncomplete()) {
667
+ ROCKS_LOG_WARN(info_log_,
668
+ "Cache reservation for Ribbon filter banding failed due "
669
+ "to cache full");
670
+ SwapEntriesWith(&bloom_fallback_);
671
+ assert(hash_entries_info_.entries.empty());
672
+ // Release cache for banding since the banding won't be allocated
673
+ banding_res_handle.reset();
674
+ return bloom_fallback_.Finish(buf, status);
675
+ }
676
+
677
+ TEST_SYNC_POINT_CALLBACK(
678
+ "XXPH3FilterBitsBuilder::Finish::"
679
+ "TamperHashEntries",
680
+ &hash_entries_info_.entries);
681
+
468
682
  bool success = banding.ResetAndFindSeedToSolve(
469
- num_slots, hash_entries_.begin(), hash_entries_.end(),
683
+ num_slots, hash_entries_info_.entries.begin(),
684
+ hash_entries_info_.entries.end(),
470
685
  /*starting seed*/ entropy & 255, /*seed mask*/ 255);
471
686
  if (!success) {
472
- ROCKS_LOG_WARN(info_log_,
473
- "Too many re-seeds (256) for Ribbon filter, %llu / %llu",
474
- static_cast<unsigned long long>(hash_entries_.size()),
475
- static_cast<unsigned long long>(num_slots));
687
+ ROCKS_LOG_WARN(
688
+ info_log_, "Too many re-seeds (256) for Ribbon filter, %llu / %llu",
689
+ static_cast<unsigned long long>(hash_entries_info_.entries.size()),
690
+ static_cast<unsigned long long>(num_slots));
476
691
  SwapEntriesWith(&bloom_fallback_);
477
- assert(hash_entries_.empty());
478
- return bloom_fallback_.Finish(buf);
692
+ assert(hash_entries_info_.entries.empty());
693
+ return bloom_fallback_.Finish(buf, status);
694
+ }
695
+
696
+ Status verify_hash_entries_checksum_status =
697
+ MaybeVerifyHashEntriesChecksum();
698
+ if (!verify_hash_entries_checksum_status.ok()) {
699
+ ROCKS_LOG_WARN(info_log_, "Verify hash entries checksum error: %s",
700
+ verify_hash_entries_checksum_status.getState());
701
+ if (status) {
702
+ *status = verify_hash_entries_checksum_status;
703
+ }
704
+ return FinishAlwaysTrue(buf);
705
+ }
706
+
707
+ bool keep_entries_for_postverify = detect_filter_construct_corruption_;
708
+ if (!keep_entries_for_postverify) {
709
+ ResetEntries();
479
710
  }
480
- hash_entries_.clear();
481
711
 
482
712
  uint32_t seed = banding.GetOrdinalSeed();
483
713
  assert(seed < 256);
484
714
 
485
715
  std::unique_ptr<char[]> mutable_buf;
716
+ std::unique_ptr<CacheReservationManager::CacheReservationHandle>
717
+ final_filter_cache_res_handle;
486
718
  len_with_metadata =
487
719
  AllocateMaybeRounding(len_with_metadata, num_entries, &mutable_buf);
720
+ // Cache reservation for mutable_buf
721
+ if (cache_res_mgr_) {
722
+ Status s = cache_res_mgr_->MakeCacheReservation(
723
+ len_with_metadata * sizeof(char), &final_filter_cache_res_handle);
724
+ s.PermitUncheckedError();
725
+ }
488
726
 
489
727
  SolnType soln(mutable_buf.get(), len_with_metadata);
490
728
  soln.BackSubstFrom(banding);
@@ -510,8 +748,18 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
510
748
  mutable_buf[len_with_metadata - 1] =
511
749
  static_cast<char>((num_blocks >> 16) & 255);
512
750
 
751
+ auto TEST_arg_pair __attribute__((__unused__)) =
752
+ std::make_pair(&mutable_buf, len_with_metadata);
753
+ TEST_SYNC_POINT_CALLBACK("XXPH3FilterBitsBuilder::Finish::TamperFilter",
754
+ &TEST_arg_pair);
755
+
513
756
  Slice rv(mutable_buf.get(), len_with_metadata);
514
757
  *buf = std::move(mutable_buf);
758
+ final_filter_cache_res_handles_.push_back(
759
+ std::move(final_filter_cache_res_handle));
760
+ if (status) {
761
+ *status = Status::OK();
762
+ }
515
763
  return rv;
516
764
  }
517
765
 
@@ -528,8 +776,8 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
528
776
  return;
529
777
  }
530
778
  uint32_t entropy = 0;
531
- if (!hash_entries_.empty()) {
532
- entropy = Upper32of64(hash_entries_.front());
779
+ if (!hash_entries_info_.entries.empty()) {
780
+ entropy = Upper32of64(hash_entries_info_.entries.front());
533
781
  }
534
782
 
535
783
  *num_slots = NumEntriesToNumSlots(static_cast<uint32_t>(num_entries));
@@ -598,8 +846,7 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
598
846
 
599
847
  // Let's not bother accounting for overflow to Bloom filter
600
848
  // (Includes NaN case)
601
- if (!(max_slots <
602
- BandingType::GetNumSlotsFor95PctSuccess(kMaxRibbonEntries))) {
849
+ if (!(max_slots < ConfigHelper::GetNumSlots(kMaxRibbonEntries))) {
603
850
  return kMaxRibbonEntries;
604
851
  }
605
852
 
@@ -628,12 +875,7 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
628
875
  slots = SolnType::RoundDownNumSlots(slots - 1);
629
876
  }
630
877
 
631
- // Using slots instead of entries to get overhead factor estimate
632
- double f = BandingType::GetFactorFor95PctSuccess(slots);
633
- uint32_t num_entries = static_cast<uint32_t>(slots / f);
634
- // Improve precision with another round
635
- f = BandingType::GetFactorFor95PctSuccess(num_entries);
636
- num_entries = static_cast<uint32_t>(slots / f + 0.999999999);
878
+ uint32_t num_entries = ConfigHelper::GetNumToAdd(slots);
637
879
 
638
880
  // Consider possible Bloom fallback for small filters
639
881
  if (slots < 1024) {
@@ -661,6 +903,12 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
661
903
  return fake_soln.ExpectedFpRate();
662
904
  }
663
905
 
906
+ Status MaybePostVerify(const Slice& filter_content) override {
907
+ bool fall_back = (bloom_fallback_.EstimateEntriesAdded() > 0);
908
+ return fall_back ? bloom_fallback_.MaybePostVerify(filter_content)
909
+ : XXPH3FilterBitsBuilder::MaybePostVerify(filter_content);
910
+ }
911
+
664
912
  protected:
665
913
  size_t RoundDownUsableSpace(size_t available_size) override {
666
914
  size_t rv = available_size - kMetadataLen;
@@ -675,9 +923,10 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
675
923
  using TS = Standard128RibbonTypesAndSettings;
676
924
  using SolnType = ribbon::SerializableInterleavedSolution<TS>;
677
925
  using BandingType = ribbon::StandardBanding<TS>;
926
+ using ConfigHelper = ribbon::BandingConfigHelper1TS<ribbon::kOneIn20, TS>;
678
927
 
679
928
  static uint32_t NumEntriesToNumSlots(uint32_t num_entries) {
680
- uint32_t num_slots1 = BandingType::GetNumSlotsFor95PctSuccess(num_entries);
929
+ uint32_t num_slots1 = ConfigHelper::GetNumSlots(num_entries);
681
930
  return SolnType::RoundUpNumSlots(num_slots1);
682
931
  }
683
932
 
@@ -704,7 +953,7 @@ class Standard128RibbonBitsBuilder : public XXH3pFilterBitsBuilder {
704
953
  // for the linker, at least with DEBUG_LEVEL=2
705
954
  constexpr uint32_t Standard128RibbonBitsBuilder::kMaxRibbonEntries;
706
955
 
707
- class Standard128RibbonBitsReader : public FilterBitsReader {
956
+ class Standard128RibbonBitsReader : public BuiltinFilterBitsReader {
708
957
  public:
709
958
  Standard128RibbonBitsReader(const char* data, size_t len_bytes,
710
959
  uint32_t num_blocks, uint32_t seed)
@@ -725,16 +974,29 @@ class Standard128RibbonBitsReader : public FilterBitsReader {
725
974
  }
726
975
 
727
976
  virtual void MayMatch(int num_keys, Slice** keys, bool* may_match) override {
728
- std::array<uint64_t, MultiGetContext::MAX_BATCH_SIZE> hashes;
977
+ struct SavedData {
978
+ uint64_t seeded_hash;
979
+ uint32_t segment_num;
980
+ uint32_t num_columns;
981
+ uint32_t start_bits;
982
+ };
983
+ std::array<SavedData, MultiGetContext::MAX_BATCH_SIZE> saved;
729
984
  for (int i = 0; i < num_keys; ++i) {
730
- hashes[i] = GetSliceHash64(*keys[i]);
731
- // FIXME: batched get optimization
985
+ ribbon::InterleavedPrepareQuery(
986
+ GetSliceHash64(*keys[i]), hasher_, soln_, &saved[i].seeded_hash,
987
+ &saved[i].segment_num, &saved[i].num_columns, &saved[i].start_bits);
732
988
  }
733
989
  for (int i = 0; i < num_keys; ++i) {
734
- may_match[i] = soln_.FilterQuery(hashes[i], hasher_);
990
+ may_match[i] = ribbon::InterleavedFilterQuery(
991
+ saved[i].seeded_hash, saved[i].segment_num, saved[i].num_columns,
992
+ saved[i].start_bits, hasher_, soln_);
735
993
  }
736
994
  }
737
995
 
996
+ bool HashMayMatch(const uint64_t h) override {
997
+ return soln_.FilterQuery(h, hasher_);
998
+ }
999
+
738
1000
  private:
739
1001
  using TS = Standard128RibbonTypesAndSettings;
740
1002
  ribbon::SerializableInterleavedSolution<TS> soln_;
@@ -757,6 +1019,12 @@ class LegacyBloomBitsBuilder : public BuiltinFilterBitsBuilder {
757
1019
 
758
1020
  void AddKey(const Slice& key) override;
759
1021
 
1022
+ virtual size_t EstimateEntriesAdded() override {
1023
+ return hash_entries_.size();
1024
+ }
1025
+
1026
+ using FilterBitsBuilder::Finish;
1027
+
760
1028
  Slice Finish(std::unique_ptr<const char[]>* buf) override;
761
1029
 
762
1030
  size_t CalculateSpace(size_t num_entries) override {
@@ -935,10 +1203,10 @@ inline void LegacyBloomBitsBuilder::AddHash(uint32_t h, char* data,
935
1203
  assert(num_lines > 0 && total_bits > 0);
936
1204
 
937
1205
  LegacyBloomImpl::AddHash(h, num_lines, num_probes_, data,
938
- folly::constexpr_log2(CACHE_LINE_SIZE));
1206
+ ConstexprFloorLog2(CACHE_LINE_SIZE));
939
1207
  }
940
1208
 
941
- class LegacyBloomBitsReader : public FilterBitsReader {
1209
+ class LegacyBloomBitsReader : public BuiltinFilterBitsReader {
942
1210
  public:
943
1211
  LegacyBloomBitsReader(const char* data, int num_probes, uint32_t num_lines,
944
1212
  uint32_t log2_cache_line_size)
@@ -983,6 +1251,8 @@ class LegacyBloomBitsReader : public FilterBitsReader {
983
1251
  }
984
1252
  }
985
1253
 
1254
+ bool HashMayMatch(const uint64_t /* h */) override { return false; }
1255
+
986
1256
  private:
987
1257
  const char* data_;
988
1258
  const int num_probes_;
@@ -990,37 +1260,79 @@ class LegacyBloomBitsReader : public FilterBitsReader {
990
1260
  const uint32_t log2_cache_line_size_;
991
1261
  };
992
1262
 
993
- class AlwaysTrueFilter : public FilterBitsReader {
1263
+ class AlwaysTrueFilter : public BuiltinFilterBitsReader {
994
1264
  public:
995
1265
  bool MayMatch(const Slice&) override { return true; }
996
1266
  using FilterBitsReader::MayMatch; // inherit overload
1267
+ bool HashMayMatch(const uint64_t) override { return true; }
1268
+ using BuiltinFilterBitsReader::HashMayMatch; // inherit overload
997
1269
  };
998
1270
 
999
- class AlwaysFalseFilter : public FilterBitsReader {
1271
+ class AlwaysFalseFilter : public BuiltinFilterBitsReader {
1000
1272
  public:
1001
1273
  bool MayMatch(const Slice&) override { return false; }
1002
1274
  using FilterBitsReader::MayMatch; // inherit overload
1275
+ bool HashMayMatch(const uint64_t) override { return false; }
1276
+ using BuiltinFilterBitsReader::HashMayMatch; // inherit overload
1003
1277
  };
1004
1278
 
1279
+ Status XXPH3FilterBitsBuilder::MaybePostVerify(const Slice& filter_content) {
1280
+ Status s = Status::OK();
1281
+
1282
+ if (!detect_filter_construct_corruption_) {
1283
+ return s;
1284
+ }
1285
+
1286
+ std::unique_ptr<BuiltinFilterBitsReader> bits_reader(
1287
+ BuiltinFilterPolicy::GetBuiltinFilterBitsReader(filter_content));
1288
+
1289
+ for (uint64_t h : hash_entries_info_.entries) {
1290
+ // The current approach will not detect corruption from XXPH3Filter to
1291
+ // AlwaysTrueFilter, which can lead to performance cost later due to
1292
+ // AlwaysTrueFilter not filtering anything. But this cost is acceptable
1293
+ // given the extra implementation complixity to detect such case.
1294
+ bool may_match = bits_reader->HashMayMatch(h);
1295
+ if (!may_match) {
1296
+ s = Status::Corruption("Corrupted filter content");
1297
+ break;
1298
+ }
1299
+ }
1300
+
1301
+ ResetEntries();
1302
+ return s;
1303
+ }
1005
1304
  } // namespace
1006
1305
 
1007
- const std::vector<BloomFilterPolicy::Mode> BloomFilterPolicy::kAllFixedImpls = {
1008
- kLegacyBloom,
1009
- kDeprecatedBlock,
1010
- kFastLocalBloom,
1011
- kStandard128Ribbon,
1012
- };
1306
+ const char* BuiltinFilterPolicy::kClassName() {
1307
+ return "rocksdb.internal.BuiltinFilter";
1308
+ }
1013
1309
 
1014
- const std::vector<BloomFilterPolicy::Mode> BloomFilterPolicy::kAllUserModes = {
1015
- kDeprecatedBlock,
1016
- kAutoBloom,
1017
- kStandard128Ribbon,
1018
- };
1310
+ bool BuiltinFilterPolicy::IsInstanceOf(const std::string& name) const {
1311
+ if (name == kClassName()) {
1312
+ return true;
1313
+ } else {
1314
+ return FilterPolicy::IsInstanceOf(name);
1315
+ }
1316
+ }
1317
+
1318
+ static const char* kBuiltinFilterMetadataName = "rocksdb.BuiltinBloomFilter";
1319
+
1320
+ const char* BuiltinFilterPolicy::kCompatibilityName() {
1321
+ return kBuiltinFilterMetadataName;
1322
+ }
1323
+
1324
+ const char* BuiltinFilterPolicy::CompatibilityName() const {
1325
+ return kBuiltinFilterMetadataName;
1326
+ }
1019
1327
 
1020
- BloomFilterPolicy::BloomFilterPolicy(double bits_per_key, Mode mode)
1021
- : mode_(mode), warned_(false), aggregate_rounding_balance_(0) {
1328
+ BloomLikeFilterPolicy::BloomLikeFilterPolicy(double bits_per_key)
1329
+ : warned_(false), aggregate_rounding_balance_(0) {
1022
1330
  // Sanitize bits_per_key
1023
- if (bits_per_key < 1.0) {
1331
+ if (bits_per_key < 0.5) {
1332
+ // Round down to no filter
1333
+ bits_per_key = 0;
1334
+ } else if (bits_per_key < 1.0) {
1335
+ // Minimum 1 bit per key (equiv) when creating filter
1024
1336
  bits_per_key = 1.0;
1025
1337
  } else if (!(bits_per_key < 100.0)) { // including NaN
1026
1338
  bits_per_key = 100.0;
@@ -1046,20 +1358,61 @@ BloomFilterPolicy::BloomFilterPolicy(double bits_per_key, Mode mode)
1046
1358
  whole_bits_per_key_ = (millibits_per_key_ + 500) / 1000;
1047
1359
  }
1048
1360
 
1049
- BloomFilterPolicy::~BloomFilterPolicy() {}
1361
+ BloomLikeFilterPolicy::~BloomLikeFilterPolicy() {}
1362
+ const char* BloomLikeFilterPolicy::kClassName() {
1363
+ return "rocksdb.internal.BloomLikeFilter";
1364
+ }
1365
+
1366
+ bool BloomLikeFilterPolicy::IsInstanceOf(const std::string& name) const {
1367
+ if (name == kClassName()) {
1368
+ return true;
1369
+ } else {
1370
+ return BuiltinFilterPolicy::IsInstanceOf(name);
1371
+ }
1372
+ }
1373
+
1374
+ const char* ReadOnlyBuiltinFilterPolicy::kClassName() {
1375
+ return kBuiltinFilterMetadataName;
1376
+ }
1377
+
1378
+ const char* DeprecatedBlockBasedBloomFilterPolicy::kClassName() {
1379
+ return "rocksdb.internal.DeprecatedBlockBasedBloomFilter";
1380
+ }
1050
1381
 
1051
- const char* BloomFilterPolicy::Name() const {
1052
- return "rocksdb.BuiltinBloomFilter";
1382
+ std::string BloomLikeFilterPolicy::GetId() const {
1383
+ return Name() + GetBitsPerKeySuffix();
1053
1384
  }
1054
1385
 
1055
- void BloomFilterPolicy::CreateFilter(const Slice* keys, int n,
1056
- std::string* dst) const {
1057
- // We should ideally only be using this deprecated interface for
1058
- // appropriately constructed BloomFilterPolicy
1059
- assert(mode_ == kDeprecatedBlock);
1386
+ DeprecatedBlockBasedBloomFilterPolicy::DeprecatedBlockBasedBloomFilterPolicy(
1387
+ double bits_per_key)
1388
+ : BloomLikeFilterPolicy(bits_per_key) {}
1389
+
1390
+ FilterBitsBuilder* DeprecatedBlockBasedBloomFilterPolicy::GetBuilderWithContext(
1391
+ const FilterBuildingContext&) const {
1392
+ if (GetWholeBitsPerKey() == 0) {
1393
+ // "No filter" special case
1394
+ return nullptr;
1395
+ }
1396
+ // Internal contract: returns a new fake builder that encodes bits per key
1397
+ // into a special value from EstimateEntriesAdded()
1398
+ struct B : public FilterBitsBuilder {
1399
+ explicit B(int bits_per_key) : est(kSecretBitsPerKeyStart + bits_per_key) {}
1400
+ size_t est;
1401
+ size_t EstimateEntriesAdded() override { return est; }
1402
+ void AddKey(const Slice&) override {}
1403
+ using FilterBitsBuilder::Finish; // FIXME
1404
+ Slice Finish(std::unique_ptr<const char[]>*) override { return Slice(); }
1405
+ size_t ApproximateNumEntries(size_t) override { return 0; }
1406
+ };
1407
+ return new B(GetWholeBitsPerKey());
1408
+ }
1060
1409
 
1410
+ void DeprecatedBlockBasedBloomFilterPolicy::CreateFilter(const Slice* keys,
1411
+ int n,
1412
+ int bits_per_key,
1413
+ std::string* dst) {
1061
1414
  // Compute bloom filter size (in both bits and bytes)
1062
- uint32_t bits = static_cast<uint32_t>(n * whole_bits_per_key_);
1415
+ uint32_t bits = static_cast<uint32_t>(n * bits_per_key);
1063
1416
 
1064
1417
  // For small n, we can see a very high false positive rate. Fix it
1065
1418
  // by enforcing a minimum bloom filter length.
@@ -1068,8 +1421,7 @@ void BloomFilterPolicy::CreateFilter(const Slice* keys, int n,
1068
1421
  uint32_t bytes = (bits + 7) / 8;
1069
1422
  bits = bytes * 8;
1070
1423
 
1071
- int num_probes =
1072
- LegacyNoLocalityBloomImpl::ChooseNumProbes(whole_bits_per_key_);
1424
+ int num_probes = LegacyNoLocalityBloomImpl::ChooseNumProbes(bits_per_key);
1073
1425
 
1074
1426
  const size_t init_size = dst->size();
1075
1427
  dst->resize(init_size + bytes, 0);
@@ -1081,8 +1433,8 @@ void BloomFilterPolicy::CreateFilter(const Slice* keys, int n,
1081
1433
  }
1082
1434
  }
1083
1435
 
1084
- bool BloomFilterPolicy::KeyMayMatch(const Slice& key,
1085
- const Slice& bloom_filter) const {
1436
+ bool DeprecatedBlockBasedBloomFilterPolicy::KeyMayMatch(
1437
+ const Slice& key, const Slice& bloom_filter) {
1086
1438
  const size_t len = bloom_filter.size();
1087
1439
  if (len < 2 || len > 0xffffffffU) {
1088
1440
  return false;
@@ -1104,70 +1456,110 @@ bool BloomFilterPolicy::KeyMayMatch(const Slice& key,
1104
1456
  array);
1105
1457
  }
1106
1458
 
1107
- FilterBitsBuilder* BloomFilterPolicy::GetFilterBitsBuilder() const {
1108
- // This code path should no longer be used, for the built-in
1109
- // BloomFilterPolicy. Internal to RocksDB and outside
1110
- // BloomFilterPolicy, only get a FilterBitsBuilder with
1111
- // BloomFilterPolicy::GetBuilderFromContext(), which will call
1112
- // BloomFilterPolicy::GetBuilderWithContext(). RocksDB users have
1113
- // been warned (HISTORY.md) that they can no longer call this on
1114
- // the built-in BloomFilterPolicy (unlikely).
1115
- assert(false);
1116
- return GetBuilderWithContext(FilterBuildingContext(BlockBasedTableOptions()));
1117
- }
1459
+ BloomFilterPolicy::BloomFilterPolicy(double bits_per_key)
1460
+ : BloomLikeFilterPolicy(bits_per_key) {}
1118
1461
 
1119
1462
  FilterBitsBuilder* BloomFilterPolicy::GetBuilderWithContext(
1120
1463
  const FilterBuildingContext& context) const {
1121
- Mode cur = mode_;
1464
+ if (GetMillibitsPerKey() == 0) {
1465
+ // "No filter" special case
1466
+ return nullptr;
1467
+ } else if (context.table_options.format_version < 5) {
1468
+ return GetLegacyBloomBuilderWithContext(context);
1469
+ } else {
1470
+ return GetFastLocalBloomBuilderWithContext(context);
1471
+ }
1472
+ }
1473
+
1474
+ const char* BloomFilterPolicy::kClassName() { return "bloomfilter"; }
1475
+ const char* BloomFilterPolicy::kNickName() { return "rocksdb.BloomFilter"; }
1476
+
1477
+ std::string BloomFilterPolicy::GetId() const {
1478
+ // Including ":false" for better forward-compatibility with 6.29 and earlier
1479
+ // which required a boolean `use_block_based_builder` parameter
1480
+ return BloomLikeFilterPolicy::GetId() + ":false";
1481
+ }
1482
+
1483
+ FilterBitsBuilder* BloomLikeFilterPolicy::GetFastLocalBloomBuilderWithContext(
1484
+ const FilterBuildingContext& context) const {
1122
1485
  bool offm = context.table_options.optimize_filters_for_memory;
1123
- // Unusual code construction so that we can have just
1124
- // one exhaustive switch without (risky) recursion
1125
- for (int i = 0; i < 2; ++i) {
1126
- switch (cur) {
1127
- case kAutoBloom:
1128
- if (context.table_options.format_version < 5) {
1129
- cur = kLegacyBloom;
1130
- } else {
1131
- cur = kFastLocalBloom;
1132
- }
1133
- break;
1134
- case kDeprecatedBlock:
1135
- return nullptr;
1136
- case kFastLocalBloom:
1486
+ bool reserve_filter_construction_mem =
1487
+ (context.table_options.reserve_table_builder_memory &&
1488
+ context.table_options.block_cache);
1489
+ std::shared_ptr<CacheReservationManager> cache_res_mgr;
1490
+ if (reserve_filter_construction_mem) {
1491
+ cache_res_mgr = std::make_shared<
1492
+ CacheReservationManagerImpl<CacheEntryRole::kFilterConstruction>>(
1493
+ context.table_options.block_cache);
1494
+ }
1137
1495
  return new FastLocalBloomBitsBuilder(
1138
- millibits_per_key_, offm ? &aggregate_rounding_balance_ : nullptr);
1139
- case kLegacyBloom:
1140
- if (whole_bits_per_key_ >= 14 && context.info_log &&
1141
- !warned_.load(std::memory_order_relaxed)) {
1142
- warned_ = true;
1143
- const char* adjective;
1144
- if (whole_bits_per_key_ >= 20) {
1145
- adjective = "Dramatic";
1146
- } else {
1147
- adjective = "Significant";
1148
- }
1149
- // For more details, see
1150
- // https://github.com/facebook/rocksdb/wiki/RocksDB-Bloom-Filter
1151
- ROCKS_LOG_WARN(
1152
- context.info_log,
1153
- "Using legacy Bloom filter with high (%d) bits/key. "
1154
- "%s filter space and/or accuracy improvement is available "
1155
- "with format_version>=5.",
1156
- whole_bits_per_key_, adjective);
1157
- }
1158
- return new LegacyBloomBitsBuilder(whole_bits_per_key_,
1159
- context.info_log);
1160
- case kStandard128Ribbon:
1161
- return new Standard128RibbonBitsBuilder(
1162
- desired_one_in_fp_rate_, millibits_per_key_,
1163
- offm ? &aggregate_rounding_balance_ : nullptr, context.info_log);
1496
+ millibits_per_key_, offm ? &aggregate_rounding_balance_ : nullptr,
1497
+ cache_res_mgr,
1498
+ context.table_options.detect_filter_construct_corruption);
1499
+ }
1500
+
1501
+ FilterBitsBuilder* BloomLikeFilterPolicy::GetLegacyBloomBuilderWithContext(
1502
+ const FilterBuildingContext& context) const {
1503
+ if (whole_bits_per_key_ >= 14 && context.info_log &&
1504
+ !warned_.load(std::memory_order_relaxed)) {
1505
+ warned_ = true;
1506
+ const char* adjective;
1507
+ if (whole_bits_per_key_ >= 20) {
1508
+ adjective = "Dramatic";
1509
+ } else {
1510
+ adjective = "Significant";
1164
1511
  }
1512
+ // For more details, see
1513
+ // https://github.com/facebook/rocksdb/wiki/RocksDB-Bloom-Filter
1514
+ ROCKS_LOG_WARN(context.info_log,
1515
+ "Using legacy Bloom filter with high (%d) bits/key. "
1516
+ "%s filter space and/or accuracy improvement is available "
1517
+ "with format_version>=5.",
1518
+ whole_bits_per_key_, adjective);
1519
+ }
1520
+ return new LegacyBloomBitsBuilder(whole_bits_per_key_, context.info_log);
1521
+ }
1522
+
1523
+ FilterBitsBuilder*
1524
+ BloomLikeFilterPolicy::GetStandard128RibbonBuilderWithContext(
1525
+ const FilterBuildingContext& context) const {
1526
+ // FIXME: code duplication with GetFastLocalBloomBuilderWithContext
1527
+ bool offm = context.table_options.optimize_filters_for_memory;
1528
+ bool reserve_filter_construction_mem =
1529
+ (context.table_options.reserve_table_builder_memory &&
1530
+ context.table_options.block_cache);
1531
+ std::shared_ptr<CacheReservationManager> cache_res_mgr;
1532
+ if (reserve_filter_construction_mem) {
1533
+ cache_res_mgr = std::make_shared<
1534
+ CacheReservationManagerImpl<CacheEntryRole::kFilterConstruction>>(
1535
+ context.table_options.block_cache);
1165
1536
  }
1166
- assert(false);
1167
- return nullptr; // something legal
1537
+ return new Standard128RibbonBitsBuilder(
1538
+ desired_one_in_fp_rate_, millibits_per_key_,
1539
+ offm ? &aggregate_rounding_balance_ : nullptr, cache_res_mgr,
1540
+ context.table_options.detect_filter_construct_corruption,
1541
+ context.info_log);
1168
1542
  }
1169
1543
 
1170
- FilterBitsBuilder* BloomFilterPolicy::GetBuilderFromContext(
1544
+ std::string BloomLikeFilterPolicy::GetBitsPerKeySuffix() const {
1545
+ std::string rv = ":" + ROCKSDB_NAMESPACE::ToString(millibits_per_key_ / 1000);
1546
+ int frac = millibits_per_key_ % 1000;
1547
+ if (frac > 0) {
1548
+ rv.push_back('.');
1549
+ rv.push_back(static_cast<char>('0' + (frac / 100)));
1550
+ frac %= 100;
1551
+ if (frac > 0) {
1552
+ rv.push_back(static_cast<char>('0' + (frac / 10)));
1553
+ frac %= 10;
1554
+ if (frac > 0) {
1555
+ rv.push_back(static_cast<char>('0' + frac));
1556
+ }
1557
+ }
1558
+ }
1559
+ return rv;
1560
+ }
1561
+
1562
+ FilterBitsBuilder* BuiltinFilterPolicy::GetBuilderFromContext(
1171
1563
  const FilterBuildingContext& context) {
1172
1564
  if (context.table_options.filter_policy) {
1173
1565
  return context.table_options.filter_policy->GetBuilderWithContext(context);
@@ -1176,10 +1568,52 @@ FilterBitsBuilder* BloomFilterPolicy::GetBuilderFromContext(
1176
1568
  }
1177
1569
  }
1178
1570
 
1179
- // Read metadata to determine what kind of FilterBitsReader is needed
1180
- // and return a new one.
1181
- FilterBitsReader* BloomFilterPolicy::GetFilterBitsReader(
1182
- const Slice& contents) const {
1571
+ // For testing only, but always constructable with internal names
1572
+ namespace test {
1573
+
1574
+ const char* LegacyBloomFilterPolicy::kClassName() {
1575
+ return "rocksdb.internal.LegacyBloomFilter";
1576
+ }
1577
+
1578
+ FilterBitsBuilder* LegacyBloomFilterPolicy::GetBuilderWithContext(
1579
+ const FilterBuildingContext& context) const {
1580
+ if (GetMillibitsPerKey() == 0) {
1581
+ // "No filter" special case
1582
+ return nullptr;
1583
+ }
1584
+ return GetLegacyBloomBuilderWithContext(context);
1585
+ }
1586
+
1587
+ const char* FastLocalBloomFilterPolicy::kClassName() {
1588
+ return "rocksdb.internal.FastLocalBloomFilter";
1589
+ }
1590
+
1591
+ FilterBitsBuilder* FastLocalBloomFilterPolicy::GetBuilderWithContext(
1592
+ const FilterBuildingContext& context) const {
1593
+ if (GetMillibitsPerKey() == 0) {
1594
+ // "No filter" special case
1595
+ return nullptr;
1596
+ }
1597
+ return GetFastLocalBloomBuilderWithContext(context);
1598
+ }
1599
+
1600
+ const char* Standard128RibbonFilterPolicy::kClassName() {
1601
+ return "rocksdb.internal.Standard128RibbonFilter";
1602
+ }
1603
+
1604
+ FilterBitsBuilder* Standard128RibbonFilterPolicy::GetBuilderWithContext(
1605
+ const FilterBuildingContext& context) const {
1606
+ if (GetMillibitsPerKey() == 0) {
1607
+ // "No filter" special case
1608
+ return nullptr;
1609
+ }
1610
+ return GetStandard128RibbonBuilderWithContext(context);
1611
+ }
1612
+
1613
+ } // namespace test
1614
+
1615
+ BuiltinFilterBitsReader* BuiltinFilterPolicy::GetBuiltinFilterBitsReader(
1616
+ const Slice& contents) {
1183
1617
  uint32_t len_with_meta = static_cast<uint32_t>(contents.size());
1184
1618
  if (len_with_meta <= kMetadataLen) {
1185
1619
  // filter is empty or broken. Treat like zero keys added.
@@ -1237,7 +1671,7 @@ FilterBitsReader* BloomFilterPolicy::GetFilterBitsReader(
1237
1671
 
1238
1672
  if (num_lines * CACHE_LINE_SIZE == len) {
1239
1673
  // Common case
1240
- log2_cache_line_size = folly::constexpr_log2(CACHE_LINE_SIZE);
1674
+ log2_cache_line_size = ConstexprFloorLog2(CACHE_LINE_SIZE);
1241
1675
  } else if (num_lines == 0 || len % num_lines != 0) {
1242
1676
  // Invalid (no solution to num_lines * x == len)
1243
1677
  // Treat as zero probes (always FP) for now.
@@ -1259,8 +1693,15 @@ FilterBitsReader* BloomFilterPolicy::GetFilterBitsReader(
1259
1693
  log2_cache_line_size);
1260
1694
  }
1261
1695
 
1262
- FilterBitsReader* BloomFilterPolicy::GetRibbonBitsReader(
1696
+ // Read metadata to determine what kind of FilterBitsReader is needed
1697
+ // and return a new one.
1698
+ FilterBitsReader* BuiltinFilterPolicy::GetFilterBitsReader(
1263
1699
  const Slice& contents) const {
1700
+ return BuiltinFilterPolicy::GetBuiltinFilterBitsReader(contents);
1701
+ }
1702
+
1703
+ BuiltinFilterBitsReader* BuiltinFilterPolicy::GetRibbonBitsReader(
1704
+ const Slice& contents) {
1264
1705
  uint32_t len_with_meta = static_cast<uint32_t>(contents.size());
1265
1706
  uint32_t len = len_with_meta - kMetadataLen;
1266
1707
 
@@ -1283,8 +1724,8 @@ FilterBitsReader* BloomFilterPolicy::GetRibbonBitsReader(
1283
1724
  }
1284
1725
 
1285
1726
  // For newer Bloom filter implementations
1286
- FilterBitsReader* BloomFilterPolicy::GetBloomBitsReader(
1287
- const Slice& contents) const {
1727
+ BuiltinFilterBitsReader* BuiltinFilterPolicy::GetBloomBitsReader(
1728
+ const Slice& contents) {
1288
1729
  uint32_t len_with_meta = static_cast<uint32_t>(contents.size());
1289
1730
  uint32_t len = len_with_meta - kMetadataLen;
1290
1731
 
@@ -1343,23 +1784,66 @@ FilterBitsReader* BloomFilterPolicy::GetBloomBitsReader(
1343
1784
  }
1344
1785
 
1345
1786
  const FilterPolicy* NewBloomFilterPolicy(double bits_per_key,
1346
- bool use_block_based_builder) {
1347
- BloomFilterPolicy::Mode m;
1348
- if (use_block_based_builder) {
1349
- m = BloomFilterPolicy::kDeprecatedBlock;
1787
+ bool /*use_block_based_builder*/) {
1788
+ // NOTE: use_block_based_builder now ignored so block-based filter is no
1789
+ // longer accessible in public API.
1790
+ return new BloomFilterPolicy(bits_per_key);
1791
+ }
1792
+
1793
+ RibbonFilterPolicy::RibbonFilterPolicy(double bloom_equivalent_bits_per_key,
1794
+ int bloom_before_level)
1795
+ : BloomLikeFilterPolicy(bloom_equivalent_bits_per_key),
1796
+ bloom_before_level_(bloom_before_level) {}
1797
+
1798
+ FilterBitsBuilder* RibbonFilterPolicy::GetBuilderWithContext(
1799
+ const FilterBuildingContext& context) const {
1800
+ if (GetMillibitsPerKey() == 0) {
1801
+ // "No filter" special case
1802
+ return nullptr;
1803
+ }
1804
+ // Treat unknown same as bottommost
1805
+ int levelish = INT_MAX;
1806
+
1807
+ switch (context.compaction_style) {
1808
+ case kCompactionStyleLevel:
1809
+ case kCompactionStyleUniversal: {
1810
+ if (context.reason == TableFileCreationReason::kFlush) {
1811
+ // Treat flush as level -1
1812
+ assert(context.level_at_creation == 0);
1813
+ levelish = -1;
1814
+ } else if (context.level_at_creation == -1) {
1815
+ // Unknown level
1816
+ assert(levelish == INT_MAX);
1817
+ } else {
1818
+ levelish = context.level_at_creation;
1819
+ }
1820
+ break;
1821
+ }
1822
+ case kCompactionStyleFIFO:
1823
+ case kCompactionStyleNone:
1824
+ // Treat as bottommost
1825
+ assert(levelish == INT_MAX);
1826
+ break;
1827
+ }
1828
+ if (levelish < bloom_before_level_) {
1829
+ return GetFastLocalBloomBuilderWithContext(context);
1350
1830
  } else {
1351
- m = BloomFilterPolicy::kAutoBloom;
1831
+ return GetStandard128RibbonBuilderWithContext(context);
1352
1832
  }
1353
- assert(std::find(BloomFilterPolicy::kAllUserModes.begin(),
1354
- BloomFilterPolicy::kAllUserModes.end(),
1355
- m) != BloomFilterPolicy::kAllUserModes.end());
1356
- return new BloomFilterPolicy(bits_per_key, m);
1357
1833
  }
1358
1834
 
1359
- extern const FilterPolicy* NewExperimentalRibbonFilterPolicy(
1360
- double bloom_equivalent_bits_per_key) {
1361
- return new BloomFilterPolicy(bloom_equivalent_bits_per_key,
1362
- BloomFilterPolicy::kStandard128Ribbon);
1835
+ const char* RibbonFilterPolicy::kClassName() { return "ribbonfilter"; }
1836
+ const char* RibbonFilterPolicy::kNickName() { return "rocksdb.RibbonFilter"; }
1837
+
1838
+ std::string RibbonFilterPolicy::GetId() const {
1839
+ return BloomLikeFilterPolicy::GetId() + ":" +
1840
+ ROCKSDB_NAMESPACE::ToString(bloom_before_level_);
1841
+ }
1842
+
1843
+ const FilterPolicy* NewRibbonFilterPolicy(double bloom_equivalent_bits_per_key,
1844
+ int bloom_before_level) {
1845
+ return new RibbonFilterPolicy(bloom_equivalent_bits_per_key,
1846
+ bloom_before_level);
1363
1847
  }
1364
1848
 
1365
1849
  FilterBuildingContext::FilterBuildingContext(
@@ -1368,40 +1852,198 @@ FilterBuildingContext::FilterBuildingContext(
1368
1852
 
1369
1853
  FilterPolicy::~FilterPolicy() { }
1370
1854
 
1855
+ std::shared_ptr<const FilterPolicy> BloomLikeFilterPolicy::Create(
1856
+ const std::string& name, double bits_per_key) {
1857
+ if (name == test::LegacyBloomFilterPolicy::kClassName()) {
1858
+ return std::make_shared<test::LegacyBloomFilterPolicy>(bits_per_key);
1859
+ } else if (name == test::FastLocalBloomFilterPolicy::kClassName()) {
1860
+ return std::make_shared<test::FastLocalBloomFilterPolicy>(bits_per_key);
1861
+ } else if (name == test::Standard128RibbonFilterPolicy::kClassName()) {
1862
+ return std::make_shared<test::Standard128RibbonFilterPolicy>(bits_per_key);
1863
+ } else if (name == DeprecatedBlockBasedBloomFilterPolicy::kClassName()) {
1864
+ return std::make_shared<DeprecatedBlockBasedBloomFilterPolicy>(
1865
+ bits_per_key);
1866
+ } else if (name == BloomFilterPolicy::kClassName()) {
1867
+ // For testing
1868
+ return std::make_shared<BloomFilterPolicy>(bits_per_key);
1869
+ } else if (name == RibbonFilterPolicy::kClassName()) {
1870
+ // For testing
1871
+ return std::make_shared<RibbonFilterPolicy>(bits_per_key,
1872
+ /*bloom_before_level*/ 0);
1873
+ } else {
1874
+ return nullptr;
1875
+ }
1876
+ }
1877
+
1878
+ #ifndef ROCKSDB_LITE
1879
+ namespace {
1880
+ static ObjectLibrary::PatternEntry FilterPatternEntryWithBits(
1881
+ const char* name) {
1882
+ return ObjectLibrary::PatternEntry(name, false).AddNumber(":", false);
1883
+ }
1884
+
1885
+ template <typename T>
1886
+ T* NewBuiltinFilterPolicyWithBits(const std::string& uri) {
1887
+ const std::vector<std::string> vals = StringSplit(uri, ':');
1888
+ double bits_per_key = ParseDouble(vals[1]);
1889
+ return new T(bits_per_key);
1890
+ }
1891
+ static int RegisterBuiltinFilterPolicies(ObjectLibrary& library,
1892
+ const std::string& /*arg*/) {
1893
+ library.AddFactory<const FilterPolicy>(
1894
+ ReadOnlyBuiltinFilterPolicy::kClassName(),
1895
+ [](const std::string& /*uri*/, std::unique_ptr<const FilterPolicy>* guard,
1896
+ std::string* /* errmsg */) {
1897
+ guard->reset(new ReadOnlyBuiltinFilterPolicy());
1898
+ return guard->get();
1899
+ });
1900
+
1901
+ library.AddFactory<const FilterPolicy>(
1902
+ FilterPatternEntryWithBits(BloomFilterPolicy::kClassName())
1903
+ .AnotherName(BloomFilterPolicy::kNickName()),
1904
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1905
+ std::string* /* errmsg */) {
1906
+ guard->reset(NewBuiltinFilterPolicyWithBits<BloomFilterPolicy>(uri));
1907
+ return guard->get();
1908
+ });
1909
+ library.AddFactory<const FilterPolicy>(
1910
+ FilterPatternEntryWithBits(BloomFilterPolicy::kClassName())
1911
+ .AnotherName(BloomFilterPolicy::kNickName())
1912
+ .AddSuffix(":false"),
1913
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1914
+ std::string* /* errmsg */) {
1915
+ guard->reset(NewBuiltinFilterPolicyWithBits<BloomFilterPolicy>(uri));
1916
+ return guard->get();
1917
+ });
1918
+ library.AddFactory<const FilterPolicy>(
1919
+ FilterPatternEntryWithBits(BloomFilterPolicy::kClassName())
1920
+ .AnotherName(BloomFilterPolicy::kNickName())
1921
+ .AddSuffix(":true"),
1922
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1923
+ std::string* /* errmsg */) {
1924
+ const std::vector<std::string> vals = StringSplit(uri, ':');
1925
+ double bits_per_key = ParseDouble(vals[1]);
1926
+ // NOTE: This case previously configured the deprecated block-based
1927
+ // filter, but old ways of configuring that now map to full filter. We
1928
+ // defer to the corresponding API to ensure consistency in case that
1929
+ // change is reverted.
1930
+ guard->reset(NewBloomFilterPolicy(bits_per_key, true));
1931
+ return guard->get();
1932
+ });
1933
+ library.AddFactory<const FilterPolicy>(
1934
+ FilterPatternEntryWithBits(RibbonFilterPolicy::kClassName())
1935
+ .AnotherName(RibbonFilterPolicy::kNickName()),
1936
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1937
+ std::string* /* errmsg */) {
1938
+ const std::vector<std::string> vals = StringSplit(uri, ':');
1939
+ double bits_per_key = ParseDouble(vals[1]);
1940
+ guard->reset(NewRibbonFilterPolicy(bits_per_key));
1941
+ return guard->get();
1942
+ });
1943
+ library.AddFactory<const FilterPolicy>(
1944
+ FilterPatternEntryWithBits(RibbonFilterPolicy::kClassName())
1945
+ .AnotherName(RibbonFilterPolicy::kNickName())
1946
+ .AddNumber(":", true),
1947
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1948
+ std::string* /* errmsg */) {
1949
+ const std::vector<std::string> vals = StringSplit(uri, ':');
1950
+ double bits_per_key = ParseDouble(vals[1]);
1951
+ int bloom_before_level = ParseInt(vals[2]);
1952
+ guard->reset(NewRibbonFilterPolicy(bits_per_key, bloom_before_level));
1953
+ return guard->get();
1954
+ });
1955
+ library.AddFactory<const FilterPolicy>(
1956
+ FilterPatternEntryWithBits(test::LegacyBloomFilterPolicy::kClassName()),
1957
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1958
+ std::string* /* errmsg */) {
1959
+ guard->reset(
1960
+ NewBuiltinFilterPolicyWithBits<test::LegacyBloomFilterPolicy>(uri));
1961
+ return guard->get();
1962
+ });
1963
+ library.AddFactory<const FilterPolicy>(
1964
+ FilterPatternEntryWithBits(
1965
+ test::FastLocalBloomFilterPolicy::kClassName()),
1966
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1967
+ std::string* /* errmsg */) {
1968
+ guard->reset(
1969
+ NewBuiltinFilterPolicyWithBits<test::FastLocalBloomFilterPolicy>(
1970
+ uri));
1971
+ return guard->get();
1972
+ });
1973
+ library.AddFactory<const FilterPolicy>(
1974
+ FilterPatternEntryWithBits(
1975
+ test::Standard128RibbonFilterPolicy::kClassName()),
1976
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1977
+ std::string* /* errmsg */) {
1978
+ guard->reset(
1979
+ NewBuiltinFilterPolicyWithBits<test::Standard128RibbonFilterPolicy>(
1980
+ uri));
1981
+ return guard->get();
1982
+ });
1983
+ library.AddFactory<const FilterPolicy>(
1984
+ FilterPatternEntryWithBits(
1985
+ DeprecatedBlockBasedBloomFilterPolicy::kClassName()),
1986
+ [](const std::string& uri, std::unique_ptr<const FilterPolicy>* guard,
1987
+ std::string* /* errmsg */) {
1988
+ guard->reset(NewBuiltinFilterPolicyWithBits<
1989
+ DeprecatedBlockBasedBloomFilterPolicy>(uri));
1990
+ return guard->get();
1991
+ });
1992
+ size_t num_types;
1993
+ return static_cast<int>(library.GetFactoryCount(&num_types));
1994
+ }
1995
+ } // namespace
1996
+ #endif // ROCKSDB_LITE
1997
+
1371
1998
  Status FilterPolicy::CreateFromString(
1372
- const ConfigOptions& /*options*/, const std::string& value,
1999
+ const ConfigOptions& options, const std::string& value,
1373
2000
  std::shared_ptr<const FilterPolicy>* policy) {
1374
- const std::string kBloomName = "bloomfilter:";
1375
- const std::string kExpRibbonName = "experimental_ribbon:";
1376
- if (value == kNullptrString || value == "rocksdb.BuiltinBloomFilter") {
2001
+ if (value == kNullptrString || value.empty()) {
1377
2002
  policy->reset();
1378
- #ifndef ROCKSDB_LITE
1379
- } else if (value.compare(0, kBloomName.size(), kBloomName) == 0) {
1380
- size_t pos = value.find(':', kBloomName.size());
1381
- if (pos == std::string::npos) {
1382
- return Status::InvalidArgument(
1383
- "Invalid filter policy config, missing bits_per_key");
1384
- } else {
1385
- double bits_per_key = ParseDouble(
1386
- trim(value.substr(kBloomName.size(), pos - kBloomName.size())));
1387
- bool use_block_based_builder =
1388
- ParseBoolean("use_block_based_builder", trim(value.substr(pos + 1)));
1389
- policy->reset(
1390
- NewBloomFilterPolicy(bits_per_key, use_block_based_builder));
1391
- }
1392
- } else if (value.compare(0, kExpRibbonName.size(), kExpRibbonName) == 0) {
1393
- double bloom_equivalent_bits_per_key =
1394
- ParseDouble(trim(value.substr(kExpRibbonName.size())));
1395
- policy->reset(
1396
- NewExperimentalRibbonFilterPolicy(bloom_equivalent_bits_per_key));
2003
+ return Status::OK();
2004
+ } else if (value == ReadOnlyBuiltinFilterPolicy::kClassName()) {
2005
+ *policy = std::make_shared<ReadOnlyBuiltinFilterPolicy>();
2006
+ return Status::OK();
2007
+ }
2008
+
2009
+ std::string id;
2010
+ std::unordered_map<std::string, std::string> opt_map;
2011
+ Status status =
2012
+ Customizable::GetOptionsMap(options, policy->get(), value, &id, &opt_map);
2013
+ if (!status.ok()) { // GetOptionsMap failed
2014
+ return status;
2015
+ } else if (id.empty()) { // We have no Id but have options. Not good
2016
+ return Status::NotSupported("Cannot reset object ", id);
1397
2017
  } else {
1398
- return Status::NotFound("Invalid filter policy name ", value);
2018
+ #ifndef ROCKSDB_LITE
2019
+ static std::once_flag loaded;
2020
+ std::call_once(loaded, [&]() {
2021
+ RegisterBuiltinFilterPolicies(*(ObjectLibrary::Default().get()), "");
2022
+ });
2023
+ status = options.registry->NewSharedObject(id, policy);
1399
2024
  #else
1400
- } else {
1401
- return Status::NotSupported("Cannot load filter policy in LITE mode ",
1402
- value);
2025
+ status =
2026
+ Status::NotSupported("Cannot load filter policy in LITE mode ", value);
1403
2027
  #endif // ROCKSDB_LITE
1404
2028
  }
1405
- return Status::OK();
2029
+ if (options.ignore_unsupported_options && status.IsNotSupported()) {
2030
+ return Status::OK();
2031
+ } else if (status.ok()) {
2032
+ status = Customizable::ConfigureNewObject(
2033
+ options, const_cast<FilterPolicy*>(policy->get()), opt_map);
2034
+ }
2035
+ return status;
1406
2036
  }
2037
+
2038
+ const std::vector<std::string>& BloomLikeFilterPolicy::GetAllFixedImpls() {
2039
+ STATIC_AVOID_DESTRUCTION(std::vector<std::string>, impls){
2040
+ // Match filter_bench -impl=x ordering
2041
+ test::LegacyBloomFilterPolicy::kClassName(),
2042
+ DeprecatedBlockBasedBloomFilterPolicy::kClassName(),
2043
+ test::FastLocalBloomFilterPolicy::kClassName(),
2044
+ test::Standard128RibbonFilterPolicy::kClassName(),
2045
+ };
2046
+ return impls;
2047
+ }
2048
+
1407
2049
  } // namespace ROCKSDB_NAMESPACE