@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
@@ -7,16 +7,44 @@
7
7
  // Use of this source code is governed by a BSD-style license that can be
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
 
10
+ #include <cstring>
11
+ #include <iomanip>
12
+ #include <sstream>
13
+ #include <string>
14
+
15
+ #include "cache/cache_entry_roles.h"
16
+ #include "cache/cache_reservation_manager.h"
10
17
  #include "db/db_test_util.h"
11
18
  #include "options/options_helper.h"
12
19
  #include "port/stack_trace.h"
20
+ #include "rocksdb/advanced_options.h"
21
+ #include "rocksdb/convenience.h"
22
+ #include "rocksdb/filter_policy.h"
13
23
  #include "rocksdb/perf_context.h"
24
+ #include "rocksdb/statistics.h"
25
+ #include "rocksdb/table.h"
26
+ #include "table/block_based/block_based_table_reader.h"
14
27
  #include "table/block_based/filter_policy_internal.h"
28
+ #include "table/format.h"
29
+ #include "test_util/testutil.h"
30
+ #include "util/string_util.h"
15
31
 
16
32
  namespace ROCKSDB_NAMESPACE {
17
33
 
18
34
  namespace {
19
- using BFP = BloomFilterPolicy;
35
+ std::shared_ptr<const FilterPolicy> Create(double bits_per_key,
36
+ const std::string& name) {
37
+ return BloomLikeFilterPolicy::Create(name, bits_per_key);
38
+ }
39
+ const std::string kLegacyBloom = test::LegacyBloomFilterPolicy::kClassName();
40
+ const std::string kDeprecatedBlock =
41
+ DeprecatedBlockBasedBloomFilterPolicy::kClassName();
42
+ const std::string kFastLocalBloom =
43
+ test::FastLocalBloomFilterPolicy::kClassName();
44
+ const std::string kStandard128Ribbon =
45
+ test::Standard128RibbonFilterPolicy::kClassName();
46
+ const std::string kAutoBloom = BloomFilterPolicy::kClassName();
47
+ const std::string kAutoRibbon = RibbonFilterPolicy::kClassName();
20
48
  } // namespace
21
49
 
22
50
  // DB tests related to bloom filter.
@@ -24,21 +52,22 @@ using BFP = BloomFilterPolicy;
24
52
  class DBBloomFilterTest : public DBTestBase {
25
53
  public:
26
54
  DBBloomFilterTest()
27
- : DBTestBase("/db_bloom_filter_test", /*env_do_fsync=*/true) {}
55
+ : DBTestBase("db_bloom_filter_test", /*env_do_fsync=*/true) {}
28
56
  };
29
57
 
30
- class DBBloomFilterTestWithParam : public DBTestBase,
31
- public testing::WithParamInterface<
32
- std::tuple<BFP::Mode, bool, uint32_t>> {
58
+ class DBBloomFilterTestWithParam
59
+ : public DBTestBase,
60
+ public testing::WithParamInterface<
61
+ std::tuple<std::string, bool, uint32_t>> {
33
62
  // public testing::WithParamInterface<bool> {
34
63
  protected:
35
- BFP::Mode bfp_impl_;
64
+ std::string bfp_impl_;
36
65
  bool partition_filters_;
37
66
  uint32_t format_version_;
38
67
 
39
68
  public:
40
69
  DBBloomFilterTestWithParam()
41
- : DBTestBase("/db_bloom_filter_tests", /*env_do_fsync=*/true) {}
70
+ : DBTestBase("db_bloom_filter_tests", /*env_do_fsync=*/true) {}
42
71
 
43
72
  ~DBBloomFilterTestWithParam() override {}
44
73
 
@@ -79,7 +108,7 @@ TEST_P(DBBloomFilterTestDefFormatVersion, KeyMayExist) {
79
108
  ReadOptions ropts;
80
109
  std::string value;
81
110
  anon::OptionsOverride options_override;
82
- options_override.filter_policy.reset(new BFP(20, bfp_impl_));
111
+ options_override.filter_policy = Create(20, bfp_impl_);
83
112
  options_override.partition_filters = partition_filters_;
84
113
  options_override.metadata_block_size = 32;
85
114
  Options options = CurrentOptions(options_override);
@@ -209,11 +238,23 @@ TEST_F(DBBloomFilterTest, GetFilterByPrefixBloomCustomPrefixExtractor) {
209
238
  (*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
210
239
 
211
240
  ro.total_order_seek = true;
212
- ASSERT_TRUE(db_->Get(ro, "foobarbar", &value).IsNotFound());
213
- ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 2);
241
+ // NOTE: total_order_seek no longer affects Get()
242
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
243
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
214
244
  ASSERT_EQ(
215
- 2,
245
+ 3,
246
+ (*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
247
+
248
+ // No bloom on extractor changed
249
+ #ifndef ROCKSDB_LITE
250
+ ASSERT_OK(db_->SetOptions({{"prefix_extractor", "capped:10"}}));
251
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
252
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
253
+ ASSERT_EQ(
254
+ 3,
216
255
  (*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
256
+ #endif // ROCKSDB_LITE
257
+
217
258
  get_perf_context()->Reset();
218
259
  }
219
260
  }
@@ -260,11 +301,23 @@ TEST_F(DBBloomFilterTest, GetFilterByPrefixBloom) {
260
301
  ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 2);
261
302
 
262
303
  ro.total_order_seek = true;
263
- ASSERT_TRUE(db_->Get(ro, "foobarbar", &value).IsNotFound());
264
- ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 2);
304
+ // NOTE: total_order_seek no longer affects Get()
305
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
306
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
265
307
  ASSERT_EQ(
266
- 2,
308
+ 3,
267
309
  (*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
310
+
311
+ // No bloom on extractor changed
312
+ #ifndef ROCKSDB_LITE
313
+ ASSERT_OK(db_->SetOptions({{"prefix_extractor", "capped:10"}}));
314
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
315
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
316
+ ASSERT_EQ(
317
+ 3,
318
+ (*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
319
+ #endif // ROCKSDB_LITE
320
+
268
321
  get_perf_context()->Reset();
269
322
  }
270
323
  }
@@ -442,7 +495,7 @@ TEST_P(DBBloomFilterTestWithParam, BloomFilter) {
442
495
  // trigger reset of table_factory
443
496
  BlockBasedTableOptions table_options;
444
497
  table_options.no_block_cache = true;
445
- table_options.filter_policy.reset(new BFP(10, bfp_impl_));
498
+ table_options.filter_policy = Create(10, bfp_impl_);
446
499
  table_options.partition_filters = partition_filters_;
447
500
  if (partition_filters_) {
448
501
  table_options.index_type =
@@ -503,36 +556,217 @@ TEST_P(DBBloomFilterTestWithParam, BloomFilter) {
503
556
  ASSERT_LE(reads, 3 * N / 100);
504
557
  }
505
558
 
559
+ #ifndef ROCKSDB_LITE
560
+ // Sanity check some table properties
561
+ std::map<std::string, std::string> props;
562
+ ASSERT_TRUE(db_->GetMapProperty(
563
+ handles_[1], DB::Properties::kAggregatedTableProperties, &props));
564
+ uint64_t nkeys = N + N / 100;
565
+ uint64_t filter_size = ParseUint64(props["filter_size"]);
566
+ EXPECT_LE(filter_size,
567
+ (partition_filters_ ? 12 : 11) * nkeys / /*bits / byte*/ 8);
568
+ if (bfp_impl_ == kAutoRibbon) {
569
+ // Sometimes using Ribbon filter which is more space-efficient
570
+ EXPECT_GE(filter_size, 7 * nkeys / /*bits / byte*/ 8);
571
+ } else {
572
+ // Always Bloom
573
+ EXPECT_GE(filter_size, 10 * nkeys / /*bits / byte*/ 8);
574
+ }
575
+
576
+ uint64_t num_filter_entries = ParseUint64(props["num_filter_entries"]);
577
+ EXPECT_EQ(num_filter_entries, nkeys);
578
+ #endif // ROCKSDB_LITE
579
+
506
580
  env_->delay_sstable_sync_.store(false, std::memory_order_release);
507
581
  Close();
508
582
  } while (ChangeCompactOptions());
509
583
  }
510
584
 
511
- #ifndef ROCKSDB_VALGRIND_RUN
585
+ namespace {
586
+
587
+ class AlwaysTrueBitsBuilder : public FilterBitsBuilder {
588
+ public:
589
+ void AddKey(const Slice&) override {}
590
+ size_t EstimateEntriesAdded() override { return 0U; }
591
+ Slice Finish(std::unique_ptr<const char[]>* /* buf */) override {
592
+ // Interpreted as "always true" filter (0 probes over 1 byte of
593
+ // payload, 5 bytes metadata)
594
+ return Slice("\0\0\0\0\0\0", 6);
595
+ }
596
+ using FilterBitsBuilder::Finish;
597
+ size_t ApproximateNumEntries(size_t) override { return SIZE_MAX; }
598
+ };
599
+
600
+ class AlwaysTrueFilterPolicy : public ReadOnlyBuiltinFilterPolicy {
601
+ public:
602
+ explicit AlwaysTrueFilterPolicy(bool skip) : skip_(skip) {}
603
+
604
+ FilterBitsBuilder* GetBuilderWithContext(
605
+ const FilterBuildingContext&) const override {
606
+ if (skip_) {
607
+ return nullptr;
608
+ } else {
609
+ return new AlwaysTrueBitsBuilder();
610
+ }
611
+ }
612
+
613
+ private:
614
+ bool skip_;
615
+ };
616
+
617
+ } // namespace
618
+
619
+ TEST_P(DBBloomFilterTestWithParam, SkipFilterOnEssentiallyZeroBpk) {
620
+ constexpr int maxKey = 10;
621
+ auto PutFn = [&]() {
622
+ int i;
623
+ // Put
624
+ for (i = 0; i < maxKey; i++) {
625
+ ASSERT_OK(Put(Key(i), Key(i)));
626
+ }
627
+ Flush();
628
+ };
629
+ auto GetFn = [&]() {
630
+ int i;
631
+ // Get OK
632
+ for (i = 0; i < maxKey; i++) {
633
+ ASSERT_EQ(Key(i), Get(Key(i)));
634
+ }
635
+ // Get NotFound
636
+ for (; i < maxKey * 2; i++) {
637
+ ASSERT_EQ(Get(Key(i)), "NOT_FOUND");
638
+ }
639
+ };
640
+ auto PutAndGetFn = [&]() {
641
+ PutFn();
642
+ GetFn();
643
+ };
644
+ #ifndef ROCKSDB_LITE
645
+ std::map<std::string, std::string> props;
646
+ const auto& kAggTableProps = DB::Properties::kAggregatedTableProperties;
647
+ #endif // ROCKSDB_LITE
648
+
649
+ Options options = CurrentOptions();
650
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
651
+ BlockBasedTableOptions table_options;
652
+ table_options.partition_filters = partition_filters_;
653
+ if (partition_filters_) {
654
+ table_options.index_type =
655
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
656
+ }
657
+ table_options.format_version = format_version_;
658
+
659
+ // Test 1: bits per key < 0.5 means skip filters -> no filter
660
+ // constructed or read.
661
+ table_options.filter_policy = Create(0.4, bfp_impl_);
662
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
663
+ DestroyAndReopen(options);
664
+ PutAndGetFn();
665
+
666
+ // Verify no filter access nor contruction
667
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
668
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
669
+
670
+ #ifndef ROCKSDB_LITE
671
+ props.clear();
672
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
673
+ EXPECT_EQ(props["filter_size"], "0");
674
+ #endif // ROCKSDB_LITE
675
+
676
+ // Test 2: use custom API to skip filters -> no filter constructed
677
+ // or read.
678
+ table_options.filter_policy.reset(
679
+ new AlwaysTrueFilterPolicy(/* skip */ true));
680
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
681
+ DestroyAndReopen(options);
682
+ PutAndGetFn();
683
+
684
+ // Verify no filter access nor construction
685
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
686
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
687
+
688
+ #ifndef ROCKSDB_LITE
689
+ props.clear();
690
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
691
+ EXPECT_EQ(props["filter_size"], "0");
692
+ #endif // ROCKSDB_LITE
693
+
694
+ // Control test: using an actual filter with 100% FP rate -> the filter
695
+ // is constructed and checked on read.
696
+ table_options.filter_policy.reset(
697
+ new AlwaysTrueFilterPolicy(/* skip */ false));
698
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
699
+ DestroyAndReopen(options);
700
+ PutAndGetFn();
701
+
702
+ // Verify filter is accessed (and constructed)
703
+ EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE),
704
+ maxKey * 2);
705
+ EXPECT_EQ(
706
+ TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE),
707
+ maxKey);
708
+ #ifndef ROCKSDB_LITE
709
+ props.clear();
710
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
711
+ EXPECT_NE(props["filter_size"], "0");
712
+ #endif // ROCKSDB_LITE
713
+
714
+ // Test 3 (options test): Able to read existing filters with longstanding
715
+ // generated options file entry `filter_policy=rocksdb.BuiltinBloomFilter`
716
+ ASSERT_OK(FilterPolicy::CreateFromString(ConfigOptions(),
717
+ "rocksdb.BuiltinBloomFilter",
718
+ &table_options.filter_policy));
719
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
720
+ Reopen(options);
721
+ GetFn();
722
+
723
+ // Verify filter is accessed
724
+ EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE),
725
+ maxKey * 2);
726
+ EXPECT_EQ(
727
+ TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE),
728
+ maxKey);
729
+
730
+ // But new filters are not generated (configuration details unknown)
731
+ DestroyAndReopen(options);
732
+ PutAndGetFn();
733
+
734
+ // Verify no filter access nor construction
735
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
736
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
737
+
738
+ #ifndef ROCKSDB_LITE
739
+ props.clear();
740
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
741
+ EXPECT_EQ(props["filter_size"], "0");
742
+ #endif // ROCKSDB_LITE
743
+ }
744
+
745
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
512
746
  INSTANTIATE_TEST_CASE_P(
513
747
  FormatDef, DBBloomFilterTestDefFormatVersion,
514
748
  ::testing::Values(
515
- std::make_tuple(BFP::kDeprecatedBlock, false,
516
- test::kDefaultFormatVersion),
517
- std::make_tuple(BFP::kAutoBloom, true, test::kDefaultFormatVersion),
518
- std::make_tuple(BFP::kAutoBloom, false, test::kDefaultFormatVersion)));
749
+ std::make_tuple(kDeprecatedBlock, false, test::kDefaultFormatVersion),
750
+ std::make_tuple(kAutoBloom, true, test::kDefaultFormatVersion),
751
+ std::make_tuple(kAutoBloom, false, test::kDefaultFormatVersion),
752
+ std::make_tuple(kAutoRibbon, false, test::kDefaultFormatVersion)));
519
753
 
520
754
  INSTANTIATE_TEST_CASE_P(
521
755
  FormatDef, DBBloomFilterTestWithParam,
522
756
  ::testing::Values(
523
- std::make_tuple(BFP::kDeprecatedBlock, false,
524
- test::kDefaultFormatVersion),
525
- std::make_tuple(BFP::kAutoBloom, true, test::kDefaultFormatVersion),
526
- std::make_tuple(BFP::kAutoBloom, false, test::kDefaultFormatVersion)));
757
+ std::make_tuple(kDeprecatedBlock, false, test::kDefaultFormatVersion),
758
+ std::make_tuple(kAutoBloom, true, test::kDefaultFormatVersion),
759
+ std::make_tuple(kAutoBloom, false, test::kDefaultFormatVersion),
760
+ std::make_tuple(kAutoRibbon, false, test::kDefaultFormatVersion)));
527
761
 
528
762
  INSTANTIATE_TEST_CASE_P(
529
763
  FormatLatest, DBBloomFilterTestWithParam,
530
764
  ::testing::Values(
531
- std::make_tuple(BFP::kDeprecatedBlock, false,
532
- test::kLatestFormatVersion),
533
- std::make_tuple(BFP::kAutoBloom, true, test::kLatestFormatVersion),
534
- std::make_tuple(BFP::kAutoBloom, false, test::kLatestFormatVersion)));
535
- #endif // ROCKSDB_VALGRIND_RUN
765
+ std::make_tuple(kDeprecatedBlock, false, kLatestFormatVersion),
766
+ std::make_tuple(kAutoBloom, true, kLatestFormatVersion),
767
+ std::make_tuple(kAutoBloom, false, kLatestFormatVersion),
768
+ std::make_tuple(kAutoRibbon, false, kLatestFormatVersion)));
769
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
536
770
 
537
771
  TEST_F(DBBloomFilterTest, BloomFilterRate) {
538
772
  while (ChangeFilterOptions()) {
@@ -567,163 +801,848 @@ TEST_F(DBBloomFilterTest, BloomFilterRate) {
567
801
  }
568
802
  }
569
803
 
804
+ namespace {
805
+ struct CompatibilityConfig {
806
+ std::shared_ptr<const FilterPolicy> policy;
807
+ bool partitioned;
808
+ uint32_t format_version;
809
+
810
+ void SetInTableOptions(BlockBasedTableOptions* table_options) {
811
+ table_options->filter_policy = policy;
812
+ table_options->partition_filters = partitioned;
813
+ if (partitioned) {
814
+ table_options->index_type =
815
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
816
+ } else {
817
+ table_options->index_type =
818
+ BlockBasedTableOptions::IndexType::kBinarySearch;
819
+ }
820
+ table_options->format_version = format_version;
821
+ }
822
+ };
823
+ // High bits per key -> almost no FPs
824
+ std::shared_ptr<const FilterPolicy> kCompatibilityBloomPolicy{
825
+ NewBloomFilterPolicy(20)};
826
+ // bloom_before_level=-1 -> always use Ribbon
827
+ std::shared_ptr<const FilterPolicy> kCompatibilityRibbonPolicy{
828
+ NewRibbonFilterPolicy(20, -1)};
829
+
830
+ std::vector<CompatibilityConfig> kCompatibilityConfigs = {
831
+ {Create(20, kDeprecatedBlock), false,
832
+ BlockBasedTableOptions().format_version},
833
+ {kCompatibilityBloomPolicy, false, BlockBasedTableOptions().format_version},
834
+ {kCompatibilityBloomPolicy, true, BlockBasedTableOptions().format_version},
835
+ {kCompatibilityBloomPolicy, false, /* legacy Bloom */ 4U},
836
+ {kCompatibilityRibbonPolicy, false,
837
+ BlockBasedTableOptions().format_version},
838
+ {kCompatibilityRibbonPolicy, true, BlockBasedTableOptions().format_version},
839
+ };
840
+ } // namespace
841
+
570
842
  TEST_F(DBBloomFilterTest, BloomFilterCompatibility) {
571
843
  Options options = CurrentOptions();
572
844
  options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
573
- BlockBasedTableOptions table_options;
574
- table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));
575
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
845
+ options.level0_file_num_compaction_trigger =
846
+ static_cast<int>(kCompatibilityConfigs.size()) + 1;
847
+ options.max_open_files = -1;
576
848
 
577
- // Create with block based filter
578
- CreateAndReopenWithCF({"pikachu"}, options);
849
+ Close();
579
850
 
580
- const int maxKey = 10000;
581
- for (int i = 0; i < maxKey; i++) {
582
- ASSERT_OK(Put(1, Key(i), Key(i)));
851
+ // Create one file for each kind of filter. Each file covers a distinct key
852
+ // range.
853
+ for (size_t i = 0; i < kCompatibilityConfigs.size(); ++i) {
854
+ BlockBasedTableOptions table_options;
855
+ kCompatibilityConfigs[i].SetInTableOptions(&table_options);
856
+ ASSERT_TRUE(table_options.filter_policy != nullptr);
857
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
858
+ Reopen(options);
859
+
860
+ std::string prefix = ToString(i) + "_";
861
+ ASSERT_OK(Put(prefix + "A", "val"));
862
+ ASSERT_OK(Put(prefix + "Z", "val"));
863
+ ASSERT_OK(Flush());
583
864
  }
584
- ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
585
- Flush(1);
586
865
 
587
- // Check db with full filter
588
- table_options.filter_policy.reset(NewBloomFilterPolicy(10, false));
589
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
590
- ReopenWithColumnFamilies({"default", "pikachu"}, options);
866
+ // Test filter is used between each pair of {reader,writer} configurations,
867
+ // because any built-in FilterPolicy should be able to read filters from any
868
+ // other built-in FilterPolicy
869
+ for (size_t i = 0; i < kCompatibilityConfigs.size(); ++i) {
870
+ BlockBasedTableOptions table_options;
871
+ kCompatibilityConfigs[i].SetInTableOptions(&table_options);
872
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
873
+ Reopen(options);
874
+ for (size_t j = 0; j < kCompatibilityConfigs.size(); ++j) {
875
+ std::string prefix = ToString(j) + "_";
876
+ ASSERT_EQ("val", Get(prefix + "A")); // Filter positive
877
+ ASSERT_EQ("val", Get(prefix + "Z")); // Filter positive
878
+ // Filter negative, with high probability
879
+ ASSERT_EQ("NOT_FOUND", Get(prefix + "Q"));
880
+ // FULL_POSITIVE does not include block-based filter case (j == 0)
881
+ EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE),
882
+ j == 0 ? 0 : 2);
883
+ EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_USEFUL), 1);
884
+ }
885
+ }
886
+ }
591
887
 
592
- // Check if they can be found
593
- for (int i = 0; i < maxKey; i++) {
594
- ASSERT_EQ(Key(i), Get(1, Key(i)));
888
+ /*
889
+ * A cache wrapper that tracks peaks and increments of filter
890
+ * construction cache reservation.
891
+ * p0
892
+ * / \ p1
893
+ * / \ /\
894
+ * / \/ \
895
+ * a / b \
896
+ * peaks = {p0, p1}
897
+ * increments = {p1-a, p2-b}
898
+ */
899
+ class FilterConstructResPeakTrackingCache : public CacheWrapper {
900
+ public:
901
+ explicit FilterConstructResPeakTrackingCache(std::shared_ptr<Cache> target)
902
+ : CacheWrapper(std::move(target)),
903
+ cur_cache_res_(0),
904
+ cache_res_peak_(0),
905
+ cache_res_increment_(0),
906
+ last_peak_tracked_(false),
907
+ cache_res_increments_sum_(0) {}
908
+
909
+ using Cache::Insert;
910
+ Status Insert(const Slice& key, void* value, size_t charge,
911
+ void (*deleter)(const Slice& key, void* value),
912
+ Handle** handle = nullptr,
913
+ Priority priority = Priority::LOW) override {
914
+ Status s = target_->Insert(key, value, charge, deleter, handle, priority);
915
+ if (deleter == kNoopDeleterForFilterConstruction) {
916
+ if (last_peak_tracked_) {
917
+ cache_res_peak_ = 0;
918
+ cache_res_increment_ = 0;
919
+ last_peak_tracked_ = false;
920
+ }
921
+ cur_cache_res_ += charge;
922
+ cache_res_peak_ = std::max(cache_res_peak_, cur_cache_res_);
923
+ cache_res_increment_ += charge;
924
+ }
925
+ return s;
595
926
  }
596
- ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
597
927
 
598
- // Check db with partitioned full filter
599
- table_options.partition_filters = true;
600
- table_options.index_type =
601
- BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
602
- table_options.filter_policy.reset(NewBloomFilterPolicy(10, false));
603
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
604
- ReopenWithColumnFamilies({"default", "pikachu"}, options);
928
+ using Cache::Release;
929
+ bool Release(Handle* handle, bool erase_if_last_ref = false) override {
930
+ auto deleter = GetDeleter(handle);
931
+ if (deleter == kNoopDeleterForFilterConstruction) {
932
+ if (!last_peak_tracked_) {
933
+ cache_res_peaks_.push_back(cache_res_peak_);
934
+ cache_res_increments_sum_ += cache_res_increment_;
935
+ last_peak_tracked_ = true;
936
+ }
937
+ cur_cache_res_ -= GetCharge(handle);
938
+ }
939
+ bool is_successful = target_->Release(handle, erase_if_last_ref);
940
+ return is_successful;
941
+ }
942
+
943
+ std::deque<std::size_t> GetReservedCachePeaks() { return cache_res_peaks_; }
605
944
 
606
- // Check if they can be found
607
- for (int i = 0; i < maxKey; i++) {
608
- ASSERT_EQ(Key(i), Get(1, Key(i)));
945
+ std::size_t GetReservedCacheIncrementSum() {
946
+ return cache_res_increments_sum_;
609
947
  }
610
- ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
611
- }
612
948
 
613
- TEST_F(DBBloomFilterTest, BloomFilterReverseCompatibility) {
614
- for (bool partition_filters : {true, false}) {
615
- Options options = CurrentOptions();
616
- options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
949
+ private:
950
+ static const Cache::DeleterFn kNoopDeleterForFilterConstruction;
951
+
952
+ std::size_t cur_cache_res_;
953
+ std::size_t cache_res_peak_;
954
+ std::size_t cache_res_increment_;
955
+ bool last_peak_tracked_;
956
+ std::deque<std::size_t> cache_res_peaks_;
957
+ std::size_t cache_res_increments_sum_;
958
+ };
959
+
960
+ const Cache::DeleterFn
961
+ FilterConstructResPeakTrackingCache::kNoopDeleterForFilterConstruction =
962
+ CacheReservationManagerImpl<
963
+ CacheEntryRole::kFilterConstruction>::TEST_GetNoopDeleterForRole();
964
+
965
+ // To align with the type of hash entry being reserved in implementation.
966
+ using FilterConstructionReserveMemoryHash = uint64_t;
967
+
968
+ class DBFilterConstructionReserveMemoryTestWithParam
969
+ : public DBTestBase,
970
+ public testing::WithParamInterface<
971
+ std::tuple<bool, std::string, bool, bool>> {
972
+ public:
973
+ DBFilterConstructionReserveMemoryTestWithParam()
974
+ : DBTestBase("db_bloom_filter_tests",
975
+ /*env_do_fsync=*/true),
976
+ num_key_(0),
977
+ reserve_table_builder_memory_(std::get<0>(GetParam())),
978
+ policy_(std::get<1>(GetParam())),
979
+ partition_filters_(std::get<2>(GetParam())),
980
+ detect_filter_construct_corruption_(std::get<3>(GetParam())) {
981
+ if (!reserve_table_builder_memory_ || policy_ == kDeprecatedBlock ||
982
+ policy_ == kLegacyBloom) {
983
+ // For these cases, we only interested in whether filter construction
984
+ // cache resevation happens instead of its accuracy. Therefore we don't
985
+ // need many keys.
986
+ num_key_ = 5;
987
+ } else if (partition_filters_) {
988
+ // For PartitionFilter case, since we set
989
+ // table_options.metadata_block_size big enough such that each partition
990
+ // trigger at least 1 dummy entry reservation each for hash entries and
991
+ // final filter, we need a large number of keys to ensure we have at least
992
+ // two partitions.
993
+ num_key_ = 18 *
994
+ CacheReservationManagerImpl<
995
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
996
+ sizeof(FilterConstructionReserveMemoryHash);
997
+ } else if (policy_ == kFastLocalBloom) {
998
+ // For Bloom Filter + FullFilter case, since we design the num_key_ to
999
+ // make hash entry cache reservation be a multiple of dummy entries, the
1000
+ // correct behavior of charging final filter on top of it will trigger at
1001
+ // least another dummy entry insertion. Therefore we can assert that
1002
+ // behavior and we don't need a large number of keys to verify we
1003
+ // indeed charge the final filter for cache reservation, even though final
1004
+ // filter is a lot smaller than hash entries.
1005
+ num_key_ = 1 *
1006
+ CacheReservationManagerImpl<
1007
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
1008
+ sizeof(FilterConstructionReserveMemoryHash);
1009
+ } else {
1010
+ // For Ribbon Filter + FullFilter case, we need a large enough number of
1011
+ // keys so that charging final filter after releasing the hash entries
1012
+ // reservation will trigger at least another dummy entry (or equivalently
1013
+ // to saying, causing another peak in cache reservation) as banding
1014
+ // reservation might not be a multiple of dummy entry.
1015
+ num_key_ = 12 *
1016
+ CacheReservationManagerImpl<
1017
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
1018
+ sizeof(FilterConstructionReserveMemoryHash);
1019
+ }
1020
+ }
1021
+
1022
+ BlockBasedTableOptions GetBlockBasedTableOptions() {
617
1023
  BlockBasedTableOptions table_options;
618
- if (partition_filters) {
619
- table_options.partition_filters = true;
1024
+
1025
+ // We set cache capacity big enough to prevent cache full for convenience in
1026
+ // calculation.
1027
+ constexpr std::size_t kCacheCapacity = 100 * 1024 * 1024;
1028
+
1029
+ table_options.reserve_table_builder_memory = reserve_table_builder_memory_;
1030
+ table_options.filter_policy = Create(10, policy_);
1031
+ table_options.partition_filters = partition_filters_;
1032
+ if (table_options.partition_filters) {
620
1033
  table_options.index_type =
621
1034
  BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1035
+ // We set table_options.metadata_block_size big enough so that each
1036
+ // partition trigger at least 1 dummy entry insertion each for hash
1037
+ // entries and final filter.
1038
+ table_options.metadata_block_size = 409000;
622
1039
  }
623
- table_options.filter_policy.reset(NewBloomFilterPolicy(10, false));
624
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
625
- DestroyAndReopen(options);
1040
+ table_options.detect_filter_construct_corruption =
1041
+ detect_filter_construct_corruption_;
1042
+
1043
+ LRUCacheOptions lo;
1044
+ lo.capacity = kCacheCapacity;
1045
+ lo.num_shard_bits = 0; // 2^0 shard
1046
+ lo.strict_capacity_limit = true;
1047
+ cache_ = std::make_shared<FilterConstructResPeakTrackingCache>(
1048
+ (NewLRUCache(lo)));
1049
+ table_options.block_cache = cache_;
1050
+
1051
+ return table_options;
1052
+ }
626
1053
 
627
- // Create with full filter
628
- CreateAndReopenWithCF({"pikachu"}, options);
1054
+ std::size_t GetNumKey() { return num_key_; }
629
1055
 
630
- const int maxKey = 10000;
631
- for (int i = 0; i < maxKey; i++) {
632
- ASSERT_OK(Put(1, Key(i), Key(i)));
633
- }
634
- ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
635
- Flush(1);
1056
+ bool ReserveTableBuilderMemory() { return reserve_table_builder_memory_; }
636
1057
 
637
- // Check db with block_based filter
638
- table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));
639
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
640
- ReopenWithColumnFamilies({"default", "pikachu"}, options);
1058
+ std::string GetFilterPolicy() { return policy_; }
641
1059
 
642
- // Check if they can be found
643
- for (int i = 0; i < maxKey; i++) {
644
- ASSERT_EQ(Key(i), Get(1, Key(i)));
1060
+ bool PartitionFilters() { return partition_filters_; }
1061
+
1062
+ std::shared_ptr<FilterConstructResPeakTrackingCache>
1063
+ GetFilterConstructResPeakTrackingCache() {
1064
+ return cache_;
1065
+ }
1066
+
1067
+ private:
1068
+ std::size_t num_key_;
1069
+ bool reserve_table_builder_memory_;
1070
+ std::string policy_;
1071
+ bool partition_filters_;
1072
+ std::shared_ptr<FilterConstructResPeakTrackingCache> cache_;
1073
+ bool detect_filter_construct_corruption_;
1074
+ };
1075
+
1076
+ INSTANTIATE_TEST_CASE_P(
1077
+ DBFilterConstructionReserveMemoryTestWithParam,
1078
+ DBFilterConstructionReserveMemoryTestWithParam,
1079
+ ::testing::Values(std::make_tuple(false, kFastLocalBloom, false, false),
1080
+
1081
+ std::make_tuple(true, kFastLocalBloom, false, false),
1082
+ std::make_tuple(true, kFastLocalBloom, false, true),
1083
+ std::make_tuple(true, kFastLocalBloom, true, false),
1084
+ std::make_tuple(true, kFastLocalBloom, true, true),
1085
+
1086
+ std::make_tuple(true, kStandard128Ribbon, false, false),
1087
+ std::make_tuple(true, kStandard128Ribbon, false, true),
1088
+ std::make_tuple(true, kStandard128Ribbon, true, false),
1089
+ std::make_tuple(true, kStandard128Ribbon, true, true),
1090
+
1091
+ std::make_tuple(true, kDeprecatedBlock, false, false),
1092
+ std::make_tuple(true, kLegacyBloom, false, false)));
1093
+
1094
+ // TODO: Speed up this test, and reduce disk space usage (~700MB)
1095
+ // The current test inserts many keys (on the scale of dummy entry size)
1096
+ // in order to make small memory user (e.g, final filter, partitioned hash
1097
+ // entries/filter/banding) , which is proportional to the number of
1098
+ // keys, big enough so that its cache reservation triggers dummy entry insertion
1099
+ // and becomes observable in the test.
1100
+ //
1101
+ // However, inserting that many keys slows down this test and leaves future
1102
+ // developers an opportunity to speed it up.
1103
+ //
1104
+ // Possible approaches & challenges:
1105
+ // 1. Use sync point during cache reservation of filter construction
1106
+ //
1107
+ // Benefit: It does not rely on triggering dummy entry insertion
1108
+ // but the sync point to verify small memory user is charged correctly.
1109
+ //
1110
+ // Challenge: this approach is intrusive.
1111
+ //
1112
+ // 2. Make dummy entry size configurable and set it small in the test
1113
+ //
1114
+ // Benefit: It increases the precision of cache reservation and therefore
1115
+ // small memory usage can still trigger insertion of dummy entry.
1116
+ //
1117
+ // Challenge: change CacheReservationManager related APIs and a hack
1118
+ // might be needed to control the size of dummmy entry of
1119
+ // CacheReservationManager used in filter construction for testing
1120
+ // since CacheReservationManager is not exposed at the high level.
1121
+ //
1122
+ TEST_P(DBFilterConstructionReserveMemoryTestWithParam, ReserveMemory) {
1123
+ Options options = CurrentOptions();
1124
+ // We set write_buffer_size big enough so that in the case where there is
1125
+ // filter construction cache reservation, flush won't be triggered before we
1126
+ // manually trigger it for clean testing
1127
+ options.write_buffer_size = 640 << 20;
1128
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1129
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1130
+ std::shared_ptr<FilterConstructResPeakTrackingCache> cache =
1131
+ GetFilterConstructResPeakTrackingCache();
1132
+ options.create_if_missing = true;
1133
+ // Disable auto compaction to prevent its unexpected side effect
1134
+ // to the number of keys per partition designed by us in the test
1135
+ options.disable_auto_compactions = true;
1136
+ DestroyAndReopen(options);
1137
+ int num_key = static_cast<int>(GetNumKey());
1138
+ for (int i = 0; i < num_key; i++) {
1139
+ ASSERT_OK(Put(Key(i), Key(i)));
1140
+ }
1141
+
1142
+ ASSERT_EQ(cache->GetReservedCacheIncrementSum(), 0)
1143
+ << "Flush was triggered too early in the test case with filter "
1144
+ "construction cache reservation - please make sure no flush triggered "
1145
+ "during the key insertions above";
1146
+
1147
+ ASSERT_OK(Flush());
1148
+
1149
+ bool reserve_table_builder_memory = ReserveTableBuilderMemory();
1150
+ std::string policy = GetFilterPolicy();
1151
+ bool partition_filters = PartitionFilters();
1152
+ bool detect_filter_construct_corruption =
1153
+ table_options.detect_filter_construct_corruption;
1154
+
1155
+ std::deque<std::size_t> filter_construction_cache_res_peaks =
1156
+ cache->GetReservedCachePeaks();
1157
+ std::size_t filter_construction_cache_res_increments_sum =
1158
+ cache->GetReservedCacheIncrementSum();
1159
+
1160
+ if (!reserve_table_builder_memory) {
1161
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 0);
1162
+ return;
1163
+ }
1164
+
1165
+ if (policy == kDeprecatedBlock || policy == kLegacyBloom) {
1166
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 0)
1167
+ << "There shouldn't be filter construction cache reservation as this "
1168
+ "feature does not support kDeprecatedBlock "
1169
+ "nor kLegacyBloom";
1170
+ return;
1171
+ }
1172
+
1173
+ const std::size_t kDummyEntrySize = CacheReservationManagerImpl<
1174
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize();
1175
+
1176
+ const std::size_t predicted_hash_entries_cache_res =
1177
+ num_key * sizeof(FilterConstructionReserveMemoryHash);
1178
+ ASSERT_EQ(predicted_hash_entries_cache_res % kDummyEntrySize, 0)
1179
+ << "It's by this test's design that predicted_hash_entries_cache_res is "
1180
+ "a multipe of dummy entry";
1181
+
1182
+ const std::size_t predicted_hash_entries_cache_res_dummy_entry_num =
1183
+ predicted_hash_entries_cache_res / kDummyEntrySize;
1184
+ const std::size_t predicted_final_filter_cache_res =
1185
+ static_cast<std::size_t>(
1186
+ std::ceil(1.0 * predicted_hash_entries_cache_res_dummy_entry_num / 6 *
1187
+ (policy == kStandard128Ribbon ? 0.7 : 1))) *
1188
+ kDummyEntrySize;
1189
+ const std::size_t predicted_banding_cache_res =
1190
+ static_cast<std::size_t>(
1191
+ std::ceil(predicted_hash_entries_cache_res_dummy_entry_num * 2.5)) *
1192
+ kDummyEntrySize;
1193
+
1194
+ if (policy == kFastLocalBloom) {
1195
+ /* kFastLocalBloom + FullFilter
1196
+ * p0
1197
+ * / \
1198
+ * b / \
1199
+ * / \
1200
+ * / \
1201
+ * 0/ \
1202
+ * hash entries = b - 0, final filter = p0 - b
1203
+ * p0 = hash entries + final filter
1204
+ *
1205
+ * The test is designed in a way such that the reservation for b is a
1206
+ * multiple of dummy entries so that reservation for (p0 - b)
1207
+ * will trigger at least another dummy entry insertion.
1208
+ *
1209
+ * kFastLocalBloom + FullFilter +
1210
+ * detect_filter_construct_corruption
1211
+ * The peak p0 stays the same as
1212
+ * (kFastLocalBloom + FullFilter) but just lasts
1213
+ * longer since we release hash entries reservation later.
1214
+ *
1215
+ * kFastLocalBloom + PartitionedFilter
1216
+ * p1
1217
+ * / \
1218
+ * p0 b'/ \
1219
+ * / \ / \
1220
+ * b / \ / \
1221
+ * / \ / \
1222
+ * / a \
1223
+ * 0/ \
1224
+ * partitioned hash entries1 = b - 0, partitioned hash entries1 = b' - a
1225
+ * parittioned final filter1 = p0 - b, parittioned final filter2 = p1 - b'
1226
+ *
1227
+ * (increment p0 - 0) + (increment p1 - a)
1228
+ * = partitioned hash entries1 + partitioned hash entries2
1229
+ * + parittioned final filter1 + parittioned final filter2
1230
+ * = hash entries + final filter
1231
+ *
1232
+ * kFastLocalBloom + PartitionedFilter +
1233
+ * detect_filter_construct_corruption
1234
+ * The peak p0, p1 stay the same as
1235
+ * (kFastLocalBloom + PartitionedFilter) but just
1236
+ * last longer since we release hash entries reservation later.
1237
+ *
1238
+ */
1239
+ if (!partition_filters) {
1240
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 1)
1241
+ << "Filter construction cache reservation should have only 1 peak in "
1242
+ "case: kFastLocalBloom + FullFilter";
1243
+ std::size_t filter_construction_cache_res_peak =
1244
+ filter_construction_cache_res_peaks[0];
1245
+ EXPECT_GT(filter_construction_cache_res_peak,
1246
+ predicted_hash_entries_cache_res)
1247
+ << "The testing number of hash entries is designed to make hash "
1248
+ "entries cache reservation be multiples of dummy entries"
1249
+ " so the correct behavior of charging final filter on top of it"
1250
+ " should've triggered at least another dummy entry insertion";
1251
+
1252
+ std::size_t predicted_filter_construction_cache_res_peak =
1253
+ predicted_hash_entries_cache_res + predicted_final_filter_cache_res;
1254
+ EXPECT_GE(filter_construction_cache_res_peak,
1255
+ predicted_filter_construction_cache_res_peak * 0.9);
1256
+ EXPECT_LE(filter_construction_cache_res_peak,
1257
+ predicted_filter_construction_cache_res_peak * 1.1);
1258
+ return;
1259
+ } else {
1260
+ EXPECT_GE(filter_construction_cache_res_peaks.size(), 2)
1261
+ << "Filter construction cache reservation should have multiple peaks "
1262
+ "in case: kFastLocalBloom + "
1263
+ "PartitionedFilter";
1264
+ std::size_t predicted_filter_construction_cache_res_increments_sum =
1265
+ predicted_hash_entries_cache_res + predicted_final_filter_cache_res;
1266
+ EXPECT_GE(filter_construction_cache_res_increments_sum,
1267
+ predicted_filter_construction_cache_res_increments_sum * 0.9);
1268
+ EXPECT_LE(filter_construction_cache_res_increments_sum,
1269
+ predicted_filter_construction_cache_res_increments_sum * 1.1);
1270
+ return;
1271
+ }
1272
+ }
1273
+
1274
+ if (policy == kStandard128Ribbon) {
1275
+ /* kStandard128Ribbon + FullFilter
1276
+ * p0
1277
+ * / \ p1
1278
+ * / \/\
1279
+ * b / b' \
1280
+ * / \
1281
+ * 0/ \
1282
+ * hash entries = b - 0, banding = p0 - b, final filter = p1 - b'
1283
+ * p0 = hash entries + banding
1284
+ *
1285
+ * The test is designed in a way such that the reservation for (p1 - b')
1286
+ * will trigger at least another dummy entry insertion
1287
+ * (or equivelantly to saying, creating another peak).
1288
+ *
1289
+ * kStandard128Ribbon + FullFilter +
1290
+ * detect_filter_construct_corruption
1291
+ *
1292
+ * new p0
1293
+ * / \
1294
+ * / \
1295
+ * pre p0 \
1296
+ * / \
1297
+ * / \
1298
+ * b / \
1299
+ * / \
1300
+ * 0/ \
1301
+ * hash entries = b - 0, banding = pre p0 - b,
1302
+ * final filter = new p0 - pre p0
1303
+ * new p0 = hash entries + banding + final filter
1304
+ *
1305
+ * The previous p0 will no longer be a peak since under
1306
+ * detect_filter_construct_corruption == true, we do not release hash
1307
+ * entries reserveration (like p0 - b' previously) until after final filter
1308
+ * creation and post-verification
1309
+ *
1310
+ * kStandard128Ribbon + PartitionedFilter
1311
+ * p3
1312
+ * p0 /\ p4
1313
+ * / \ p1 / \ /\
1314
+ * / \/\ b''/ a' \
1315
+ * b / b' \ / \
1316
+ * / \ / \
1317
+ * 0/ a \
1318
+ * partitioned hash entries1 = b - 0, partitioned hash entries2 = b'' - a
1319
+ * partitioned banding1 = p0 - b, partitioned banding2 = p3 - b''
1320
+ * parittioned final filter1 = p1 - b',parittioned final filter2 = p4 - a'
1321
+ *
1322
+ * (increment p0 - 0) + (increment p1 - b')
1323
+ * + (increment p3 - a) + (increment p4 - a')
1324
+ * = partitioned hash entries1 + partitioned hash entries2
1325
+ * + parittioned banding1 + parittioned banding2
1326
+ * + parittioned final filter1 + parittioned final filter2
1327
+ * = hash entries + banding + final filter
1328
+ *
1329
+ * kStandard128Ribbon + PartitionedFilter +
1330
+ * detect_filter_construct_corruption
1331
+ *
1332
+ * new p3
1333
+ * / \
1334
+ * pre p3 \
1335
+ * new p0 / \
1336
+ * / \ / \
1337
+ * pre p0 \ / \
1338
+ * / \ b'/ \
1339
+ * / \ / \
1340
+ * b / \ / \
1341
+ * / \a \
1342
+ * 0/ \
1343
+ * partitioned hash entries1 = b - 0, partitioned hash entries2 = b' - a
1344
+ * partitioned banding1 = pre p0 - b, partitioned banding2 = pre p3 - b'
1345
+ * parittioned final filter1 = new p0 - pre p0,
1346
+ * parittioned final filter2 = new p3 - pre p3
1347
+ *
1348
+ * The previous p0 and p3 will no longer be a peak since under
1349
+ * detect_filter_construct_corruption == true, we do not release hash
1350
+ * entries reserveration (like p0 - b', p3 - a' previously) until after
1351
+ * parittioned final filter creation and post-verification
1352
+ *
1353
+ * However, increments sum stay the same as shown below:
1354
+ * (increment new p0 - 0) + (increment new p3 - a)
1355
+ * = partitioned hash entries1 + partitioned hash entries2
1356
+ * + parittioned banding1 + parittioned banding2
1357
+ * + parittioned final filter1 + parittioned final filter2
1358
+ * = hash entries + banding + final filter
1359
+ *
1360
+ */
1361
+ if (!partition_filters) {
1362
+ ASSERT_GE(
1363
+ std::floor(
1364
+ 1.0 * predicted_final_filter_cache_res /
1365
+ CacheReservationManagerImpl<
1366
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize()),
1367
+ 1)
1368
+ << "Final filter cache reservation too small for this test - please "
1369
+ "increase the number of keys";
1370
+ if (!detect_filter_construct_corruption) {
1371
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 2)
1372
+ << "Filter construction cache reservation should have 2 peaks in "
1373
+ "case: kStandard128Ribbon + "
1374
+ "FullFilter. "
1375
+ "The second peak is resulted from charging the final filter "
1376
+ "after "
1377
+ "decreasing the hash entry reservation since the testing final "
1378
+ "filter reservation is designed to be at least 1 dummy entry "
1379
+ "size";
1380
+
1381
+ std::size_t filter_construction_cache_res_peak =
1382
+ filter_construction_cache_res_peaks[0];
1383
+ std::size_t predicted_filter_construction_cache_res_peak =
1384
+ predicted_hash_entries_cache_res + predicted_banding_cache_res;
1385
+ EXPECT_GE(filter_construction_cache_res_peak,
1386
+ predicted_filter_construction_cache_res_peak * 0.9);
1387
+ EXPECT_LE(filter_construction_cache_res_peak,
1388
+ predicted_filter_construction_cache_res_peak * 1.1);
1389
+ } else {
1390
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 1)
1391
+ << "Filter construction cache reservation should have 1 peaks in "
1392
+ "case: kStandard128Ribbon + FullFilter "
1393
+ "+ detect_filter_construct_corruption. "
1394
+ "The previous second peak now disappears since we don't "
1395
+ "decrease the hash entry reservation"
1396
+ "until after final filter reservation and post-verification";
1397
+
1398
+ std::size_t filter_construction_cache_res_peak =
1399
+ filter_construction_cache_res_peaks[0];
1400
+ std::size_t predicted_filter_construction_cache_res_peak =
1401
+ predicted_hash_entries_cache_res + predicted_banding_cache_res +
1402
+ predicted_final_filter_cache_res;
1403
+ EXPECT_GE(filter_construction_cache_res_peak,
1404
+ predicted_filter_construction_cache_res_peak * 0.9);
1405
+ EXPECT_LE(filter_construction_cache_res_peak,
1406
+ predicted_filter_construction_cache_res_peak * 1.1);
1407
+ }
1408
+ return;
1409
+ } else {
1410
+ if (!detect_filter_construct_corruption) {
1411
+ EXPECT_GE(filter_construction_cache_res_peaks.size(), 3)
1412
+ << "Filter construction cache reservation should have more than 3 "
1413
+ "peaks "
1414
+ "in case: kStandard128Ribbon + "
1415
+ "PartitionedFilter";
1416
+ } else {
1417
+ EXPECT_GE(filter_construction_cache_res_peaks.size(), 2)
1418
+ << "Filter construction cache reservation should have more than 2 "
1419
+ "peaks "
1420
+ "in case: kStandard128Ribbon + "
1421
+ "PartitionedFilter + detect_filter_construct_corruption";
1422
+ }
1423
+ std::size_t predicted_filter_construction_cache_res_increments_sum =
1424
+ predicted_hash_entries_cache_res + predicted_banding_cache_res +
1425
+ predicted_final_filter_cache_res;
1426
+ EXPECT_GE(filter_construction_cache_res_increments_sum,
1427
+ predicted_filter_construction_cache_res_increments_sum * 0.9);
1428
+ EXPECT_LE(filter_construction_cache_res_increments_sum,
1429
+ predicted_filter_construction_cache_res_increments_sum * 1.1);
1430
+ return;
645
1431
  }
646
- ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
647
1432
  }
648
1433
  }
649
1434
 
650
- namespace {
651
- // A wrapped bloom over block-based FilterPolicy
652
- class TestingWrappedBlockBasedFilterPolicy : public FilterPolicy {
1435
+ class DBFilterConstructionCorruptionTestWithParam
1436
+ : public DBTestBase,
1437
+ public testing::WithParamInterface<
1438
+ std::tuple<bool /* detect_filter_construct_corruption */, std::string,
1439
+ bool /* partition_filters */>> {
653
1440
  public:
654
- explicit TestingWrappedBlockBasedFilterPolicy(int bits_per_key)
655
- : filter_(NewBloomFilterPolicy(bits_per_key, true)), counter_(0) {}
1441
+ DBFilterConstructionCorruptionTestWithParam()
1442
+ : DBTestBase("db_bloom_filter_tests",
1443
+ /*env_do_fsync=*/true) {}
656
1444
 
657
- ~TestingWrappedBlockBasedFilterPolicy() override { delete filter_; }
1445
+ BlockBasedTableOptions GetBlockBasedTableOptions() {
1446
+ BlockBasedTableOptions table_options;
1447
+ table_options.detect_filter_construct_corruption = std::get<0>(GetParam());
1448
+ table_options.filter_policy = Create(10, std::get<1>(GetParam()));
1449
+ table_options.partition_filters = std::get<2>(GetParam());
1450
+ if (table_options.partition_filters) {
1451
+ table_options.index_type =
1452
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1453
+ // We set table_options.metadata_block_size small enough so we can
1454
+ // trigger filter partitioning with GetNumKey() amount of keys
1455
+ table_options.metadata_block_size = 10;
1456
+ }
658
1457
 
659
- const char* Name() const override {
660
- return "TestingWrappedBlockBasedFilterPolicy";
1458
+ return table_options;
661
1459
  }
662
1460
 
663
- void CreateFilter(const ROCKSDB_NAMESPACE::Slice* keys, int n,
664
- std::string* dst) const override {
665
- std::unique_ptr<ROCKSDB_NAMESPACE::Slice[]> user_keys(
666
- new ROCKSDB_NAMESPACE::Slice[n]);
667
- for (int i = 0; i < n; ++i) {
668
- user_keys[i] = convertKey(keys[i]);
669
- }
670
- return filter_->CreateFilter(user_keys.get(), n, dst);
1461
+ // Return an appropriate amount of keys for testing
1462
+ // to generate a long filter (i.e, size >= 8 + kMetadataLen)
1463
+ std::size_t GetNumKey() { return 5000; }
1464
+ };
1465
+
1466
+ INSTANTIATE_TEST_CASE_P(
1467
+ DBFilterConstructionCorruptionTestWithParam,
1468
+ DBFilterConstructionCorruptionTestWithParam,
1469
+ ::testing::Values(std::make_tuple(false, kFastLocalBloom, false),
1470
+ std::make_tuple(true, kFastLocalBloom, false),
1471
+ std::make_tuple(true, kFastLocalBloom, true),
1472
+ std::make_tuple(true, kStandard128Ribbon, false),
1473
+ std::make_tuple(true, kStandard128Ribbon, true)));
1474
+
1475
+ TEST_P(DBFilterConstructionCorruptionTestWithParam, DetectCorruption) {
1476
+ Options options = CurrentOptions();
1477
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1478
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1479
+ options.create_if_missing = true;
1480
+ options.disable_auto_compactions = true;
1481
+
1482
+ DestroyAndReopen(options);
1483
+ int num_key = static_cast<int>(GetNumKey());
1484
+ Status s;
1485
+
1486
+ // Case 1: No corruption in filter construction
1487
+ for (int i = 0; i < num_key; i++) {
1488
+ ASSERT_OK(Put(Key(i), Key(i)));
671
1489
  }
1490
+ s = Flush();
1491
+ EXPECT_TRUE(s.ok());
672
1492
 
673
- bool KeyMayMatch(const ROCKSDB_NAMESPACE::Slice& key,
674
- const ROCKSDB_NAMESPACE::Slice& filter) const override {
675
- counter_++;
676
- return filter_->KeyMayMatch(convertKey(key), filter);
1493
+ // Case 2: Corruption of hash entries in filter construction
1494
+ for (int i = 0; i < num_key; i++) {
1495
+ ASSERT_OK(Put(Key(i), Key(i)));
677
1496
  }
678
1497
 
679
- uint32_t GetCounter() { return counter_; }
1498
+ SyncPoint::GetInstance()->SetCallBack(
1499
+ "XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
1500
+ std::deque<uint64_t>* hash_entries_to_corrupt =
1501
+ (std::deque<uint64_t>*)arg;
1502
+ assert(!hash_entries_to_corrupt->empty());
1503
+ *(hash_entries_to_corrupt->begin()) =
1504
+ *(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
1505
+ });
1506
+ SyncPoint::GetInstance()->EnableProcessing();
1507
+
1508
+ s = Flush();
1509
+
1510
+ if (table_options.detect_filter_construct_corruption) {
1511
+ EXPECT_TRUE(s.IsCorruption());
1512
+ EXPECT_TRUE(
1513
+ s.ToString().find("Filter's hash entries checksum mismatched") !=
1514
+ std::string::npos);
1515
+ } else {
1516
+ EXPECT_TRUE(s.ok());
1517
+ }
680
1518
 
681
- private:
682
- const FilterPolicy* filter_;
683
- mutable uint32_t counter_;
1519
+ SyncPoint::GetInstance()->DisableProcessing();
1520
+ SyncPoint::GetInstance()->ClearCallBack(
1521
+ "XXPH3FilterBitsBuilder::Finish::"
1522
+ "TamperHashEntries");
684
1523
 
685
- ROCKSDB_NAMESPACE::Slice convertKey(
686
- const ROCKSDB_NAMESPACE::Slice& key) const {
687
- return key;
1524
+ // Case 3: Corruption of filter content in filter construction
1525
+ DestroyAndReopen(options);
1526
+
1527
+ for (int i = 0; i < num_key; i++) {
1528
+ ASSERT_OK(Put(Key(i), Key(i)));
688
1529
  }
689
- };
690
- } // namespace
691
1530
 
692
- TEST_F(DBBloomFilterTest, WrappedBlockBasedFilterPolicy) {
1531
+ SyncPoint::GetInstance()->SetCallBack(
1532
+ "XXPH3FilterBitsBuilder::Finish::TamperFilter", [&](void* arg) {
1533
+ std::pair<std::unique_ptr<char[]>*, std::size_t>* TEST_arg_pair =
1534
+ (std::pair<std::unique_ptr<char[]>*, std::size_t>*)arg;
1535
+ std::size_t filter_size = TEST_arg_pair->second;
1536
+ // 5 is the kMetadataLen and
1537
+ assert(filter_size >= 8 + 5);
1538
+ std::unique_ptr<char[]>* filter_content_to_corrupt =
1539
+ TEST_arg_pair->first;
1540
+ std::memset(filter_content_to_corrupt->get(), '\0', 8);
1541
+ });
1542
+ SyncPoint::GetInstance()->EnableProcessing();
1543
+
1544
+ s = Flush();
1545
+
1546
+ if (table_options.detect_filter_construct_corruption) {
1547
+ EXPECT_TRUE(s.IsCorruption());
1548
+ EXPECT_TRUE(s.ToString().find("Corrupted filter content") !=
1549
+ std::string::npos);
1550
+ } else {
1551
+ EXPECT_TRUE(s.ok());
1552
+ }
1553
+
1554
+ SyncPoint::GetInstance()->DisableProcessing();
1555
+ SyncPoint::GetInstance()->ClearCallBack(
1556
+ "XXPH3FilterBitsBuilder::Finish::"
1557
+ "TamperFilter");
1558
+ }
1559
+
1560
+ // RocksDB lite does not support dynamic options
1561
+ #ifndef ROCKSDB_LITE
1562
+ TEST_P(DBFilterConstructionCorruptionTestWithParam,
1563
+ DynamicallyTurnOnAndOffDetectConstructCorruption) {
693
1564
  Options options = CurrentOptions();
694
- options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
1565
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1566
+ // We intend to turn on
1567
+ // table_options.detect_filter_construct_corruption dynamically
1568
+ // therefore we override this test parmater's value
1569
+ table_options.detect_filter_construct_corruption = false;
695
1570
 
696
- BlockBasedTableOptions table_options;
697
- TestingWrappedBlockBasedFilterPolicy* policy =
698
- new TestingWrappedBlockBasedFilterPolicy(10);
699
- table_options.filter_policy.reset(policy);
700
1571
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1572
+ options.create_if_missing = true;
701
1573
 
702
- CreateAndReopenWithCF({"pikachu"}, options);
1574
+ int num_key = static_cast<int>(GetNumKey());
1575
+ Status s;
703
1576
 
704
- const int maxKey = 10000;
705
- for (int i = 0; i < maxKey; i++) {
706
- ASSERT_OK(Put(1, Key(i), Key(i)));
707
- }
708
- // Add a large key to make the file contain wide range
709
- ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
710
- ASSERT_EQ(0U, policy->GetCounter());
711
- Flush(1);
1577
+ DestroyAndReopen(options);
712
1578
 
713
- // Check if they can be found
714
- for (int i = 0; i < maxKey; i++) {
715
- ASSERT_EQ(Key(i), Get(1, Key(i)));
1579
+ // Case 1: !table_options.detect_filter_construct_corruption
1580
+ for (int i = 0; i < num_key; i++) {
1581
+ ASSERT_OK(Put(Key(i), Key(i)));
716
1582
  }
717
- ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
718
- ASSERT_EQ(1U * maxKey, policy->GetCounter());
719
1583
 
720
- // Check if filter is useful
721
- for (int i = 0; i < maxKey; i++) {
722
- ASSERT_EQ("NOT_FOUND", Get(1, Key(i + 33333)));
1584
+ SyncPoint::GetInstance()->SetCallBack(
1585
+ "XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
1586
+ std::deque<uint64_t>* hash_entries_to_corrupt =
1587
+ (std::deque<uint64_t>*)arg;
1588
+ assert(!hash_entries_to_corrupt->empty());
1589
+ *(hash_entries_to_corrupt->begin()) =
1590
+ *(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
1591
+ });
1592
+ SyncPoint::GetInstance()->EnableProcessing();
1593
+
1594
+ s = Flush();
1595
+
1596
+ SyncPoint::GetInstance()->DisableProcessing();
1597
+ SyncPoint::GetInstance()->ClearCallBack(
1598
+ "XXPH3FilterBitsBuilder::Finish::"
1599
+ "TamperHashEntries");
1600
+
1601
+ ASSERT_FALSE(table_options.detect_filter_construct_corruption);
1602
+ EXPECT_TRUE(s.ok());
1603
+
1604
+ // Case 2: dynamically turn on
1605
+ // table_options.detect_filter_construct_corruption
1606
+ ASSERT_OK(db_->SetOptions({{"block_based_table_factory",
1607
+ "{detect_filter_construct_corruption=true;}"}}));
1608
+
1609
+ for (int i = 0; i < num_key; i++) {
1610
+ ASSERT_OK(Put(Key(i), Key(i)));
723
1611
  }
724
- ASSERT_GE(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), maxKey * 0.98);
725
- ASSERT_EQ(2U * maxKey, policy->GetCounter());
1612
+
1613
+ SyncPoint::GetInstance()->SetCallBack(
1614
+ "XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
1615
+ std::deque<uint64_t>* hash_entries_to_corrupt =
1616
+ (std::deque<uint64_t>*)arg;
1617
+ assert(!hash_entries_to_corrupt->empty());
1618
+ *(hash_entries_to_corrupt->begin()) =
1619
+ *(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
1620
+ });
1621
+ SyncPoint::GetInstance()->EnableProcessing();
1622
+
1623
+ s = Flush();
1624
+
1625
+ SyncPoint::GetInstance()->DisableProcessing();
1626
+ SyncPoint::GetInstance()->ClearCallBack(
1627
+ "XXPH3FilterBitsBuilder::Finish::"
1628
+ "TamperHashEntries");
1629
+
1630
+ auto updated_table_options =
1631
+ db_->GetOptions().table_factory->GetOptions<BlockBasedTableOptions>();
1632
+ EXPECT_TRUE(updated_table_options->detect_filter_construct_corruption);
1633
+ EXPECT_TRUE(s.IsCorruption());
1634
+ EXPECT_TRUE(s.ToString().find("Filter's hash entries checksum mismatched") !=
1635
+ std::string::npos);
1636
+
1637
+ // Case 3: dynamically turn off
1638
+ // table_options.detect_filter_construct_corruption
1639
+ ASSERT_OK(db_->SetOptions({{"block_based_table_factory",
1640
+ "{detect_filter_construct_corruption=false;}"}}));
1641
+ updated_table_options =
1642
+ db_->GetOptions().table_factory->GetOptions<BlockBasedTableOptions>();
1643
+ EXPECT_FALSE(updated_table_options->detect_filter_construct_corruption);
726
1644
  }
1645
+ #endif // ROCKSDB_LITE
727
1646
 
728
1647
  namespace {
729
1648
  // NOTE: This class is referenced by HISTORY.md as a model for a wrapper
@@ -736,9 +1655,15 @@ class LevelAndStyleCustomFilterPolicy : public FilterPolicy {
736
1655
  policy_l0_other_(NewBloomFilterPolicy(bpk_l0_other)),
737
1656
  policy_otherwise_(NewBloomFilterPolicy(bpk_otherwise)) {}
738
1657
 
1658
+ const char* Name() const override {
1659
+ return "LevelAndStyleCustomFilterPolicy";
1660
+ }
1661
+
739
1662
  // OK to use built-in policy name because we are deferring to a
740
1663
  // built-in builder. We aren't changing the serialized format.
741
- const char* Name() const override { return policy_fifo_->Name(); }
1664
+ const char* CompatibilityName() const override {
1665
+ return policy_fifo_->CompatibilityName();
1666
+ }
742
1667
 
743
1668
  FilterBitsBuilder* GetBuilderWithContext(
744
1669
  const FilterBuildingContext& context) const override {
@@ -757,20 +1682,20 @@ class LevelAndStyleCustomFilterPolicy : public FilterPolicy {
757
1682
  return policy_fifo_->GetFilterBitsReader(contents);
758
1683
  }
759
1684
 
760
- // Defer just in case configuration uses block-based filter
761
- void CreateFilter(const Slice* keys, int n, std::string* dst) const override {
762
- policy_otherwise_->CreateFilter(keys, n, dst);
763
- }
764
- bool KeyMayMatch(const Slice& key, const Slice& filter) const override {
765
- return policy_otherwise_->KeyMayMatch(key, filter);
766
- }
767
-
768
1685
  private:
769
1686
  const std::unique_ptr<const FilterPolicy> policy_fifo_;
770
1687
  const std::unique_ptr<const FilterPolicy> policy_l0_other_;
771
1688
  const std::unique_ptr<const FilterPolicy> policy_otherwise_;
772
1689
  };
773
1690
 
1691
+ static std::map<TableFileCreationReason, std::string>
1692
+ table_file_creation_reason_to_string{
1693
+ {TableFileCreationReason::kCompaction, "kCompaction"},
1694
+ {TableFileCreationReason::kFlush, "kFlush"},
1695
+ {TableFileCreationReason::kMisc, "kMisc"},
1696
+ {TableFileCreationReason::kRecovery, "kRecovery"},
1697
+ };
1698
+
774
1699
  class TestingContextCustomFilterPolicy
775
1700
  : public LevelAndStyleCustomFilterPolicy {
776
1701
  public:
@@ -783,11 +1708,17 @@ class TestingContextCustomFilterPolicy
783
1708
  const FilterBuildingContext& context) const override {
784
1709
  test_report_ += "cf=";
785
1710
  test_report_ += context.column_family_name;
786
- test_report_ += ",cs=";
1711
+ test_report_ += ",s=";
787
1712
  test_report_ +=
788
1713
  OptionsHelper::compaction_style_to_string[context.compaction_style];
789
- test_report_ += ",lv=";
790
- test_report_ += std::to_string(context.level_at_creation);
1714
+ test_report_ += ",n=";
1715
+ test_report_ += ROCKSDB_NAMESPACE::ToString(context.num_levels);
1716
+ test_report_ += ",l=";
1717
+ test_report_ += ROCKSDB_NAMESPACE::ToString(context.level_at_creation);
1718
+ test_report_ += ",b=";
1719
+ test_report_ += ROCKSDB_NAMESPACE::ToString(int{context.is_bottommost});
1720
+ test_report_ += ",r=";
1721
+ test_report_ += table_file_creation_reason_to_string[context.reason];
791
1722
  test_report_ += "\n";
792
1723
 
793
1724
  return LevelAndStyleCustomFilterPolicy::GetBuilderWithContext(context);
@@ -805,18 +1736,21 @@ class TestingContextCustomFilterPolicy
805
1736
  } // namespace
806
1737
 
807
1738
  TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
1739
+ auto policy = std::make_shared<TestingContextCustomFilterPolicy>(15, 8, 5);
1740
+ Options options;
808
1741
  for (bool fifo : {true, false}) {
809
- Options options = CurrentOptions();
1742
+ options = CurrentOptions();
1743
+ options.max_open_files = fifo ? -1 : options.max_open_files;
810
1744
  options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
811
1745
  options.compaction_style =
812
1746
  fifo ? kCompactionStyleFIFO : kCompactionStyleLevel;
813
1747
 
814
1748
  BlockBasedTableOptions table_options;
815
- auto policy = std::make_shared<TestingContextCustomFilterPolicy>(15, 8, 5);
816
1749
  table_options.filter_policy = policy;
817
1750
  table_options.format_version = 5;
818
1751
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
819
1752
 
1753
+ TryReopen(options);
820
1754
  CreateAndReopenWithCF({fifo ? "abe" : "bob"}, options);
821
1755
 
822
1756
  const int maxKey = 10000;
@@ -827,16 +1761,16 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
827
1761
  ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
828
1762
  Flush(1);
829
1763
  EXPECT_EQ(policy->DumpTestReport(),
830
- fifo ? "cf=abe,cs=kCompactionStyleFIFO,lv=0\n"
831
- : "cf=bob,cs=kCompactionStyleLevel,lv=0\n");
1764
+ fifo ? "cf=abe,s=kCompactionStyleFIFO,n=1,l=0,b=0,r=kFlush\n"
1765
+ : "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
832
1766
 
833
1767
  for (int i = maxKey / 2; i < maxKey; i++) {
834
1768
  ASSERT_OK(Put(1, Key(i), Key(i)));
835
1769
  }
836
1770
  Flush(1);
837
1771
  EXPECT_EQ(policy->DumpTestReport(),
838
- fifo ? "cf=abe,cs=kCompactionStyleFIFO,lv=0\n"
839
- : "cf=bob,cs=kCompactionStyleLevel,lv=0\n");
1772
+ fifo ? "cf=abe,s=kCompactionStyleFIFO,n=1,l=0,b=0,r=kFlush\n"
1773
+ : "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
840
1774
 
841
1775
  // Check that they can be found
842
1776
  for (int i = 0; i < maxKey; i++) {
@@ -864,7 +1798,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
864
1798
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), handles_[1], nullptr,
865
1799
  nullptr));
866
1800
  EXPECT_EQ(policy->DumpTestReport(),
867
- "cf=bob,cs=kCompactionStyleLevel,lv=1\n");
1801
+ "cf=bob,s=kCompactionStyleLevel,n=7,l=1,b=1,r=kCompaction\n");
868
1802
 
869
1803
  // Check that we now have one filter, about 9.2% FP rate (5 bits per key)
870
1804
  for (int i = 0; i < maxKey; i++) {
@@ -876,6 +1810,20 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
876
1810
  EXPECT_GE(useful_count, maxKey * 0.90);
877
1811
  EXPECT_LE(useful_count, maxKey * 0.91);
878
1812
  }
1813
+ } else {
1814
+ #ifndef ROCKSDB_LITE
1815
+ // Also try external SST file
1816
+ {
1817
+ std::string file_path = dbname_ + "/external.sst";
1818
+ SstFileWriter sst_file_writer(EnvOptions(), options, handles_[1]);
1819
+ ASSERT_OK(sst_file_writer.Open(file_path));
1820
+ ASSERT_OK(sst_file_writer.Put("key", "value"));
1821
+ ASSERT_OK(sst_file_writer.Finish());
1822
+ }
1823
+ // Note: kCompactionStyleLevel is default, ignored if num_levels == -1
1824
+ EXPECT_EQ(policy->DumpTestReport(),
1825
+ "cf=abe,s=kCompactionStyleLevel,n=-1,l=-1,b=0,r=kMisc\n");
1826
+ #endif
879
1827
  }
880
1828
 
881
1829
  // Destroy
@@ -1016,6 +1964,63 @@ TEST_F(DBBloomFilterTest, MemtableWholeKeyBloomFilter) {
1016
1964
  ASSERT_EQ(1, get_perf_context()->bloom_memtable_hit_count);
1017
1965
  }
1018
1966
 
1967
+ TEST_F(DBBloomFilterTest, MemtableWholeKeyBloomFilterMultiGet) {
1968
+ Options options = CurrentOptions();
1969
+ options.memtable_prefix_bloom_size_ratio = 0.015;
1970
+ options.memtable_whole_key_filtering = true;
1971
+ Reopen(options);
1972
+ std::string key1("AA");
1973
+ std::string key2("BB");
1974
+ std::string key3("CC");
1975
+ std::string key4("DD");
1976
+ std::string key_not("EE");
1977
+ std::string value1("Value1");
1978
+ std::string value2("Value2");
1979
+ std::string value3("Value3");
1980
+ std::string value4("Value4");
1981
+
1982
+ ASSERT_OK(Put(key1, value1, WriteOptions()));
1983
+ ASSERT_OK(Put(key2, value2, WriteOptions()));
1984
+ ASSERT_OK(Flush());
1985
+ ASSERT_OK(Put(key3, value3, WriteOptions()));
1986
+ const Snapshot* snapshot = db_->GetSnapshot();
1987
+ ASSERT_OK(Put(key4, value4, WriteOptions()));
1988
+
1989
+ // Delete key2 and key3
1990
+ ASSERT_OK(
1991
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "BA", "CZ"));
1992
+
1993
+ // Read without snapshot
1994
+ auto results = MultiGet({key_not, key1, key2, key3, key4});
1995
+ ASSERT_EQ(results[0], "NOT_FOUND");
1996
+ ASSERT_EQ(results[1], value1);
1997
+ ASSERT_EQ(results[2], "NOT_FOUND");
1998
+ ASSERT_EQ(results[3], "NOT_FOUND");
1999
+ ASSERT_EQ(results[4], value4);
2000
+
2001
+ // Also check Get
2002
+ ASSERT_EQ(Get(key1), value1);
2003
+ ASSERT_EQ(Get(key2), "NOT_FOUND");
2004
+ ASSERT_EQ(Get(key3), "NOT_FOUND");
2005
+ ASSERT_EQ(Get(key4), value4);
2006
+
2007
+ // Read with snapshot
2008
+ results = MultiGet({key_not, key1, key2, key3, key4}, snapshot);
2009
+ ASSERT_EQ(results[0], "NOT_FOUND");
2010
+ ASSERT_EQ(results[1], value1);
2011
+ ASSERT_EQ(results[2], value2);
2012
+ ASSERT_EQ(results[3], value3);
2013
+ ASSERT_EQ(results[4], "NOT_FOUND");
2014
+
2015
+ // Also check Get
2016
+ ASSERT_EQ(Get(key1, snapshot), value1);
2017
+ ASSERT_EQ(Get(key2, snapshot), value2);
2018
+ ASSERT_EQ(Get(key3, snapshot), value3);
2019
+ ASSERT_EQ(Get(key4, snapshot), "NOT_FOUND");
2020
+
2021
+ db_->ReleaseSnapshot(snapshot);
2022
+ }
2023
+
1019
2024
  TEST_F(DBBloomFilterTest, MemtablePrefixBloomOutOfDomain) {
1020
2025
  constexpr size_t kPrefixSize = 8;
1021
2026
  const std::string kKey = "key";
@@ -1044,7 +2049,7 @@ class DBBloomFilterTestVaryPrefixAndFormatVer
1044
2049
 
1045
2050
  public:
1046
2051
  DBBloomFilterTestVaryPrefixAndFormatVer()
1047
- : DBTestBase("/db_bloom_filter_tests", /*env_do_fsync=*/true) {}
2052
+ : DBTestBase("db_bloom_filter_tests", /*env_do_fsync=*/true) {}
1048
2053
 
1049
2054
  ~DBBloomFilterTestVaryPrefixAndFormatVer() override {}
1050
2055
 
@@ -1246,16 +2251,12 @@ INSTANTIATE_TEST_CASE_P(DBBloomFilterTestVaryPrefixAndFormatVer,
1246
2251
 
1247
2252
  #ifndef ROCKSDB_LITE
1248
2253
  namespace {
1249
- namespace BFP2 {
1250
- // Extends BFP::Mode with option to use Plain table
1251
- using PseudoMode = int;
1252
- static constexpr PseudoMode kPlainTable = -1;
1253
- } // namespace BFP2
2254
+ static const std::string kPlainTable = "test_PlainTableBloom";
1254
2255
  } // namespace
1255
2256
 
1256
2257
  class BloomStatsTestWithParam
1257
2258
  : public DBBloomFilterTest,
1258
- public testing::WithParamInterface<std::tuple<BFP2::PseudoMode, bool>> {
2259
+ public testing::WithParamInterface<std::tuple<std::string, bool>> {
1259
2260
  public:
1260
2261
  BloomStatsTestWithParam() {
1261
2262
  bfp_impl_ = std::get<0>(GetParam());
@@ -1266,21 +2267,19 @@ class BloomStatsTestWithParam
1266
2267
  ROCKSDB_NAMESPACE::NewFixedPrefixTransform(4));
1267
2268
  options_.memtable_prefix_bloom_size_ratio =
1268
2269
  8.0 * 1024.0 / static_cast<double>(options_.write_buffer_size);
1269
- if (bfp_impl_ == BFP2::kPlainTable) {
2270
+ if (bfp_impl_ == kPlainTable) {
1270
2271
  assert(!partition_filters_); // not supported in plain table
1271
2272
  PlainTableOptions table_options;
1272
2273
  options_.table_factory.reset(NewPlainTableFactory(table_options));
1273
2274
  } else {
1274
2275
  BlockBasedTableOptions table_options;
1275
- table_options.hash_index_allow_collision = false;
1276
2276
  if (partition_filters_) {
1277
- assert(bfp_impl_ != BFP::kDeprecatedBlock);
2277
+ assert(bfp_impl_ != kDeprecatedBlock);
1278
2278
  table_options.partition_filters = partition_filters_;
1279
2279
  table_options.index_type =
1280
2280
  BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1281
2281
  }
1282
- table_options.filter_policy.reset(
1283
- new BFP(10, static_cast<BFP::Mode>(bfp_impl_)));
2282
+ table_options.filter_policy = Create(10, bfp_impl_);
1284
2283
  options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
1285
2284
  }
1286
2285
  options_.env = env_;
@@ -1298,7 +2297,7 @@ class BloomStatsTestWithParam
1298
2297
  static void SetUpTestCase() {}
1299
2298
  static void TearDownTestCase() {}
1300
2299
 
1301
- BFP2::PseudoMode bfp_impl_;
2300
+ std::string bfp_impl_;
1302
2301
  bool partition_filters_;
1303
2302
  Options options_;
1304
2303
  };
@@ -1402,7 +2401,7 @@ TEST_P(BloomStatsTestWithParam, BloomStatsTestWithIter) {
1402
2401
  ASSERT_EQ(value3, iter->value().ToString());
1403
2402
  // The seek doesn't check block-based bloom filter because last index key
1404
2403
  // starts with the same prefix we're seeking to.
1405
- uint64_t expected_hits = bfp_impl_ == BFP::kDeprecatedBlock ? 1 : 2;
2404
+ uint64_t expected_hits = bfp_impl_ == kDeprecatedBlock ? 1 : 2;
1406
2405
  ASSERT_EQ(expected_hits, get_perf_context()->bloom_sst_hit_count);
1407
2406
 
1408
2407
  iter->Seek(key2);
@@ -1414,12 +2413,12 @@ TEST_P(BloomStatsTestWithParam, BloomStatsTestWithIter) {
1414
2413
 
1415
2414
  INSTANTIATE_TEST_CASE_P(
1416
2415
  BloomStatsTestWithParam, BloomStatsTestWithParam,
1417
- ::testing::Values(std::make_tuple(BFP::kDeprecatedBlock, false),
1418
- std::make_tuple(BFP::kLegacyBloom, false),
1419
- std::make_tuple(BFP::kLegacyBloom, true),
1420
- std::make_tuple(BFP::kFastLocalBloom, false),
1421
- std::make_tuple(BFP::kFastLocalBloom, true),
1422
- std::make_tuple(BFP2::kPlainTable, false)));
2416
+ ::testing::Values(std::make_tuple(kDeprecatedBlock, false),
2417
+ std::make_tuple(kLegacyBloom, false),
2418
+ std::make_tuple(kLegacyBloom, true),
2419
+ std::make_tuple(kFastLocalBloom, false),
2420
+ std::make_tuple(kFastLocalBloom, true),
2421
+ std::make_tuple(kPlainTable, false)));
1423
2422
 
1424
2423
  namespace {
1425
2424
  void PrefixScanInit(DBBloomFilterTest* dbtest) {
@@ -1727,8 +2726,8 @@ int CountIter(std::unique_ptr<Iterator>& iter, const Slice& key) {
1727
2726
  // into the same string, or 2) the transformed seek key is of the same length
1728
2727
  // as the upper bound and two keys are adjacent according to the comparator.
1729
2728
  TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
1730
- for (auto bfp_impl : BFP::kAllFixedImpls) {
1731
- int using_full_builder = bfp_impl != BFP::kDeprecatedBlock;
2729
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
2730
+ int using_full_builder = bfp_impl != kDeprecatedBlock;
1732
2731
  Options options;
1733
2732
  options.create_if_missing = true;
1734
2733
  options.env = CurrentOptions().env;
@@ -1738,7 +2737,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
1738
2737
  // Enable prefix bloom for SST files
1739
2738
  BlockBasedTableOptions table_options;
1740
2739
  table_options.cache_index_and_filter_blocks = true;
1741
- table_options.filter_policy.reset(new BFP(10, bfp_impl));
2740
+ table_options.filter_policy = Create(10, bfp_impl);
1742
2741
  table_options.index_shortening = BlockBasedTableOptions::
1743
2742
  IndexShorteningMode::kShortenSeparatorsAndSuccessor;
1744
2743
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
@@ -1769,8 +2768,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
1769
2768
  ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
1770
2769
  }
1771
2770
  ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:5"}}));
1772
- ASSERT_EQ(0, strcmp(dbfull()->GetOptions().prefix_extractor->Name(),
1773
- "rocksdb.FixedPrefix.5"));
2771
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2772
+ "rocksdb.FixedPrefix.5");
1774
2773
  {
1775
2774
  // BF changed, [abcdxx00, abce) is a valid bound, will trigger BF read
1776
2775
  Slice upper_bound("abce");
@@ -1859,8 +2858,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
1859
2858
  // Create multiple SST files each with a different prefix_extractor config,
1860
2859
  // verify iterators can read all SST files using the latest config.
1861
2860
  TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
1862
- for (auto bfp_impl : BFP::kAllFixedImpls) {
1863
- int using_full_builder = bfp_impl != BFP::kDeprecatedBlock;
2861
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
2862
+ int using_full_builder = bfp_impl != kDeprecatedBlock;
1864
2863
  Options options;
1865
2864
  options.env = CurrentOptions().env;
1866
2865
  options.create_if_missing = true;
@@ -1869,7 +2868,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
1869
2868
  options.statistics = CreateDBStatistics();
1870
2869
  // Enable prefix bloom for SST files
1871
2870
  BlockBasedTableOptions table_options;
1872
- table_options.filter_policy.reset(new BFP(10, bfp_impl));
2871
+ table_options.filter_policy = Create(10, bfp_impl);
1873
2872
  table_options.cache_index_and_filter_blocks = true;
1874
2873
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1875
2874
  DestroyAndReopen(options);
@@ -1889,8 +2888,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
1889
2888
  ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_CHECKED), 1);
1890
2889
 
1891
2890
  ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
1892
- ASSERT_EQ(0, strcmp(dbfull()->GetOptions().prefix_extractor->Name(),
1893
- "rocksdb.CappedPrefix.3"));
2891
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2892
+ "rocksdb.CappedPrefix.3");
1894
2893
  read_options.iterate_upper_bound = &upper_bound;
1895
2894
  std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
1896
2895
  ASSERT_EQ(CountIter(iter, "foo"), 2);
@@ -1923,8 +2922,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
1923
2922
  }
1924
2923
 
1925
2924
  ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:2"}}));
1926
- ASSERT_EQ(0, strcmp(dbfull()->GetOptions().prefix_extractor->Name(),
1927
- "rocksdb.FixedPrefix.2"));
2925
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2926
+ "rocksdb.FixedPrefix.2");
1928
2927
  // third SST with fixed:2 BF
1929
2928
  ASSERT_OK(Put("foo6", "bar6"));
1930
2929
  ASSERT_OK(Put("foo7", "bar7"));
@@ -1971,8 +2970,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
1971
2970
  ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 3);
1972
2971
  }
1973
2972
  ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
1974
- ASSERT_EQ(0, strcmp(dbfull()->GetOptions().prefix_extractor->Name(),
1975
- "rocksdb.CappedPrefix.3"));
2973
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2974
+ "rocksdb.CappedPrefix.3");
1976
2975
  {
1977
2976
  std::unique_ptr<Iterator> iter_all(db_->NewIterator(read_options));
1978
2977
  ASSERT_EQ(CountIter(iter_all, "foo"), 6);
@@ -1995,7 +2994,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
1995
2994
  // as expected
1996
2995
  TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
1997
2996
  int iteration = 0;
1998
- for (auto bfp_impl : BFP::kAllFixedImpls) {
2997
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
1999
2998
  Options options = CurrentOptions();
2000
2999
  options.create_if_missing = true;
2001
3000
  options.prefix_extractor.reset(NewFixedPrefixTransform(1));
@@ -2004,7 +3003,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
2004
3003
  // Enable prefix bloom for SST files
2005
3004
  BlockBasedTableOptions table_options;
2006
3005
  table_options.cache_index_and_filter_blocks = true;
2007
- table_options.filter_policy.reset(new BFP(10, bfp_impl));
3006
+ table_options.filter_policy = Create(10, bfp_impl);
2008
3007
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2009
3008
  CreateAndReopenWithCF({"pikachu" + std::to_string(iteration)}, options);
2010
3009
  ReadOptions read_options;
@@ -2012,9 +3011,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
2012
3011
  // create a new CF and set prefix_extractor dynamically
2013
3012
  options.prefix_extractor.reset(NewCappedPrefixTransform(3));
2014
3013
  CreateColumnFamilies({"ramen_dojo_" + std::to_string(iteration)}, options);
2015
- ASSERT_EQ(0,
2016
- strcmp(dbfull()->GetOptions(handles_[2]).prefix_extractor->Name(),
2017
- "rocksdb.CappedPrefix.3"));
3014
+ ASSERT_EQ(dbfull()->GetOptions(handles_[2]).prefix_extractor->AsString(),
3015
+ "rocksdb.CappedPrefix.3");
2018
3016
  ASSERT_OK(Put(2, "foo3", "bar3"));
2019
3017
  ASSERT_OK(Put(2, "foo4", "bar4"));
2020
3018
  ASSERT_OK(Put(2, "foo5", "bar5"));
@@ -2030,9 +3028,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
2030
3028
  }
2031
3029
  ASSERT_OK(
2032
3030
  dbfull()->SetOptions(handles_[2], {{"prefix_extractor", "fixed:2"}}));
2033
- ASSERT_EQ(0,
2034
- strcmp(dbfull()->GetOptions(handles_[2]).prefix_extractor->Name(),
2035
- "rocksdb.FixedPrefix.2"));
3031
+ ASSERT_EQ(dbfull()->GetOptions(handles_[2]).prefix_extractor->AsString(),
3032
+ "rocksdb.FixedPrefix.2");
2036
3033
  {
2037
3034
  std::unique_ptr<Iterator> iter(
2038
3035
  db_->NewIterator(read_options, handles_[2]));
@@ -2053,7 +3050,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
2053
3050
  // Verify it's possible to change prefix_extractor at runtime and iterators
2054
3051
  // behaves as expected
2055
3052
  TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
2056
- for (auto bfp_impl : BFP::kAllFixedImpls) {
3053
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
2057
3054
  Options options;
2058
3055
  options.env = CurrentOptions().env;
2059
3056
  options.create_if_missing = true;
@@ -2063,7 +3060,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
2063
3060
  // Enable prefix bloom for SST files
2064
3061
  BlockBasedTableOptions table_options;
2065
3062
  table_options.cache_index_and_filter_blocks = true;
2066
- table_options.filter_policy.reset(new BFP(10, bfp_impl));
3063
+ table_options.filter_policy = Create(10, bfp_impl);
2067
3064
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2068
3065
  DestroyAndReopen(options);
2069
3066
 
@@ -2097,8 +3094,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
2097
3094
  ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
2098
3095
 
2099
3096
  ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
2100
- ASSERT_EQ(0, strcmp(dbfull()->GetOptions().prefix_extractor->Name(),
2101
- "rocksdb.CappedPrefix.3"));
3097
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
3098
+ "rocksdb.CappedPrefix.3");
2102
3099
  {
2103
3100
  std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2104
3101
  // "fp*" should be skipped
@@ -2117,6 +3114,55 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
2117
3114
  }
2118
3115
  }
2119
3116
 
3117
+ TEST_F(DBBloomFilterTest, SeekForPrevWithPartitionedFilters) {
3118
+ Options options = CurrentOptions();
3119
+ constexpr size_t kNumKeys = 10000;
3120
+ static_assert(kNumKeys <= 10000, "kNumKeys have to be <= 10000");
3121
+ options.memtable_factory.reset(
3122
+ test::NewSpecialSkipListFactory(kNumKeys + 10));
3123
+ options.create_if_missing = true;
3124
+ constexpr size_t kPrefixLength = 4;
3125
+ options.prefix_extractor.reset(NewFixedPrefixTransform(kPrefixLength));
3126
+ options.compression = kNoCompression;
3127
+ BlockBasedTableOptions bbto;
3128
+ bbto.filter_policy.reset(NewBloomFilterPolicy(50));
3129
+ bbto.index_shortening =
3130
+ BlockBasedTableOptions::IndexShorteningMode::kNoShortening;
3131
+ bbto.block_size = 128;
3132
+ bbto.metadata_block_size = 128;
3133
+ bbto.partition_filters = true;
3134
+ bbto.index_type = BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
3135
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
3136
+ DestroyAndReopen(options);
3137
+
3138
+ const std::string value(64, '\0');
3139
+
3140
+ WriteOptions write_opts;
3141
+ write_opts.disableWAL = true;
3142
+ for (size_t i = 0; i < kNumKeys; ++i) {
3143
+ std::ostringstream oss;
3144
+ oss << std::setfill('0') << std::setw(4) << std::fixed << i;
3145
+ ASSERT_OK(db_->Put(write_opts, oss.str(), value));
3146
+ }
3147
+ ASSERT_OK(Flush());
3148
+
3149
+ ReadOptions read_opts;
3150
+ // Use legacy, implicit prefix seek
3151
+ read_opts.total_order_seek = false;
3152
+ read_opts.auto_prefix_mode = false;
3153
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
3154
+ for (size_t i = 0; i < kNumKeys; ++i) {
3155
+ // Seek with a key after each one added but with same prefix. One will
3156
+ // surely cross a partition boundary.
3157
+ std::ostringstream oss;
3158
+ oss << std::setfill('0') << std::setw(4) << std::fixed << i << "a";
3159
+ it->SeekForPrev(oss.str());
3160
+ ASSERT_OK(it->status());
3161
+ ASSERT_TRUE(it->Valid());
3162
+ }
3163
+ it.reset();
3164
+ }
3165
+
2120
3166
  #endif // ROCKSDB_LITE
2121
3167
 
2122
3168
  } // namespace ROCKSDB_NAMESPACE