rocksdb-native 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1951) hide show
  1. package/.clang-format +15 -0
  2. package/.github/workflows/test-node.yml +23 -0
  3. package/.gitmodules +4 -0
  4. package/CMakeLists.txt +33 -0
  5. package/LICENSE +201 -0
  6. package/NOTICE +13 -0
  7. package/README.md +15 -0
  8. package/binding.c +470 -0
  9. package/binding.js +1 -0
  10. package/index.js +276 -0
  11. package/package.json +19 -0
  12. package/vendor/rocksdb/.circleci/config.yml +892 -0
  13. package/vendor/rocksdb/.circleci/ubsan_suppression_list.txt +6 -0
  14. package/vendor/rocksdb/.clang-format +5 -0
  15. package/vendor/rocksdb/.github/workflows/sanity_check.yml +47 -0
  16. package/vendor/rocksdb/.lgtm.yml +4 -0
  17. package/vendor/rocksdb/AUTHORS +12 -0
  18. package/vendor/rocksdb/CMakeLists.txt +1591 -0
  19. package/vendor/rocksdb/CODE_OF_CONDUCT.md +77 -0
  20. package/vendor/rocksdb/CONTRIBUTING.md +17 -0
  21. package/vendor/rocksdb/COPYING +339 -0
  22. package/vendor/rocksdb/DEFAULT_OPTIONS_HISTORY.md +24 -0
  23. package/vendor/rocksdb/DUMP_FORMAT.md +16 -0
  24. package/vendor/rocksdb/HISTORY.md +2399 -0
  25. package/vendor/rocksdb/INSTALL.md +220 -0
  26. package/vendor/rocksdb/LANGUAGE-BINDINGS.md +26 -0
  27. package/vendor/rocksdb/LICENSE.Apache +202 -0
  28. package/vendor/rocksdb/LICENSE.leveldb +29 -0
  29. package/vendor/rocksdb/Makefile +2579 -0
  30. package/vendor/rocksdb/PLUGINS.md +8 -0
  31. package/vendor/rocksdb/README.md +29 -0
  32. package/vendor/rocksdb/TARGETS +5599 -0
  33. package/vendor/rocksdb/USERS.md +165 -0
  34. package/vendor/rocksdb/Vagrantfile +39 -0
  35. package/vendor/rocksdb/WINDOWS_PORT.md +228 -0
  36. package/vendor/rocksdb/buckifier/bench-slow.json +6163 -0
  37. package/vendor/rocksdb/buckifier/bench.json +1594 -0
  38. package/vendor/rocksdb/buckifier/buckify_rocksdb.py +333 -0
  39. package/vendor/rocksdb/buckifier/check_buck_targets.sh +32 -0
  40. package/vendor/rocksdb/buckifier/rocks_test_runner.sh +6 -0
  41. package/vendor/rocksdb/buckifier/targets_builder.py +150 -0
  42. package/vendor/rocksdb/buckifier/targets_cfg.py +41 -0
  43. package/vendor/rocksdb/buckifier/util.py +118 -0
  44. package/vendor/rocksdb/build_tools/amalgamate.py +168 -0
  45. package/vendor/rocksdb/build_tools/benchmark_log_tool.py +238 -0
  46. package/vendor/rocksdb/build_tools/build_detect_platform +804 -0
  47. package/vendor/rocksdb/build_tools/check-sources.sh +48 -0
  48. package/vendor/rocksdb/build_tools/dependencies_platform010.sh +22 -0
  49. package/vendor/rocksdb/build_tools/dockerbuild.sh +3 -0
  50. package/vendor/rocksdb/build_tools/error_filter.py +181 -0
  51. package/vendor/rocksdb/build_tools/fb_compile_mongo.sh +55 -0
  52. package/vendor/rocksdb/build_tools/fbcode_config.sh +175 -0
  53. package/vendor/rocksdb/build_tools/fbcode_config_platform010.sh +175 -0
  54. package/vendor/rocksdb/build_tools/format-diff.sh +203 -0
  55. package/vendor/rocksdb/build_tools/gnu_parallel +7971 -0
  56. package/vendor/rocksdb/build_tools/make_package.sh +129 -0
  57. package/vendor/rocksdb/build_tools/ps_with_stack +38 -0
  58. package/vendor/rocksdb/build_tools/regression_build_test.sh +396 -0
  59. package/vendor/rocksdb/build_tools/run_ci_db_test.ps1 +493 -0
  60. package/vendor/rocksdb/build_tools/setup_centos7.sh +45 -0
  61. package/vendor/rocksdb/build_tools/ubuntu20_image/Dockerfile +57 -0
  62. package/vendor/rocksdb/build_tools/update_dependencies.sh +106 -0
  63. package/vendor/rocksdb/build_tools/version.sh +23 -0
  64. package/vendor/rocksdb/cache/cache.cc +158 -0
  65. package/vendor/rocksdb/cache/cache_bench.cc +20 -0
  66. package/vendor/rocksdb/cache/cache_bench_tool.cc +969 -0
  67. package/vendor/rocksdb/cache/cache_entry_roles.cc +104 -0
  68. package/vendor/rocksdb/cache/cache_entry_roles.h +20 -0
  69. package/vendor/rocksdb/cache/cache_entry_stats.h +182 -0
  70. package/vendor/rocksdb/cache/cache_helpers.cc +40 -0
  71. package/vendor/rocksdb/cache/cache_helpers.h +139 -0
  72. package/vendor/rocksdb/cache/cache_key.cc +364 -0
  73. package/vendor/rocksdb/cache/cache_key.h +143 -0
  74. package/vendor/rocksdb/cache/cache_reservation_manager.cc +184 -0
  75. package/vendor/rocksdb/cache/cache_reservation_manager.h +317 -0
  76. package/vendor/rocksdb/cache/cache_reservation_manager_test.cc +469 -0
  77. package/vendor/rocksdb/cache/cache_test.cc +1061 -0
  78. package/vendor/rocksdb/cache/charged_cache.cc +109 -0
  79. package/vendor/rocksdb/cache/charged_cache.h +59 -0
  80. package/vendor/rocksdb/cache/clock_cache.cc +1482 -0
  81. package/vendor/rocksdb/cache/clock_cache.h +707 -0
  82. package/vendor/rocksdb/cache/compressed_secondary_cache.cc +304 -0
  83. package/vendor/rocksdb/cache/compressed_secondary_cache.h +132 -0
  84. package/vendor/rocksdb/cache/compressed_secondary_cache_test.cc +983 -0
  85. package/vendor/rocksdb/cache/lru_cache.cc +723 -0
  86. package/vendor/rocksdb/cache/lru_cache.h +467 -0
  87. package/vendor/rocksdb/cache/lru_cache_test.cc +2559 -0
  88. package/vendor/rocksdb/cache/secondary_cache.cc +44 -0
  89. package/vendor/rocksdb/cache/secondary_cache_adapter.cc +295 -0
  90. package/vendor/rocksdb/cache/secondary_cache_adapter.h +52 -0
  91. package/vendor/rocksdb/cache/sharded_cache.cc +137 -0
  92. package/vendor/rocksdb/cache/sharded_cache.h +309 -0
  93. package/vendor/rocksdb/cache/typed_cache.h +375 -0
  94. package/vendor/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  95. package/vendor/rocksdb/common.mk +30 -0
  96. package/vendor/rocksdb/crash_test.mk +107 -0
  97. package/vendor/rocksdb/db/arena_wrapped_db_iter.cc +163 -0
  98. package/vendor/rocksdb/db/arena_wrapped_db_iter.h +127 -0
  99. package/vendor/rocksdb/db/blob/blob_constants.h +16 -0
  100. package/vendor/rocksdb/db/blob/blob_contents.cc +42 -0
  101. package/vendor/rocksdb/db/blob/blob_contents.h +59 -0
  102. package/vendor/rocksdb/db/blob/blob_counting_iterator.h +150 -0
  103. package/vendor/rocksdb/db/blob/blob_counting_iterator_test.cc +327 -0
  104. package/vendor/rocksdb/db/blob/blob_fetcher.cc +34 -0
  105. package/vendor/rocksdb/db/blob/blob_fetcher.h +37 -0
  106. package/vendor/rocksdb/db/blob/blob_file_addition.cc +156 -0
  107. package/vendor/rocksdb/db/blob/blob_file_addition.h +67 -0
  108. package/vendor/rocksdb/db/blob/blob_file_addition_test.cc +211 -0
  109. package/vendor/rocksdb/db/blob/blob_file_builder.cc +426 -0
  110. package/vendor/rocksdb/db/blob/blob_file_builder.h +112 -0
  111. package/vendor/rocksdb/db/blob/blob_file_builder_test.cc +680 -0
  112. package/vendor/rocksdb/db/blob/blob_file_cache.cc +101 -0
  113. package/vendor/rocksdb/db/blob/blob_file_cache.h +56 -0
  114. package/vendor/rocksdb/db/blob/blob_file_cache_test.cc +278 -0
  115. package/vendor/rocksdb/db/blob/blob_file_completion_callback.h +84 -0
  116. package/vendor/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  117. package/vendor/rocksdb/db/blob/blob_file_garbage.h +57 -0
  118. package/vendor/rocksdb/db/blob/blob_file_garbage_test.cc +174 -0
  119. package/vendor/rocksdb/db/blob/blob_file_meta.cc +62 -0
  120. package/vendor/rocksdb/db/blob/blob_file_meta.h +170 -0
  121. package/vendor/rocksdb/db/blob/blob_file_reader.cc +624 -0
  122. package/vendor/rocksdb/db/blob/blob_file_reader.h +112 -0
  123. package/vendor/rocksdb/db/blob/blob_file_reader_test.cc +1023 -0
  124. package/vendor/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  125. package/vendor/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  126. package/vendor/rocksdb/db/blob/blob_garbage_meter_test.cc +197 -0
  127. package/vendor/rocksdb/db/blob/blob_index.h +187 -0
  128. package/vendor/rocksdb/db/blob/blob_log_format.cc +143 -0
  129. package/vendor/rocksdb/db/blob/blob_log_format.h +164 -0
  130. package/vendor/rocksdb/db/blob/blob_log_sequential_reader.cc +134 -0
  131. package/vendor/rocksdb/db/blob/blob_log_sequential_reader.h +83 -0
  132. package/vendor/rocksdb/db/blob/blob_log_writer.cc +178 -0
  133. package/vendor/rocksdb/db/blob/blob_log_writer.h +83 -0
  134. package/vendor/rocksdb/db/blob/blob_read_request.h +58 -0
  135. package/vendor/rocksdb/db/blob/blob_source.cc +459 -0
  136. package/vendor/rocksdb/db/blob/blob_source.h +161 -0
  137. package/vendor/rocksdb/db/blob/blob_source_test.cc +1611 -0
  138. package/vendor/rocksdb/db/blob/db_blob_basic_test.cc +2237 -0
  139. package/vendor/rocksdb/db/blob/db_blob_compaction_test.cc +899 -0
  140. package/vendor/rocksdb/db/blob/db_blob_corruption_test.cc +80 -0
  141. package/vendor/rocksdb/db/blob/db_blob_index_test.cc +596 -0
  142. package/vendor/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  143. package/vendor/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  144. package/vendor/rocksdb/db/builder.cc +447 -0
  145. package/vendor/rocksdb/db/builder.h +78 -0
  146. package/vendor/rocksdb/db/c.cc +6559 -0
  147. package/vendor/rocksdb/db/c_test.c +3609 -0
  148. package/vendor/rocksdb/db/column_family.cc +1708 -0
  149. package/vendor/rocksdb/db/column_family.h +851 -0
  150. package/vendor/rocksdb/db/column_family_test.cc +3382 -0
  151. package/vendor/rocksdb/db/compact_files_test.cc +492 -0
  152. package/vendor/rocksdb/db/compaction/clipping_iterator.h +281 -0
  153. package/vendor/rocksdb/db/compaction/clipping_iterator_test.cc +259 -0
  154. package/vendor/rocksdb/db/compaction/compaction.cc +857 -0
  155. package/vendor/rocksdb/db/compaction/compaction.h +565 -0
  156. package/vendor/rocksdb/db/compaction/compaction_iteration_stats.h +49 -0
  157. package/vendor/rocksdb/db/compaction/compaction_iterator.cc +1445 -0
  158. package/vendor/rocksdb/db/compaction/compaction_iterator.h +530 -0
  159. package/vendor/rocksdb/db/compaction/compaction_iterator_test.cc +1618 -0
  160. package/vendor/rocksdb/db/compaction/compaction_job.cc +2054 -0
  161. package/vendor/rocksdb/db/compaction/compaction_job.h +504 -0
  162. package/vendor/rocksdb/db/compaction/compaction_job_stats_test.cc +965 -0
  163. package/vendor/rocksdb/db/compaction/compaction_job_test.cc +2444 -0
  164. package/vendor/rocksdb/db/compaction/compaction_outputs.cc +784 -0
  165. package/vendor/rocksdb/db/compaction/compaction_outputs.h +403 -0
  166. package/vendor/rocksdb/db/compaction/compaction_picker.cc +1225 -0
  167. package/vendor/rocksdb/db/compaction/compaction_picker.h +318 -0
  168. package/vendor/rocksdb/db/compaction/compaction_picker_fifo.cc +471 -0
  169. package/vendor/rocksdb/db/compaction/compaction_picker_fifo.h +60 -0
  170. package/vendor/rocksdb/db/compaction/compaction_picker_level.cc +888 -0
  171. package/vendor/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  172. package/vendor/rocksdb/db/compaction/compaction_picker_test.cc +4074 -0
  173. package/vendor/rocksdb/db/compaction/compaction_picker_universal.cc +1452 -0
  174. package/vendor/rocksdb/db/compaction/compaction_picker_universal.h +30 -0
  175. package/vendor/rocksdb/db/compaction/compaction_service_job.cc +833 -0
  176. package/vendor/rocksdb/db/compaction/compaction_service_test.cc +954 -0
  177. package/vendor/rocksdb/db/compaction/compaction_state.cc +46 -0
  178. package/vendor/rocksdb/db/compaction/compaction_state.h +42 -0
  179. package/vendor/rocksdb/db/compaction/file_pri.h +92 -0
  180. package/vendor/rocksdb/db/compaction/sst_partitioner.cc +83 -0
  181. package/vendor/rocksdb/db/compaction/subcompaction_state.cc +106 -0
  182. package/vendor/rocksdb/db/compaction/subcompaction_state.h +220 -0
  183. package/vendor/rocksdb/db/compaction/tiered_compaction_test.cc +2149 -0
  184. package/vendor/rocksdb/db/comparator_db_test.cc +678 -0
  185. package/vendor/rocksdb/db/convenience.cc +81 -0
  186. package/vendor/rocksdb/db/corruption_test.cc +1670 -0
  187. package/vendor/rocksdb/db/cuckoo_table_db_test.cc +351 -0
  188. package/vendor/rocksdb/db/db_basic_test.cc +4777 -0
  189. package/vendor/rocksdb/db/db_block_cache_test.cc +1972 -0
  190. package/vendor/rocksdb/db/db_bloom_filter_test.cc +3513 -0
  191. package/vendor/rocksdb/db/db_clip_test.cc +142 -0
  192. package/vendor/rocksdb/db/db_compaction_filter_test.cc +1030 -0
  193. package/vendor/rocksdb/db/db_compaction_test.cc +9424 -0
  194. package/vendor/rocksdb/db/db_dynamic_level_test.cc +499 -0
  195. package/vendor/rocksdb/db/db_encryption_test.cc +126 -0
  196. package/vendor/rocksdb/db/db_filesnapshot.cc +436 -0
  197. package/vendor/rocksdb/db/db_flush_test.cc +3202 -0
  198. package/vendor/rocksdb/db/db_impl/compacted_db_impl.cc +260 -0
  199. package/vendor/rocksdb/db/db_impl/compacted_db_impl.h +157 -0
  200. package/vendor/rocksdb/db/db_impl/db_impl.cc +6132 -0
  201. package/vendor/rocksdb/db/db_impl/db_impl.h +2841 -0
  202. package/vendor/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3980 -0
  203. package/vendor/rocksdb/db/db_impl/db_impl_debug.cc +314 -0
  204. package/vendor/rocksdb/db/db_impl/db_impl_experimental.cc +159 -0
  205. package/vendor/rocksdb/db/db_impl/db_impl_files.cc +1014 -0
  206. package/vendor/rocksdb/db/db_impl/db_impl_open.cc +2202 -0
  207. package/vendor/rocksdb/db/db_impl/db_impl_readonly.cc +334 -0
  208. package/vendor/rocksdb/db/db_impl/db_impl_readonly.h +173 -0
  209. package/vendor/rocksdb/db/db_impl/db_impl_secondary.cc +964 -0
  210. package/vendor/rocksdb/db/db_impl/db_impl_secondary.h +406 -0
  211. package/vendor/rocksdb/db/db_impl/db_impl_write.cc +2487 -0
  212. package/vendor/rocksdb/db/db_info_dumper.cc +147 -0
  213. package/vendor/rocksdb/db/db_info_dumper.h +15 -0
  214. package/vendor/rocksdb/db/db_inplace_update_test.cc +262 -0
  215. package/vendor/rocksdb/db/db_io_failure_test.cc +589 -0
  216. package/vendor/rocksdb/db/db_iter.cc +1708 -0
  217. package/vendor/rocksdb/db/db_iter.h +411 -0
  218. package/vendor/rocksdb/db/db_iter_stress_test.cc +658 -0
  219. package/vendor/rocksdb/db/db_iter_test.cc +3195 -0
  220. package/vendor/rocksdb/db/db_iterator_test.cc +3304 -0
  221. package/vendor/rocksdb/db/db_kv_checksum_test.cc +885 -0
  222. package/vendor/rocksdb/db/db_log_iter_test.cc +297 -0
  223. package/vendor/rocksdb/db/db_logical_block_size_cache_test.cc +505 -0
  224. package/vendor/rocksdb/db/db_memtable_test.cc +344 -0
  225. package/vendor/rocksdb/db/db_merge_operand_test.cc +488 -0
  226. package/vendor/rocksdb/db/db_merge_operator_test.cc +866 -0
  227. package/vendor/rocksdb/db/db_options_test.cc +1330 -0
  228. package/vendor/rocksdb/db/db_properties_test.cc +2377 -0
  229. package/vendor/rocksdb/db/db_range_del_test.cc +3414 -0
  230. package/vendor/rocksdb/db/db_rate_limiter_test.cc +437 -0
  231. package/vendor/rocksdb/db/db_readonly_with_timestamp_test.cc +956 -0
  232. package/vendor/rocksdb/db/db_secondary_test.cc +1691 -0
  233. package/vendor/rocksdb/db/db_sst_test.cc +1865 -0
  234. package/vendor/rocksdb/db/db_statistics_test.cc +292 -0
  235. package/vendor/rocksdb/db/db_table_properties_test.cc +623 -0
  236. package/vendor/rocksdb/db/db_tailing_iter_test.cc +595 -0
  237. package/vendor/rocksdb/db/db_test.cc +7359 -0
  238. package/vendor/rocksdb/db/db_test2.cc +7679 -0
  239. package/vendor/rocksdb/db/db_test_util.cc +1759 -0
  240. package/vendor/rocksdb/db/db_test_util.h +1340 -0
  241. package/vendor/rocksdb/db/db_universal_compaction_test.cc +2227 -0
  242. package/vendor/rocksdb/db/db_wal_test.cc +2433 -0
  243. package/vendor/rocksdb/db/db_with_timestamp_basic_test.cc +4016 -0
  244. package/vendor/rocksdb/db/db_with_timestamp_compaction_test.cc +353 -0
  245. package/vendor/rocksdb/db/db_with_timestamp_test_util.cc +96 -0
  246. package/vendor/rocksdb/db/db_with_timestamp_test_util.h +126 -0
  247. package/vendor/rocksdb/db/db_write_buffer_manager_test.cc +927 -0
  248. package/vendor/rocksdb/db/db_write_test.cc +795 -0
  249. package/vendor/rocksdb/db/dbformat.cc +213 -0
  250. package/vendor/rocksdb/db/dbformat.h +869 -0
  251. package/vendor/rocksdb/db/dbformat_test.cc +214 -0
  252. package/vendor/rocksdb/db/deletefile_test.cc +603 -0
  253. package/vendor/rocksdb/db/error_handler.cc +792 -0
  254. package/vendor/rocksdb/db/error_handler.h +124 -0
  255. package/vendor/rocksdb/db/error_handler_fs_test.cc +2862 -0
  256. package/vendor/rocksdb/db/event_helpers.cc +323 -0
  257. package/vendor/rocksdb/db/event_helpers.h +78 -0
  258. package/vendor/rocksdb/db/experimental.cc +144 -0
  259. package/vendor/rocksdb/db/external_sst_file_basic_test.cc +2084 -0
  260. package/vendor/rocksdb/db/external_sst_file_ingestion_job.cc +1104 -0
  261. package/vendor/rocksdb/db/external_sst_file_ingestion_job.h +238 -0
  262. package/vendor/rocksdb/db/external_sst_file_test.cc +2859 -0
  263. package/vendor/rocksdb/db/fault_injection_test.cc +637 -0
  264. package/vendor/rocksdb/db/file_indexer.cc +218 -0
  265. package/vendor/rocksdb/db/file_indexer.h +140 -0
  266. package/vendor/rocksdb/db/file_indexer_test.cc +352 -0
  267. package/vendor/rocksdb/db/filename_test.cc +241 -0
  268. package/vendor/rocksdb/db/flush_job.cc +1097 -0
  269. package/vendor/rocksdb/db/flush_job.h +200 -0
  270. package/vendor/rocksdb/db/flush_job_test.cc +743 -0
  271. package/vendor/rocksdb/db/flush_scheduler.cc +86 -0
  272. package/vendor/rocksdb/db/flush_scheduler.h +55 -0
  273. package/vendor/rocksdb/db/forward_iterator.cc +1070 -0
  274. package/vendor/rocksdb/db/forward_iterator.h +166 -0
  275. package/vendor/rocksdb/db/forward_iterator_bench.cc +378 -0
  276. package/vendor/rocksdb/db/history_trimming_iterator.h +95 -0
  277. package/vendor/rocksdb/db/import_column_family_job.cc +364 -0
  278. package/vendor/rocksdb/db/import_column_family_job.h +82 -0
  279. package/vendor/rocksdb/db/import_column_family_test.cc +748 -0
  280. package/vendor/rocksdb/db/internal_stats.cc +2121 -0
  281. package/vendor/rocksdb/db/internal_stats.h +875 -0
  282. package/vendor/rocksdb/db/job_context.h +237 -0
  283. package/vendor/rocksdb/db/kv_checksum.h +484 -0
  284. package/vendor/rocksdb/db/listener_test.cc +1598 -0
  285. package/vendor/rocksdb/db/log_format.h +55 -0
  286. package/vendor/rocksdb/db/log_reader.cc +934 -0
  287. package/vendor/rocksdb/db/log_reader.h +241 -0
  288. package/vendor/rocksdb/db/log_test.cc +1216 -0
  289. package/vendor/rocksdb/db/log_writer.cc +279 -0
  290. package/vendor/rocksdb/db/log_writer.h +144 -0
  291. package/vendor/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  292. package/vendor/rocksdb/db/logs_with_prep_tracker.h +62 -0
  293. package/vendor/rocksdb/db/lookup_key.h +68 -0
  294. package/vendor/rocksdb/db/malloc_stats.cc +53 -0
  295. package/vendor/rocksdb/db/malloc_stats.h +22 -0
  296. package/vendor/rocksdb/db/manual_compaction_test.cc +308 -0
  297. package/vendor/rocksdb/db/memtable.cc +1675 -0
  298. package/vendor/rocksdb/db/memtable.h +660 -0
  299. package/vendor/rocksdb/db/memtable_list.cc +987 -0
  300. package/vendor/rocksdb/db/memtable_list.h +471 -0
  301. package/vendor/rocksdb/db/memtable_list_test.cc +1037 -0
  302. package/vendor/rocksdb/db/merge_context.h +147 -0
  303. package/vendor/rocksdb/db/merge_helper.cc +606 -0
  304. package/vendor/rocksdb/db/merge_helper.h +224 -0
  305. package/vendor/rocksdb/db/merge_helper_test.cc +298 -0
  306. package/vendor/rocksdb/db/merge_operator.cc +85 -0
  307. package/vendor/rocksdb/db/merge_test.cc +621 -0
  308. package/vendor/rocksdb/db/obsolete_files_test.cc +317 -0
  309. package/vendor/rocksdb/db/options_file_test.cc +110 -0
  310. package/vendor/rocksdb/db/output_validator.cc +33 -0
  311. package/vendor/rocksdb/db/output_validator.h +48 -0
  312. package/vendor/rocksdb/db/perf_context_test.cc +1158 -0
  313. package/vendor/rocksdb/db/periodic_task_scheduler.cc +111 -0
  314. package/vendor/rocksdb/db/periodic_task_scheduler.h +108 -0
  315. package/vendor/rocksdb/db/periodic_task_scheduler_test.cc +229 -0
  316. package/vendor/rocksdb/db/pinned_iterators_manager.h +92 -0
  317. package/vendor/rocksdb/db/plain_table_db_test.cc +1348 -0
  318. package/vendor/rocksdb/db/post_memtable_callback.h +25 -0
  319. package/vendor/rocksdb/db/pre_release_callback.h +37 -0
  320. package/vendor/rocksdb/db/prefix_test.cc +894 -0
  321. package/vendor/rocksdb/db/range_del_aggregator.cc +555 -0
  322. package/vendor/rocksdb/db/range_del_aggregator.h +478 -0
  323. package/vendor/rocksdb/db/range_del_aggregator_bench.cc +280 -0
  324. package/vendor/rocksdb/db/range_del_aggregator_test.cc +713 -0
  325. package/vendor/rocksdb/db/range_tombstone_fragmenter.cc +502 -0
  326. package/vendor/rocksdb/db/range_tombstone_fragmenter.h +356 -0
  327. package/vendor/rocksdb/db/range_tombstone_fragmenter_test.cc +555 -0
  328. package/vendor/rocksdb/db/read_callback.h +54 -0
  329. package/vendor/rocksdb/db/repair.cc +839 -0
  330. package/vendor/rocksdb/db/repair_test.cc +484 -0
  331. package/vendor/rocksdb/db/seqno_time_test.cc +994 -0
  332. package/vendor/rocksdb/db/seqno_to_time_mapping.cc +341 -0
  333. package/vendor/rocksdb/db/seqno_to_time_mapping.h +189 -0
  334. package/vendor/rocksdb/db/snapshot_checker.h +58 -0
  335. package/vendor/rocksdb/db/snapshot_impl.cc +25 -0
  336. package/vendor/rocksdb/db/snapshot_impl.h +239 -0
  337. package/vendor/rocksdb/db/table_cache.cc +710 -0
  338. package/vendor/rocksdb/db/table_cache.h +283 -0
  339. package/vendor/rocksdb/db/table_cache_sync_and_async.h +130 -0
  340. package/vendor/rocksdb/db/table_properties_collector.cc +74 -0
  341. package/vendor/rocksdb/db/table_properties_collector.h +177 -0
  342. package/vendor/rocksdb/db/table_properties_collector_test.cc +512 -0
  343. package/vendor/rocksdb/db/transaction_log_impl.cc +296 -0
  344. package/vendor/rocksdb/db/transaction_log_impl.h +128 -0
  345. package/vendor/rocksdb/db/trim_history_scheduler.cc +54 -0
  346. package/vendor/rocksdb/db/trim_history_scheduler.h +46 -0
  347. package/vendor/rocksdb/db/version_builder.cc +1426 -0
  348. package/vendor/rocksdb/db/version_builder.h +93 -0
  349. package/vendor/rocksdb/db/version_builder_test.cc +1840 -0
  350. package/vendor/rocksdb/db/version_edit.cc +1059 -0
  351. package/vendor/rocksdb/db/version_edit.h +702 -0
  352. package/vendor/rocksdb/db/version_edit_handler.cc +1017 -0
  353. package/vendor/rocksdb/db/version_edit_handler.h +334 -0
  354. package/vendor/rocksdb/db/version_edit_test.cc +732 -0
  355. package/vendor/rocksdb/db/version_set.cc +7286 -0
  356. package/vendor/rocksdb/db/version_set.h +1714 -0
  357. package/vendor/rocksdb/db/version_set_sync_and_async.h +172 -0
  358. package/vendor/rocksdb/db/version_set_test.cc +3659 -0
  359. package/vendor/rocksdb/db/version_util.h +72 -0
  360. package/vendor/rocksdb/db/wal_edit.cc +211 -0
  361. package/vendor/rocksdb/db/wal_edit.h +177 -0
  362. package/vendor/rocksdb/db/wal_edit_test.cc +213 -0
  363. package/vendor/rocksdb/db/wal_manager.cc +527 -0
  364. package/vendor/rocksdb/db/wal_manager.h +136 -0
  365. package/vendor/rocksdb/db/wal_manager_test.cc +336 -0
  366. package/vendor/rocksdb/db/wide/db_wide_basic_test.cc +1042 -0
  367. package/vendor/rocksdb/db/wide/wide_column_serialization.cc +182 -0
  368. package/vendor/rocksdb/db/wide/wide_column_serialization.h +77 -0
  369. package/vendor/rocksdb/db/wide/wide_column_serialization_test.cc +338 -0
  370. package/vendor/rocksdb/db/wide/wide_columns.cc +22 -0
  371. package/vendor/rocksdb/db/write_batch.cc +3142 -0
  372. package/vendor/rocksdb/db/write_batch_base.cc +94 -0
  373. package/vendor/rocksdb/db/write_batch_internal.h +401 -0
  374. package/vendor/rocksdb/db/write_batch_test.cc +1112 -0
  375. package/vendor/rocksdb/db/write_callback.h +27 -0
  376. package/vendor/rocksdb/db/write_callback_test.cc +454 -0
  377. package/vendor/rocksdb/db/write_controller.cc +121 -0
  378. package/vendor/rocksdb/db/write_controller.h +148 -0
  379. package/vendor/rocksdb/db/write_controller_test.cc +248 -0
  380. package/vendor/rocksdb/db/write_stall_stats.cc +179 -0
  381. package/vendor/rocksdb/db/write_stall_stats.h +47 -0
  382. package/vendor/rocksdb/db/write_thread.cc +844 -0
  383. package/vendor/rocksdb/db/write_thread.h +464 -0
  384. package/vendor/rocksdb/db_stress_tool/CMakeLists.txt +18 -0
  385. package/vendor/rocksdb/db_stress_tool/batched_ops_stress.cc +593 -0
  386. package/vendor/rocksdb/db_stress_tool/cf_consistency_stress.cc +892 -0
  387. package/vendor/rocksdb/db_stress_tool/db_stress.cc +25 -0
  388. package/vendor/rocksdb/db_stress_tool/db_stress_common.cc +491 -0
  389. package/vendor/rocksdb/db_stress_tool/db_stress_common.h +674 -0
  390. package/vendor/rocksdb/db_stress_tool/db_stress_compaction_filter.h +96 -0
  391. package/vendor/rocksdb/db_stress_tool/db_stress_driver.cc +216 -0
  392. package/vendor/rocksdb/db_stress_tool/db_stress_driver.h +18 -0
  393. package/vendor/rocksdb/db_stress_tool/db_stress_env_wrapper.h +78 -0
  394. package/vendor/rocksdb/db_stress_tool/db_stress_gflags.cc +1094 -0
  395. package/vendor/rocksdb/db_stress_tool/db_stress_listener.cc +189 -0
  396. package/vendor/rocksdb/db_stress_tool/db_stress_listener.h +269 -0
  397. package/vendor/rocksdb/db_stress_tool/db_stress_shared_state.cc +17 -0
  398. package/vendor/rocksdb/db_stress_tool/db_stress_shared_state.h +437 -0
  399. package/vendor/rocksdb/db_stress_tool/db_stress_stat.cc +17 -0
  400. package/vendor/rocksdb/db_stress_tool/db_stress_stat.h +219 -0
  401. package/vendor/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +65 -0
  402. package/vendor/rocksdb/db_stress_tool/db_stress_test_base.cc +3294 -0
  403. package/vendor/rocksdb/db_stress_tool/db_stress_test_base.h +327 -0
  404. package/vendor/rocksdb/db_stress_tool/db_stress_tool.cc +371 -0
  405. package/vendor/rocksdb/db_stress_tool/expected_state.cc +780 -0
  406. package/vendor/rocksdb/db_stress_tool/expected_state.h +329 -0
  407. package/vendor/rocksdb/db_stress_tool/expected_value.cc +122 -0
  408. package/vendor/rocksdb/db_stress_tool/expected_value.h +206 -0
  409. package/vendor/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1761 -0
  410. package/vendor/rocksdb/db_stress_tool/multi_ops_txns_stress.h +446 -0
  411. package/vendor/rocksdb/db_stress_tool/no_batched_ops_stress.cc +1906 -0
  412. package/vendor/rocksdb/docs/CNAME +1 -0
  413. package/vendor/rocksdb/docs/CONTRIBUTING.md +115 -0
  414. package/vendor/rocksdb/docs/Gemfile +4 -0
  415. package/vendor/rocksdb/docs/LICENSE-DOCUMENTATION +385 -0
  416. package/vendor/rocksdb/docs/README.md +80 -0
  417. package/vendor/rocksdb/docs/TEMPLATE-INFORMATION.md +17 -0
  418. package/vendor/rocksdb/docs/_config.yml +85 -0
  419. package/vendor/rocksdb/docs/_data/authors.yml +81 -0
  420. package/vendor/rocksdb/docs/_data/features.yml +19 -0
  421. package/vendor/rocksdb/docs/_data/nav.yml +30 -0
  422. package/vendor/rocksdb/docs/_data/nav_docs.yml +3 -0
  423. package/vendor/rocksdb/docs/_data/powered_by.yml +1 -0
  424. package/vendor/rocksdb/docs/_data/powered_by_highlight.yml +1 -0
  425. package/vendor/rocksdb/docs/_data/promo.yml +6 -0
  426. package/vendor/rocksdb/docs/_docs/faq.md +48 -0
  427. package/vendor/rocksdb/docs/_docs/getting-started.md +78 -0
  428. package/vendor/rocksdb/docs/_includes/blog_pagination.html +28 -0
  429. package/vendor/rocksdb/docs/_includes/content/gridblocks.html +5 -0
  430. package/vendor/rocksdb/docs/_includes/content/items/gridblock.html +37 -0
  431. package/vendor/rocksdb/docs/_includes/doc.html +25 -0
  432. package/vendor/rocksdb/docs/_includes/doc_paging.html +0 -0
  433. package/vendor/rocksdb/docs/_includes/footer.html +34 -0
  434. package/vendor/rocksdb/docs/_includes/head.html +23 -0
  435. package/vendor/rocksdb/docs/_includes/header.html +19 -0
  436. package/vendor/rocksdb/docs/_includes/hero.html +0 -0
  437. package/vendor/rocksdb/docs/_includes/home_header.html +22 -0
  438. package/vendor/rocksdb/docs/_includes/katex_import.html +3 -0
  439. package/vendor/rocksdb/docs/_includes/katex_render.html +210 -0
  440. package/vendor/rocksdb/docs/_includes/nav/collection_nav.html +64 -0
  441. package/vendor/rocksdb/docs/_includes/nav/collection_nav_group.html +19 -0
  442. package/vendor/rocksdb/docs/_includes/nav/collection_nav_group_item.html +1 -0
  443. package/vendor/rocksdb/docs/_includes/nav/header_nav.html +30 -0
  444. package/vendor/rocksdb/docs/_includes/nav.html +37 -0
  445. package/vendor/rocksdb/docs/_includes/nav_search.html +15 -0
  446. package/vendor/rocksdb/docs/_includes/plugins/all_share.html +3 -0
  447. package/vendor/rocksdb/docs/_includes/plugins/ascii_cinema.html +2 -0
  448. package/vendor/rocksdb/docs/_includes/plugins/button.html +6 -0
  449. package/vendor/rocksdb/docs/_includes/plugins/github_star.html +4 -0
  450. package/vendor/rocksdb/docs/_includes/plugins/github_watch.html +4 -0
  451. package/vendor/rocksdb/docs/_includes/plugins/google_share.html +5 -0
  452. package/vendor/rocksdb/docs/_includes/plugins/iframe.html +6 -0
  453. package/vendor/rocksdb/docs/_includes/plugins/like_button.html +18 -0
  454. package/vendor/rocksdb/docs/_includes/plugins/plugin_row.html +5 -0
  455. package/vendor/rocksdb/docs/_includes/plugins/post_social_plugins.html +41 -0
  456. package/vendor/rocksdb/docs/_includes/plugins/slideshow.html +88 -0
  457. package/vendor/rocksdb/docs/_includes/plugins/twitter_follow.html +12 -0
  458. package/vendor/rocksdb/docs/_includes/plugins/twitter_share.html +11 -0
  459. package/vendor/rocksdb/docs/_includes/post.html +40 -0
  460. package/vendor/rocksdb/docs/_includes/powered_by.html +28 -0
  461. package/vendor/rocksdb/docs/_includes/social_plugins.html +31 -0
  462. package/vendor/rocksdb/docs/_includes/ui/button.html +1 -0
  463. package/vendor/rocksdb/docs/_layouts/basic.html +12 -0
  464. package/vendor/rocksdb/docs/_layouts/blog.html +11 -0
  465. package/vendor/rocksdb/docs/_layouts/blog_default.html +14 -0
  466. package/vendor/rocksdb/docs/_layouts/default.html +12 -0
  467. package/vendor/rocksdb/docs/_layouts/doc_default.html +14 -0
  468. package/vendor/rocksdb/docs/_layouts/doc_page.html +10 -0
  469. package/vendor/rocksdb/docs/_layouts/docs.html +5 -0
  470. package/vendor/rocksdb/docs/_layouts/home.html +26 -0
  471. package/vendor/rocksdb/docs/_layouts/page.html +3 -0
  472. package/vendor/rocksdb/docs/_layouts/plain.html +10 -0
  473. package/vendor/rocksdb/docs/_layouts/post.html +8 -0
  474. package/vendor/rocksdb/docs/_layouts/redirect.html +6 -0
  475. package/vendor/rocksdb/docs/_layouts/top-level.html +10 -0
  476. package/vendor/rocksdb/docs/_posts/2014-03-27-how-to-backup-rocksdb.markdown +135 -0
  477. package/vendor/rocksdb/docs/_posts/2014-03-27-how-to-persist-in-memory-rocksdb-database.markdown +54 -0
  478. package/vendor/rocksdb/docs/_posts/2014-04-02-the-1st-rocksdb-local-meetup-held-on-march-27-2014.markdown +53 -0
  479. package/vendor/rocksdb/docs/_posts/2014-04-07-rocksdb-2-8-release.markdown +40 -0
  480. package/vendor/rocksdb/docs/_posts/2014-04-21-indexing-sst-files-for-better-lookup-performance.markdown +28 -0
  481. package/vendor/rocksdb/docs/_posts/2014-05-14-lock.markdown +88 -0
  482. package/vendor/rocksdb/docs/_posts/2014-05-19-rocksdb-3-0-release.markdown +24 -0
  483. package/vendor/rocksdb/docs/_posts/2014-05-22-rocksdb-3-1-release.markdown +20 -0
  484. package/vendor/rocksdb/docs/_posts/2014-06-23-plaintable-a-new-file-format.markdown +47 -0
  485. package/vendor/rocksdb/docs/_posts/2014-06-27-avoid-expensive-locks-in-get.markdown +89 -0
  486. package/vendor/rocksdb/docs/_posts/2014-06-27-rocksdb-3-2-release.markdown +30 -0
  487. package/vendor/rocksdb/docs/_posts/2014-07-29-rocksdb-3-3-release.markdown +34 -0
  488. package/vendor/rocksdb/docs/_posts/2014-09-12-cuckoo.markdown +74 -0
  489. package/vendor/rocksdb/docs/_posts/2014-09-12-new-bloom-filter-format.markdown +52 -0
  490. package/vendor/rocksdb/docs/_posts/2014-09-15-rocksdb-3-5-release.markdown +38 -0
  491. package/vendor/rocksdb/docs/_posts/2015-01-16-migrating-from-leveldb-to-rocksdb-2.markdown +112 -0
  492. package/vendor/rocksdb/docs/_posts/2015-02-24-reading-rocksdb-options-from-a-file.markdown +41 -0
  493. package/vendor/rocksdb/docs/_posts/2015-02-27-write-batch-with-index.markdown +20 -0
  494. package/vendor/rocksdb/docs/_posts/2015-04-22-integrating-rocksdb-with-mongodb-2.markdown +16 -0
  495. package/vendor/rocksdb/docs/_posts/2015-06-12-rocksdb-in-osquery.markdown +10 -0
  496. package/vendor/rocksdb/docs/_posts/2015-07-15-rocksdb-2015-h2-roadmap.markdown +92 -0
  497. package/vendor/rocksdb/docs/_posts/2015-07-17-spatial-indexing-in-rocksdb.markdown +78 -0
  498. package/vendor/rocksdb/docs/_posts/2015-07-22-rocksdb-is-now-available-in-windows-platform.markdown +30 -0
  499. package/vendor/rocksdb/docs/_posts/2015-07-23-dynamic-level.markdown +29 -0
  500. package/vendor/rocksdb/docs/_posts/2015-10-27-getthreadlist.markdown +193 -0
  501. package/vendor/rocksdb/docs/_posts/2015-11-10-use-checkpoints-for-efficient-snapshots.markdown +45 -0
  502. package/vendor/rocksdb/docs/_posts/2015-11-16-analysis-file-read-latency-by-level.markdown +244 -0
  503. package/vendor/rocksdb/docs/_posts/2016-01-29-compaction_pri.markdown +51 -0
  504. package/vendor/rocksdb/docs/_posts/2016-02-24-rocksdb-4-2-release.markdown +41 -0
  505. package/vendor/rocksdb/docs/_posts/2016-02-25-rocksdb-ama.markdown +20 -0
  506. package/vendor/rocksdb/docs/_posts/2016-03-07-rocksdb-options-file.markdown +24 -0
  507. package/vendor/rocksdb/docs/_posts/2016-04-26-rocksdb-4-5-1-released.markdown +60 -0
  508. package/vendor/rocksdb/docs/_posts/2016-07-26-rocksdb-4-8-released.markdown +48 -0
  509. package/vendor/rocksdb/docs/_posts/2016-09-28-rocksdb-4-11-2-released.markdown +49 -0
  510. package/vendor/rocksdb/docs/_posts/2017-01-06-rocksdb-5-0-1-released.markdown +26 -0
  511. package/vendor/rocksdb/docs/_posts/2017-02-07-rocksdb-5-1-2-released.markdown +15 -0
  512. package/vendor/rocksdb/docs/_posts/2017-02-17-bulkoad-ingest-sst-file.markdown +50 -0
  513. package/vendor/rocksdb/docs/_posts/2017-03-02-rocksdb-5-2-1-released.markdown +22 -0
  514. package/vendor/rocksdb/docs/_posts/2017-05-12-partitioned-index-filter.markdown +34 -0
  515. package/vendor/rocksdb/docs/_posts/2017-05-14-core-local-stats.markdown +106 -0
  516. package/vendor/rocksdb/docs/_posts/2017-05-26-rocksdb-5-4-5-released.markdown +39 -0
  517. package/vendor/rocksdb/docs/_posts/2017-06-26-17-level-based-changes.markdown +60 -0
  518. package/vendor/rocksdb/docs/_posts/2017-06-29-rocksdb-5-5-1-released.markdown +22 -0
  519. package/vendor/rocksdb/docs/_posts/2017-07-25-rocksdb-5-6-1-released.markdown +22 -0
  520. package/vendor/rocksdb/docs/_posts/2017-08-24-pinnableslice.markdown +37 -0
  521. package/vendor/rocksdb/docs/_posts/2017-08-25-flushwal.markdown +26 -0
  522. package/vendor/rocksdb/docs/_posts/2017-09-28-rocksdb-5-8-released.markdown +25 -0
  523. package/vendor/rocksdb/docs/_posts/2017-12-18-17-auto-tuned-rate-limiter.markdown +28 -0
  524. package/vendor/rocksdb/docs/_posts/2017-12-19-write-prepared-txn.markdown +41 -0
  525. package/vendor/rocksdb/docs/_posts/2018-02-05-rocksdb-5-10-2-released.markdown +22 -0
  526. package/vendor/rocksdb/docs/_posts/2018-08-01-rocksdb-tuning-advisor.markdown +58 -0
  527. package/vendor/rocksdb/docs/_posts/2018-08-23-data-block-hash-index.markdown +118 -0
  528. package/vendor/rocksdb/docs/_posts/2018-11-21-delete-range.markdown +292 -0
  529. package/vendor/rocksdb/docs/_posts/2019-03-08-format-version-4.markdown +36 -0
  530. package/vendor/rocksdb/docs/_posts/2019-08-15-unordered-write.markdown +56 -0
  531. package/vendor/rocksdb/docs/_posts/2021-04-12-universal-improvements.markdown +46 -0
  532. package/vendor/rocksdb/docs/_posts/2021-05-26-integrated-blob-db.markdown +101 -0
  533. package/vendor/rocksdb/docs/_posts/2021-05-26-online-validation.markdown +17 -0
  534. package/vendor/rocksdb/docs/_posts/2021-05-27-rocksdb-secondary-cache.markdown +195 -0
  535. package/vendor/rocksdb/docs/_posts/2021-05-31-dictionary-compression.markdown +157 -0
  536. package/vendor/rocksdb/docs/_posts/2021-12-29-ribbon-filter.markdown +281 -0
  537. package/vendor/rocksdb/docs/_posts/2022-07-18-per-key-value-checksum.markdown +142 -0
  538. package/vendor/rocksdb/docs/_posts/2022-10-05-lost-buffered-write-recovery.markdown +123 -0
  539. package/vendor/rocksdb/docs/_posts/2022-10-07-asynchronous-io-in-rocksdb.markdown +133 -0
  540. package/vendor/rocksdb/docs/_posts/2022-10-31-align-compaction-output-file.markdown +107 -0
  541. package/vendor/rocksdb/docs/_posts/2022-11-09-time-aware-tiered-storage.markdown +121 -0
  542. package/vendor/rocksdb/docs/_sass/_base.scss +492 -0
  543. package/vendor/rocksdb/docs/_sass/_blog.scss +47 -0
  544. package/vendor/rocksdb/docs/_sass/_buttons.scss +47 -0
  545. package/vendor/rocksdb/docs/_sass/_footer.scss +82 -0
  546. package/vendor/rocksdb/docs/_sass/_gridBlock.scss +115 -0
  547. package/vendor/rocksdb/docs/_sass/_header.scss +139 -0
  548. package/vendor/rocksdb/docs/_sass/_poweredby.scss +69 -0
  549. package/vendor/rocksdb/docs/_sass/_promo.scss +55 -0
  550. package/vendor/rocksdb/docs/_sass/_react_docs_nav.scss +332 -0
  551. package/vendor/rocksdb/docs/_sass/_react_header_nav.scss +141 -0
  552. package/vendor/rocksdb/docs/_sass/_reset.scss +43 -0
  553. package/vendor/rocksdb/docs/_sass/_search.scss +142 -0
  554. package/vendor/rocksdb/docs/_sass/_slideshow.scss +48 -0
  555. package/vendor/rocksdb/docs/_sass/_syntax-highlighting.scss +129 -0
  556. package/vendor/rocksdb/docs/_sass/_tables.scss +47 -0
  557. package/vendor/rocksdb/docs/_top-level/support.md +22 -0
  558. package/vendor/rocksdb/docs/blog/all.html +20 -0
  559. package/vendor/rocksdb/docs/blog/index.html +12 -0
  560. package/vendor/rocksdb/docs/css/main.scss +159 -0
  561. package/vendor/rocksdb/docs/doc-type-examples/2016-04-07-blog-post-example.md +21 -0
  562. package/vendor/rocksdb/docs/doc-type-examples/docs-hello-world.md +12 -0
  563. package/vendor/rocksdb/docs/doc-type-examples/top-level-example.md +8 -0
  564. package/vendor/rocksdb/docs/docs/index.html +6 -0
  565. package/vendor/rocksdb/docs/feed.xml +30 -0
  566. package/vendor/rocksdb/docs/index.md +9 -0
  567. package/vendor/rocksdb/docs/static/favicon.png +0 -0
  568. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Black.woff +0 -0
  569. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Black.woff2 +0 -0
  570. package/vendor/rocksdb/docs/static/fonts/LatoLatin-BlackItalic.woff +0 -0
  571. package/vendor/rocksdb/docs/static/fonts/LatoLatin-BlackItalic.woff2 +0 -0
  572. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Italic.woff +0 -0
  573. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Italic.woff2 +0 -0
  574. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Light.woff +0 -0
  575. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Light.woff2 +0 -0
  576. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Regular.woff +0 -0
  577. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Regular.woff2 +0 -0
  578. package/vendor/rocksdb/docs/static/images/Resize-of-20140327_200754-300x225.jpg +0 -0
  579. package/vendor/rocksdb/docs/static/images/align-compaction-output/compaction_output_file_size_compare.png +0 -0
  580. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_cut_align.png +0 -0
  581. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_cut_normal.png +0 -0
  582. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_cut_trival_move.png +0 -0
  583. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_size_compare.png +0 -0
  584. package/vendor/rocksdb/docs/static/images/align-compaction-output/write_amp_compare.png +0 -0
  585. package/vendor/rocksdb/docs/static/images/asynchronous-io/mget_async.png +0 -0
  586. package/vendor/rocksdb/docs/static/images/asynchronous-io/scan_async.png +0 -0
  587. package/vendor/rocksdb/docs/static/images/binaryseek.png +0 -0
  588. package/vendor/rocksdb/docs/static/images/bloom_fp_vs_bpk.png +0 -0
  589. package/vendor/rocksdb/docs/static/images/compaction/full-range.png +0 -0
  590. package/vendor/rocksdb/docs/static/images/compaction/l0-l1-contend.png +0 -0
  591. package/vendor/rocksdb/docs/static/images/compaction/l1-l2-contend.png +0 -0
  592. package/vendor/rocksdb/docs/static/images/compaction/part-range-old.png +0 -0
  593. package/vendor/rocksdb/docs/static/images/data-block-hash-index/block-format-binary-seek.png +0 -0
  594. package/vendor/rocksdb/docs/static/images/data-block-hash-index/block-format-hash-index.png +0 -0
  595. package/vendor/rocksdb/docs/static/images/data-block-hash-index/hash-index-data-structure.png +0 -0
  596. package/vendor/rocksdb/docs/static/images/data-block-hash-index/perf-cache-miss.png +0 -0
  597. package/vendor/rocksdb/docs/static/images/data-block-hash-index/perf-throughput.png +0 -0
  598. package/vendor/rocksdb/docs/static/images/delrange/delrange_collapsed.png +0 -0
  599. package/vendor/rocksdb/docs/static/images/delrange/delrange_key_schema.png +0 -0
  600. package/vendor/rocksdb/docs/static/images/delrange/delrange_sst_blocks.png +0 -0
  601. package/vendor/rocksdb/docs/static/images/delrange/delrange_uncollapsed.png +0 -0
  602. package/vendor/rocksdb/docs/static/images/delrange/delrange_write_path.png +0 -0
  603. package/vendor/rocksdb/docs/static/images/dictcmp/dictcmp_raw_sampled.png +0 -0
  604. package/vendor/rocksdb/docs/static/images/dictcmp/dictcmp_sst_blocks.png +0 -0
  605. package/vendor/rocksdb/docs/static/images/dictcmp/dictcmp_zstd_trained.png +0 -0
  606. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_Legacy_Vs_Integrated.png +0 -0
  607. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_RW_RO_Perf.png +0 -0
  608. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_Write_Amp.png +0 -0
  609. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_Write_Perf.png +0 -0
  610. package/vendor/rocksdb/docs/static/images/kv-checksum/Memtable-entry.png +0 -0
  611. package/vendor/rocksdb/docs/static/images/kv-checksum/Memtable-write.png +0 -0
  612. package/vendor/rocksdb/docs/static/images/kv-checksum/ProtInfo-Memtable.png +0 -0
  613. package/vendor/rocksdb/docs/static/images/kv-checksum/ProtInfo-Writebatch-to-Memtable.png +0 -0
  614. package/vendor/rocksdb/docs/static/images/kv-checksum/ProtInfo-Writebatch.png +0 -0
  615. package/vendor/rocksdb/docs/static/images/kv-checksum/WAL-fragment.png +0 -0
  616. package/vendor/rocksdb/docs/static/images/kv-checksum/WAL-read.png +0 -0
  617. package/vendor/rocksdb/docs/static/images/kv-checksum/WAL-write.png +0 -0
  618. package/vendor/rocksdb/docs/static/images/kv-checksum/Write-batch.png +0 -0
  619. package/vendor/rocksdb/docs/static/images/kv-checksum/Writebatch-write.png +0 -0
  620. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/angry-cat.png +0 -0
  621. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/basic-setup.png +0 -0
  622. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/happy-cat.png +0 -0
  623. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/replay-extension.png +0 -0
  624. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/test-fs-writable-file.png +0 -0
  625. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/trace-extension.png +0 -0
  626. package/vendor/rocksdb/docs/static/images/pcache-blockindex.jpg +0 -0
  627. package/vendor/rocksdb/docs/static/images/pcache-fileindex.jpg +0 -0
  628. package/vendor/rocksdb/docs/static/images/pcache-filelayout.jpg +0 -0
  629. package/vendor/rocksdb/docs/static/images/pcache-readiopath.jpg +0 -0
  630. package/vendor/rocksdb/docs/static/images/pcache-tieredstorage.jpg +0 -0
  631. package/vendor/rocksdb/docs/static/images/pcache-writeiopath.jpg +0 -0
  632. package/vendor/rocksdb/docs/static/images/promo-adapt.svg +8 -0
  633. package/vendor/rocksdb/docs/static/images/promo-flash.svg +28 -0
  634. package/vendor/rocksdb/docs/static/images/promo-operations.svg +6 -0
  635. package/vendor/rocksdb/docs/static/images/promo-performance.svg +134 -0
  636. package/vendor/rocksdb/docs/static/images/rate-limiter/auto-tuned-write-KBps-series.png +0 -0
  637. package/vendor/rocksdb/docs/static/images/rate-limiter/write-KBps-cdf.png +0 -0
  638. package/vendor/rocksdb/docs/static/images/rate-limiter/write-KBps-series.png +0 -0
  639. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/Mixgraph_hit_rate.png +0 -0
  640. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/Mixgraph_throughput.png +0 -0
  641. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/arch_diagram.png +0 -0
  642. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/insert_flow.png +0 -0
  643. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/lookup_flow.png +0 -0
  644. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/compaction_moving_up_conflict.png +0 -0
  645. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/per_key_placement_compaction.png +0 -0
  646. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/tiered_storage_design.png +0 -0
  647. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/tiered_storage_overview.png +0 -0
  648. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/tiered_storage_problem.png +0 -0
  649. package/vendor/rocksdb/docs/static/images/tree_example1.png +0 -0
  650. package/vendor/rocksdb/docs/static/logo.svg +76 -0
  651. package/vendor/rocksdb/docs/static/og_image.png +0 -0
  652. package/vendor/rocksdb/env/composite_env.cc +534 -0
  653. package/vendor/rocksdb/env/composite_env_wrapper.h +378 -0
  654. package/vendor/rocksdb/env/emulated_clock.h +114 -0
  655. package/vendor/rocksdb/env/env.cc +1233 -0
  656. package/vendor/rocksdb/env/env_basic_test.cc +397 -0
  657. package/vendor/rocksdb/env/env_chroot.cc +148 -0
  658. package/vendor/rocksdb/env/env_chroot.h +55 -0
  659. package/vendor/rocksdb/env/env_encryption.cc +1346 -0
  660. package/vendor/rocksdb/env/env_encryption_ctr.h +114 -0
  661. package/vendor/rocksdb/env/env_posix.cc +524 -0
  662. package/vendor/rocksdb/env/env_test.cc +3577 -0
  663. package/vendor/rocksdb/env/file_system.cc +277 -0
  664. package/vendor/rocksdb/env/file_system_tracer.cc +564 -0
  665. package/vendor/rocksdb/env/file_system_tracer.h +461 -0
  666. package/vendor/rocksdb/env/fs_posix.cc +1284 -0
  667. package/vendor/rocksdb/env/fs_readonly.h +105 -0
  668. package/vendor/rocksdb/env/fs_remap.cc +341 -0
  669. package/vendor/rocksdb/env/fs_remap.h +137 -0
  670. package/vendor/rocksdb/env/io_posix.cc +1733 -0
  671. package/vendor/rocksdb/env/io_posix.h +523 -0
  672. package/vendor/rocksdb/env/io_posix_test.cc +141 -0
  673. package/vendor/rocksdb/env/mock_env.cc +1058 -0
  674. package/vendor/rocksdb/env/mock_env.h +144 -0
  675. package/vendor/rocksdb/env/mock_env_test.cc +84 -0
  676. package/vendor/rocksdb/env/unique_id_gen.cc +164 -0
  677. package/vendor/rocksdb/env/unique_id_gen.h +85 -0
  678. package/vendor/rocksdb/examples/CMakeLists.txt +45 -0
  679. package/vendor/rocksdb/examples/Makefile +58 -0
  680. package/vendor/rocksdb/examples/README.md +2 -0
  681. package/vendor/rocksdb/examples/c_simple_example.c +96 -0
  682. package/vendor/rocksdb/examples/column_families_example.cc +88 -0
  683. package/vendor/rocksdb/examples/compact_files_example.cc +177 -0
  684. package/vendor/rocksdb/examples/compaction_filter_example.cc +96 -0
  685. package/vendor/rocksdb/examples/multi_processes_example.cc +393 -0
  686. package/vendor/rocksdb/examples/optimistic_transaction_example.cc +190 -0
  687. package/vendor/rocksdb/examples/options_file_example.cc +132 -0
  688. package/vendor/rocksdb/examples/rocksdb_backup_restore_example.cc +99 -0
  689. package/vendor/rocksdb/examples/rocksdb_option_file_example.ini +142 -0
  690. package/vendor/rocksdb/examples/simple_example.cc +93 -0
  691. package/vendor/rocksdb/examples/transaction_example.cc +196 -0
  692. package/vendor/rocksdb/file/delete_scheduler.cc +409 -0
  693. package/vendor/rocksdb/file/delete_scheduler.h +147 -0
  694. package/vendor/rocksdb/file/delete_scheduler_test.cc +717 -0
  695. package/vendor/rocksdb/file/file_prefetch_buffer.cc +955 -0
  696. package/vendor/rocksdb/file/file_prefetch_buffer.h +471 -0
  697. package/vendor/rocksdb/file/file_util.cc +277 -0
  698. package/vendor/rocksdb/file/file_util.h +91 -0
  699. package/vendor/rocksdb/file/filename.cc +523 -0
  700. package/vendor/rocksdb/file/filename.h +188 -0
  701. package/vendor/rocksdb/file/line_file_reader.cc +73 -0
  702. package/vendor/rocksdb/file/line_file_reader.h +60 -0
  703. package/vendor/rocksdb/file/prefetch_test.cc +2374 -0
  704. package/vendor/rocksdb/file/random_access_file_reader.cc +599 -0
  705. package/vendor/rocksdb/file/random_access_file_reader.h +210 -0
  706. package/vendor/rocksdb/file/random_access_file_reader_test.cc +479 -0
  707. package/vendor/rocksdb/file/read_write_util.cc +33 -0
  708. package/vendor/rocksdb/file/read_write_util.h +31 -0
  709. package/vendor/rocksdb/file/readahead_file_info.h +33 -0
  710. package/vendor/rocksdb/file/readahead_raf.cc +169 -0
  711. package/vendor/rocksdb/file/readahead_raf.h +29 -0
  712. package/vendor/rocksdb/file/sequence_file_reader.cc +320 -0
  713. package/vendor/rocksdb/file/sequence_file_reader.h +119 -0
  714. package/vendor/rocksdb/file/sst_file_manager_impl.cc +507 -0
  715. package/vendor/rocksdb/file/sst_file_manager_impl.h +193 -0
  716. package/vendor/rocksdb/file/writable_file_writer.cc +989 -0
  717. package/vendor/rocksdb/file/writable_file_writer.h +320 -0
  718. package/vendor/rocksdb/fuzz/Makefile +67 -0
  719. package/vendor/rocksdb/fuzz/README.md +165 -0
  720. package/vendor/rocksdb/fuzz/db_fuzzer.cc +172 -0
  721. package/vendor/rocksdb/fuzz/db_map_fuzzer.cc +107 -0
  722. package/vendor/rocksdb/fuzz/proto/db_operation.proto +28 -0
  723. package/vendor/rocksdb/fuzz/sst_file_writer_fuzzer.cc +210 -0
  724. package/vendor/rocksdb/fuzz/util.h +29 -0
  725. package/vendor/rocksdb/include/rocksdb/advanced_cache.h +623 -0
  726. package/vendor/rocksdb/include/rocksdb/advanced_options.h +1177 -0
  727. package/vendor/rocksdb/include/rocksdb/block_cache_trace_writer.h +149 -0
  728. package/vendor/rocksdb/include/rocksdb/c.h +2864 -0
  729. package/vendor/rocksdb/include/rocksdb/cache.h +442 -0
  730. package/vendor/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  731. package/vendor/rocksdb/include/rocksdb/cleanable.h +128 -0
  732. package/vendor/rocksdb/include/rocksdb/compaction_filter.h +363 -0
  733. package/vendor/rocksdb/include/rocksdb/compaction_job_stats.h +109 -0
  734. package/vendor/rocksdb/include/rocksdb/comparator.h +164 -0
  735. package/vendor/rocksdb/include/rocksdb/compression_type.h +40 -0
  736. package/vendor/rocksdb/include/rocksdb/concurrent_task_limiter.h +51 -0
  737. package/vendor/rocksdb/include/rocksdb/configurable.h +390 -0
  738. package/vendor/rocksdb/include/rocksdb/convenience.h +466 -0
  739. package/vendor/rocksdb/include/rocksdb/customizable.h +229 -0
  740. package/vendor/rocksdb/include/rocksdb/data_structure.h +186 -0
  741. package/vendor/rocksdb/include/rocksdb/db.h +1980 -0
  742. package/vendor/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  743. package/vendor/rocksdb/include/rocksdb/db_dump_tool.h +43 -0
  744. package/vendor/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  745. package/vendor/rocksdb/include/rocksdb/env.h +1882 -0
  746. package/vendor/rocksdb/include/rocksdb/env_encryption.h +463 -0
  747. package/vendor/rocksdb/include/rocksdb/experimental.h +56 -0
  748. package/vendor/rocksdb/include/rocksdb/file_checksum.h +146 -0
  749. package/vendor/rocksdb/include/rocksdb/file_system.h +1849 -0
  750. package/vendor/rocksdb/include/rocksdb/filter_policy.h +206 -0
  751. package/vendor/rocksdb/include/rocksdb/flush_block_policy.h +75 -0
  752. package/vendor/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  753. package/vendor/rocksdb/include/rocksdb/io_status.h +244 -0
  754. package/vendor/rocksdb/include/rocksdb/iostats_context.h +98 -0
  755. package/vendor/rocksdb/include/rocksdb/iterator.h +144 -0
  756. package/vendor/rocksdb/include/rocksdb/ldb_tool.h +42 -0
  757. package/vendor/rocksdb/include/rocksdb/listener.h +840 -0
  758. package/vendor/rocksdb/include/rocksdb/memory_allocator.h +87 -0
  759. package/vendor/rocksdb/include/rocksdb/memtablerep.h +421 -0
  760. package/vendor/rocksdb/include/rocksdb/merge_operator.h +286 -0
  761. package/vendor/rocksdb/include/rocksdb/metadata.h +258 -0
  762. package/vendor/rocksdb/include/rocksdb/options.h +2083 -0
  763. package/vendor/rocksdb/include/rocksdb/perf_context.h +314 -0
  764. package/vendor/rocksdb/include/rocksdb/perf_level.h +36 -0
  765. package/vendor/rocksdb/include/rocksdb/persistent_cache.h +74 -0
  766. package/vendor/rocksdb/include/rocksdb/port_defs.h +22 -0
  767. package/vendor/rocksdb/include/rocksdb/rate_limiter.h +159 -0
  768. package/vendor/rocksdb/include/rocksdb/rocksdb_namespace.h +16 -0
  769. package/vendor/rocksdb/include/rocksdb/secondary_cache.h +139 -0
  770. package/vendor/rocksdb/include/rocksdb/slice.h +264 -0
  771. package/vendor/rocksdb/include/rocksdb/slice_transform.h +135 -0
  772. package/vendor/rocksdb/include/rocksdb/snapshot.h +53 -0
  773. package/vendor/rocksdb/include/rocksdb/sst_dump_tool.h +17 -0
  774. package/vendor/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  775. package/vendor/rocksdb/include/rocksdb/sst_file_reader.h +45 -0
  776. package/vendor/rocksdb/include/rocksdb/sst_file_writer.h +189 -0
  777. package/vendor/rocksdb/include/rocksdb/sst_partitioner.h +142 -0
  778. package/vendor/rocksdb/include/rocksdb/statistics.h +757 -0
  779. package/vendor/rocksdb/include/rocksdb/stats_history.h +70 -0
  780. package/vendor/rocksdb/include/rocksdb/status.h +574 -0
  781. package/vendor/rocksdb/include/rocksdb/system_clock.h +114 -0
  782. package/vendor/rocksdb/include/rocksdb/table.h +927 -0
  783. package/vendor/rocksdb/include/rocksdb/table_properties.h +332 -0
  784. package/vendor/rocksdb/include/rocksdb/table_reader_caller.h +41 -0
  785. package/vendor/rocksdb/include/rocksdb/thread_status.h +190 -0
  786. package/vendor/rocksdb/include/rocksdb/threadpool.h +67 -0
  787. package/vendor/rocksdb/include/rocksdb/trace_reader_writer.h +52 -0
  788. package/vendor/rocksdb/include/rocksdb/trace_record.h +248 -0
  789. package/vendor/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  790. package/vendor/rocksdb/include/rocksdb/transaction_log.h +122 -0
  791. package/vendor/rocksdb/include/rocksdb/types.h +94 -0
  792. package/vendor/rocksdb/include/rocksdb/unique_id.h +55 -0
  793. package/vendor/rocksdb/include/rocksdb/universal_compaction.h +96 -0
  794. package/vendor/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  795. package/vendor/rocksdb/include/rocksdb/utilities/backup_engine.h +689 -0
  796. package/vendor/rocksdb/include/rocksdb/utilities/cache_dump_load.h +140 -0
  797. package/vendor/rocksdb/include/rocksdb/utilities/checkpoint.h +63 -0
  798. package/vendor/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  799. package/vendor/rocksdb/include/rocksdb/utilities/customizable_util.h +322 -0
  800. package/vendor/rocksdb/include/rocksdb/utilities/db_ttl.h +70 -0
  801. package/vendor/rocksdb/include/rocksdb/utilities/debug.h +46 -0
  802. package/vendor/rocksdb/include/rocksdb/utilities/env_mirror.h +179 -0
  803. package/vendor/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  804. package/vendor/rocksdb/include/rocksdb/utilities/ldb_cmd.h +316 -0
  805. package/vendor/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +75 -0
  806. package/vendor/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  807. package/vendor/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  808. package/vendor/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  809. package/vendor/rocksdb/include/rocksdb/utilities/memory_util.h +48 -0
  810. package/vendor/rocksdb/include/rocksdb/utilities/object_registry.h +583 -0
  811. package/vendor/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +98 -0
  812. package/vendor/rocksdb/include/rocksdb/utilities/option_change_migration.h +24 -0
  813. package/vendor/rocksdb/include/rocksdb/utilities/options_type.h +1221 -0
  814. package/vendor/rocksdb/include/rocksdb/utilities/options_util.h +105 -0
  815. package/vendor/rocksdb/include/rocksdb/utilities/replayer.h +85 -0
  816. package/vendor/rocksdb/include/rocksdb/utilities/sim_cache.h +93 -0
  817. package/vendor/rocksdb/include/rocksdb/utilities/stackable_db.h +587 -0
  818. package/vendor/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +88 -0
  819. package/vendor/rocksdb/include/rocksdb/utilities/transaction.h +683 -0
  820. package/vendor/rocksdb/include/rocksdb/utilities/transaction_db.h +506 -0
  821. package/vendor/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +89 -0
  822. package/vendor/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +307 -0
  823. package/vendor/rocksdb/include/rocksdb/version.h +43 -0
  824. package/vendor/rocksdb/include/rocksdb/wal_filter.h +111 -0
  825. package/vendor/rocksdb/include/rocksdb/wide_columns.h +210 -0
  826. package/vendor/rocksdb/include/rocksdb/write_batch.h +494 -0
  827. package/vendor/rocksdb/include/rocksdb/write_batch_base.h +144 -0
  828. package/vendor/rocksdb/include/rocksdb/write_buffer_manager.h +183 -0
  829. package/vendor/rocksdb/issue_template.md +7 -0
  830. package/vendor/rocksdb/java/CMakeLists.txt +549 -0
  831. package/vendor/rocksdb/java/GetBenchmarks.md +161 -0
  832. package/vendor/rocksdb/java/HISTORY-JAVA.md +86 -0
  833. package/vendor/rocksdb/java/Makefile +453 -0
  834. package/vendor/rocksdb/java/RELEASE.md +59 -0
  835. package/vendor/rocksdb/java/benchmark/src/main/java/org/rocksdb/benchmark/DbBenchmark.java +1640 -0
  836. package/vendor/rocksdb/java/crossbuild/Vagrantfile +51 -0
  837. package/vendor/rocksdb/java/crossbuild/build-linux-alpine.sh +70 -0
  838. package/vendor/rocksdb/java/crossbuild/build-linux-centos.sh +38 -0
  839. package/vendor/rocksdb/java/crossbuild/build-linux.sh +15 -0
  840. package/vendor/rocksdb/java/crossbuild/docker-build-linux-alpine.sh +17 -0
  841. package/vendor/rocksdb/java/crossbuild/docker-build-linux-centos.sh +38 -0
  842. package/vendor/rocksdb/java/jdb_bench.sh +13 -0
  843. package/vendor/rocksdb/java/jmh/LICENSE-HEADER.txt +5 -0
  844. package/vendor/rocksdb/java/jmh/README.md +24 -0
  845. package/vendor/rocksdb/java/jmh/pom.xml +138 -0
  846. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/ComparatorBenchmarks.java +139 -0
  847. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/GetBenchmarks.java +215 -0
  848. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/MultiGetBenchmarks.java +214 -0
  849. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/PutBenchmarks.java +112 -0
  850. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/util/FileUtils.java +59 -0
  851. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/util/KVUtils.java +72 -0
  852. package/vendor/rocksdb/java/pom.xml.template +178 -0
  853. package/vendor/rocksdb/java/rocksjni/backup_engine_options.cc +365 -0
  854. package/vendor/rocksdb/java/rocksjni/backupenginejni.cc +279 -0
  855. package/vendor/rocksdb/java/rocksjni/cache.cc +34 -0
  856. package/vendor/rocksdb/java/rocksjni/cassandra_compactionfilterjni.cc +25 -0
  857. package/vendor/rocksdb/java/rocksjni/cassandra_value_operator.cc +50 -0
  858. package/vendor/rocksdb/java/rocksjni/checkpoint.cc +71 -0
  859. package/vendor/rocksdb/java/rocksjni/clock_cache.cc +42 -0
  860. package/vendor/rocksdb/java/rocksjni/columnfamilyhandle.cc +72 -0
  861. package/vendor/rocksdb/java/rocksjni/compact_range_options.cc +222 -0
  862. package/vendor/rocksdb/java/rocksjni/compaction_filter.cc +29 -0
  863. package/vendor/rocksdb/java/rocksjni/compaction_filter_factory.cc +42 -0
  864. package/vendor/rocksdb/java/rocksjni/compaction_filter_factory_jnicallback.cc +79 -0
  865. package/vendor/rocksdb/java/rocksjni/compaction_filter_factory_jnicallback.h +37 -0
  866. package/vendor/rocksdb/java/rocksjni/compaction_job_info.cc +230 -0
  867. package/vendor/rocksdb/java/rocksjni/compaction_job_stats.cc +345 -0
  868. package/vendor/rocksdb/java/rocksjni/compaction_options.cc +112 -0
  869. package/vendor/rocksdb/java/rocksjni/compaction_options_fifo.cc +83 -0
  870. package/vendor/rocksdb/java/rocksjni/compaction_options_universal.cc +209 -0
  871. package/vendor/rocksdb/java/rocksjni/comparator.cc +60 -0
  872. package/vendor/rocksdb/java/rocksjni/comparatorjnicallback.cc +647 -0
  873. package/vendor/rocksdb/java/rocksjni/comparatorjnicallback.h +137 -0
  874. package/vendor/rocksdb/java/rocksjni/compression_options.cc +214 -0
  875. package/vendor/rocksdb/java/rocksjni/concurrent_task_limiter.cc +97 -0
  876. package/vendor/rocksdb/java/rocksjni/config_options.cc +103 -0
  877. package/vendor/rocksdb/java/rocksjni/cplusplus_to_java_convert.h +37 -0
  878. package/vendor/rocksdb/java/rocksjni/env.cc +205 -0
  879. package/vendor/rocksdb/java/rocksjni/env_options.cc +305 -0
  880. package/vendor/rocksdb/java/rocksjni/event_listener.cc +44 -0
  881. package/vendor/rocksdb/java/rocksjni/event_listener_jnicallback.cc +502 -0
  882. package/vendor/rocksdb/java/rocksjni/event_listener_jnicallback.h +122 -0
  883. package/vendor/rocksdb/java/rocksjni/filter.cc +46 -0
  884. package/vendor/rocksdb/java/rocksjni/ingest_external_file_options.cc +199 -0
  885. package/vendor/rocksdb/java/rocksjni/iterator.cc +340 -0
  886. package/vendor/rocksdb/java/rocksjni/jnicallback.cc +54 -0
  887. package/vendor/rocksdb/java/rocksjni/jnicallback.h +32 -0
  888. package/vendor/rocksdb/java/rocksjni/loggerjnicallback.cc +299 -0
  889. package/vendor/rocksdb/java/rocksjni/loggerjnicallback.h +51 -0
  890. package/vendor/rocksdb/java/rocksjni/lru_cache.cc +49 -0
  891. package/vendor/rocksdb/java/rocksjni/memory_util.cc +100 -0
  892. package/vendor/rocksdb/java/rocksjni/memtablejni.cc +94 -0
  893. package/vendor/rocksdb/java/rocksjni/merge_operator.cc +98 -0
  894. package/vendor/rocksdb/java/rocksjni/native_comparator_wrapper_test.cc +45 -0
  895. package/vendor/rocksdb/java/rocksjni/optimistic_transaction_db.cc +270 -0
  896. package/vendor/rocksdb/java/rocksjni/optimistic_transaction_options.cc +78 -0
  897. package/vendor/rocksdb/java/rocksjni/options.cc +8695 -0
  898. package/vendor/rocksdb/java/rocksjni/options_util.cc +139 -0
  899. package/vendor/rocksdb/java/rocksjni/persistent_cache.cc +60 -0
  900. package/vendor/rocksdb/java/rocksjni/portal.h +8706 -0
  901. package/vendor/rocksdb/java/rocksjni/ratelimiterjni.cc +128 -0
  902. package/vendor/rocksdb/java/rocksjni/remove_emptyvalue_compactionfilterjni.cc +24 -0
  903. package/vendor/rocksdb/java/rocksjni/restorejni.cc +42 -0
  904. package/vendor/rocksdb/java/rocksjni/rocks_callback_object.cc +30 -0
  905. package/vendor/rocksdb/java/rocksjni/rocksdb_exception_test.cc +81 -0
  906. package/vendor/rocksdb/java/rocksjni/rocksjni.cc +3957 -0
  907. package/vendor/rocksdb/java/rocksjni/slice.cc +374 -0
  908. package/vendor/rocksdb/java/rocksjni/snapshot.cc +27 -0
  909. package/vendor/rocksdb/java/rocksjni/sst_file_manager.cc +250 -0
  910. package/vendor/rocksdb/java/rocksjni/sst_file_reader_iterator.cc +373 -0
  911. package/vendor/rocksdb/java/rocksjni/sst_file_readerjni.cc +118 -0
  912. package/vendor/rocksdb/java/rocksjni/sst_file_writerjni.cc +310 -0
  913. package/vendor/rocksdb/java/rocksjni/sst_partitioner.cc +43 -0
  914. package/vendor/rocksdb/java/rocksjni/statistics.cc +268 -0
  915. package/vendor/rocksdb/java/rocksjni/statisticsjni.cc +31 -0
  916. package/vendor/rocksdb/java/rocksjni/statisticsjni.h +34 -0
  917. package/vendor/rocksdb/java/rocksjni/table.cc +145 -0
  918. package/vendor/rocksdb/java/rocksjni/table_filter.cc +27 -0
  919. package/vendor/rocksdb/java/rocksjni/table_filter_jnicallback.cc +66 -0
  920. package/vendor/rocksdb/java/rocksjni/table_filter_jnicallback.h +36 -0
  921. package/vendor/rocksdb/java/rocksjni/testable_event_listener.cc +219 -0
  922. package/vendor/rocksdb/java/rocksjni/thread_status.cc +125 -0
  923. package/vendor/rocksdb/java/rocksjni/trace_writer.cc +24 -0
  924. package/vendor/rocksdb/java/rocksjni/trace_writer_jnicallback.cc +118 -0
  925. package/vendor/rocksdb/java/rocksjni/trace_writer_jnicallback.h +36 -0
  926. package/vendor/rocksdb/java/rocksjni/transaction.cc +1655 -0
  927. package/vendor/rocksdb/java/rocksjni/transaction_db.cc +451 -0
  928. package/vendor/rocksdb/java/rocksjni/transaction_db_options.cc +169 -0
  929. package/vendor/rocksdb/java/rocksjni/transaction_log.cc +80 -0
  930. package/vendor/rocksdb/java/rocksjni/transaction_notifier.cc +44 -0
  931. package/vendor/rocksdb/java/rocksjni/transaction_notifier_jnicallback.cc +42 -0
  932. package/vendor/rocksdb/java/rocksjni/transaction_notifier_jnicallback.h +42 -0
  933. package/vendor/rocksdb/java/rocksjni/transaction_options.cc +191 -0
  934. package/vendor/rocksdb/java/rocksjni/ttl.cc +212 -0
  935. package/vendor/rocksdb/java/rocksjni/wal_filter.cc +24 -0
  936. package/vendor/rocksdb/java/rocksjni/wal_filter_jnicallback.cc +139 -0
  937. package/vendor/rocksdb/java/rocksjni/wal_filter_jnicallback.h +42 -0
  938. package/vendor/rocksdb/java/rocksjni/write_batch.cc +676 -0
  939. package/vendor/rocksdb/java/rocksjni/write_batch_test.cc +199 -0
  940. package/vendor/rocksdb/java/rocksjni/write_batch_with_index.cc +953 -0
  941. package/vendor/rocksdb/java/rocksjni/write_buffer_manager.cc +47 -0
  942. package/vendor/rocksdb/java/rocksjni/writebatchhandlerjnicallback.cc +519 -0
  943. package/vendor/rocksdb/java/rocksjni/writebatchhandlerjnicallback.h +92 -0
  944. package/vendor/rocksdb/java/samples/src/main/java/OptimisticTransactionSample.java +184 -0
  945. package/vendor/rocksdb/java/samples/src/main/java/RocksDBColumnFamilySample.java +78 -0
  946. package/vendor/rocksdb/java/samples/src/main/java/RocksDBSample.java +295 -0
  947. package/vendor/rocksdb/java/samples/src/main/java/TransactionSample.java +183 -0
  948. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractCompactionFilter.java +59 -0
  949. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractCompactionFilterFactory.java +77 -0
  950. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractComparator.java +124 -0
  951. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractComparatorJniBridge.java +119 -0
  952. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractEventListener.java +334 -0
  953. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractImmutableNativeReference.java +65 -0
  954. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractMutableOptions.java +368 -0
  955. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractNativeReference.java +49 -0
  956. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractRocksIterator.java +146 -0
  957. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractSlice.java +191 -0
  958. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractTableFilter.java +20 -0
  959. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractTraceWriter.java +70 -0
  960. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractTransactionNotifier.java +54 -0
  961. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractWalFilter.java +49 -0
  962. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractWriteBatch.java +203 -0
  963. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AccessHint.java +53 -0
  964. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AdvancedColumnFamilyOptionsInterface.java +463 -0
  965. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AdvancedMutableColumnFamilyOptionsInterface.java +830 -0
  966. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackgroundErrorReason.java +46 -0
  967. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackupEngine.java +259 -0
  968. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackupEngineOptions.java +458 -0
  969. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackupInfo.java +76 -0
  970. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BlockBasedTableConfig.java +951 -0
  971. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BloomFilter.java +73 -0
  972. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BuiltinComparator.java +20 -0
  973. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ByteBufferGetStatus.java +50 -0
  974. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Cache.java +40 -0
  975. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CassandraCompactionFilter.java +20 -0
  976. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CassandraValueMergeOperator.java +25 -0
  977. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Checkpoint.java +62 -0
  978. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ChecksumType.java +45 -0
  979. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ClockCache.java +59 -0
  980. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyDescriptor.java +84 -0
  981. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyHandle.java +151 -0
  982. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyMetaData.java +70 -0
  983. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyOptions.java +1543 -0
  984. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyOptionsInterface.java +536 -0
  985. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactRangeOptions.java +245 -0
  986. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionJobInfo.java +161 -0
  987. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionJobStats.java +295 -0
  988. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionOptions.java +121 -0
  989. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionOptionsFIFO.java +87 -0
  990. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionOptionsUniversal.java +273 -0
  991. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionPriority.java +81 -0
  992. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionReason.java +141 -0
  993. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionStopStyle.java +55 -0
  994. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionStyle.java +81 -0
  995. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ComparatorOptions.java +133 -0
  996. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ComparatorType.java +48 -0
  997. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompressionOptions.java +150 -0
  998. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompressionType.java +121 -0
  999. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ConcurrentTaskLimiter.java +44 -0
  1000. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ConcurrentTaskLimiterImpl.java +48 -0
  1001. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ConfigOptions.java +53 -0
  1002. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DBOptions.java +1496 -0
  1003. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DBOptionsInterface.java +1756 -0
  1004. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DataBlockIndexType.java +32 -0
  1005. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DbPath.java +47 -0
  1006. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DirectSlice.java +136 -0
  1007. package/vendor/rocksdb/java/src/main/java/org/rocksdb/EncodingType.java +55 -0
  1008. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Env.java +167 -0
  1009. package/vendor/rocksdb/java/src/main/java/org/rocksdb/EnvOptions.java +366 -0
  1010. package/vendor/rocksdb/java/src/main/java/org/rocksdb/EventListener.java +335 -0
  1011. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Experimental.java +23 -0
  1012. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ExternalFileIngestionInfo.java +103 -0
  1013. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FileOperationInfo.java +112 -0
  1014. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Filter.java +36 -0
  1015. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FlushJobInfo.java +186 -0
  1016. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FlushOptions.java +90 -0
  1017. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FlushReason.java +53 -0
  1018. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HashLinkedListMemTableConfig.java +174 -0
  1019. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HashSkipListMemTableConfig.java +106 -0
  1020. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HistogramData.java +75 -0
  1021. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HistogramType.java +214 -0
  1022. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Holder.java +46 -0
  1023. package/vendor/rocksdb/java/src/main/java/org/rocksdb/IndexShorteningMode.java +60 -0
  1024. package/vendor/rocksdb/java/src/main/java/org/rocksdb/IndexType.java +55 -0
  1025. package/vendor/rocksdb/java/src/main/java/org/rocksdb/InfoLogLevel.java +49 -0
  1026. package/vendor/rocksdb/java/src/main/java/org/rocksdb/IngestExternalFileOptions.java +227 -0
  1027. package/vendor/rocksdb/java/src/main/java/org/rocksdb/KeyMayExist.java +35 -0
  1028. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LRUCache.java +106 -0
  1029. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LevelMetaData.java +56 -0
  1030. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LiveFileMetaData.java +55 -0
  1031. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LogFile.java +75 -0
  1032. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Logger.java +121 -0
  1033. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemTableConfig.java +29 -0
  1034. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemTableInfo.java +103 -0
  1035. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemoryUsageType.java +72 -0
  1036. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemoryUtil.java +60 -0
  1037. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MergeOperator.java +18 -0
  1038. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableColumnFamilyOptions.java +621 -0
  1039. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableColumnFamilyOptionsInterface.java +156 -0
  1040. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableDBOptions.java +292 -0
  1041. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableDBOptionsInterface.java +440 -0
  1042. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableOptionKey.java +16 -0
  1043. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableOptionValue.java +368 -0
  1044. package/vendor/rocksdb/java/src/main/java/org/rocksdb/NativeComparatorWrapper.java +59 -0
  1045. package/vendor/rocksdb/java/src/main/java/org/rocksdb/NativeLibraryLoader.java +172 -0
  1046. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OperationStage.java +59 -0
  1047. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OperationType.java +55 -0
  1048. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptimisticTransactionDB.java +224 -0
  1049. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptimisticTransactionOptions.java +53 -0
  1050. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptionString.java +261 -0
  1051. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Options.java +2574 -0
  1052. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptionsUtil.java +101 -0
  1053. package/vendor/rocksdb/java/src/main/java/org/rocksdb/PersistentCache.java +26 -0
  1054. package/vendor/rocksdb/java/src/main/java/org/rocksdb/PlainTableConfig.java +251 -0
  1055. package/vendor/rocksdb/java/src/main/java/org/rocksdb/PrepopulateBlobCache.java +117 -0
  1056. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Priority.java +49 -0
  1057. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Range.java +19 -0
  1058. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RateLimiter.java +227 -0
  1059. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RateLimiterMode.java +52 -0
  1060. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ReadOptions.java +822 -0
  1061. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ReadTier.java +49 -0
  1062. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RemoveEmptyValueCompactionFilter.java +18 -0
  1063. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RestoreOptions.java +32 -0
  1064. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ReusedSynchronisationType.java +65 -0
  1065. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksCallbackObject.java +73 -0
  1066. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksDB.java +4688 -0
  1067. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksDBException.java +44 -0
  1068. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksEnv.java +31 -0
  1069. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksIterator.java +140 -0
  1070. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksIteratorInterface.java +127 -0
  1071. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksMemEnv.java +31 -0
  1072. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksMutableObject.java +87 -0
  1073. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksObject.java +45 -0
  1074. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SanityLevel.java +47 -0
  1075. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SizeApproximationFlag.java +31 -0
  1076. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SkipListMemTableConfig.java +51 -0
  1077. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Slice.java +135 -0
  1078. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Snapshot.java +41 -0
  1079. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileManager.java +249 -0
  1080. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileMetaData.java +162 -0
  1081. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileReader.java +82 -0
  1082. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileReaderIterator.java +140 -0
  1083. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileWriter.java +237 -0
  1084. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstPartitionerFactory.java +15 -0
  1085. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstPartitionerFixedPrefixFactory.java +19 -0
  1086. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StateType.java +53 -0
  1087. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Statistics.java +153 -0
  1088. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatisticsCollector.java +102 -0
  1089. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatisticsCollectorCallback.java +32 -0
  1090. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatsCollectorInput.java +35 -0
  1091. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatsLevel.java +65 -0
  1092. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Status.java +155 -0
  1093. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StringAppendOperator.java +29 -0
  1094. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileCreationBriefInfo.java +107 -0
  1095. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileCreationInfo.java +86 -0
  1096. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileCreationReason.java +46 -0
  1097. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileDeletionInfo.java +86 -0
  1098. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFilter.java +21 -0
  1099. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFormatConfig.java +22 -0
  1100. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableProperties.java +426 -0
  1101. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ThreadStatus.java +224 -0
  1102. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ThreadType.java +65 -0
  1103. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TickerType.java +802 -0
  1104. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TimedEnv.java +30 -0
  1105. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TraceOptions.java +32 -0
  1106. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TraceWriter.java +36 -0
  1107. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Transaction.java +2162 -0
  1108. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionDB.java +401 -0
  1109. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionDBOptions.java +216 -0
  1110. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionLogIterator.java +112 -0
  1111. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionOptions.java +189 -0
  1112. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionalDB.java +65 -0
  1113. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionalOptions.java +31 -0
  1114. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TtlDB.java +242 -0
  1115. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TxnDBWritePolicy.java +62 -0
  1116. package/vendor/rocksdb/java/src/main/java/org/rocksdb/UInt64AddOperator.java +19 -0
  1117. package/vendor/rocksdb/java/src/main/java/org/rocksdb/VectorMemTableConfig.java +46 -0
  1118. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WALRecoveryMode.java +82 -0
  1119. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WBWIRocksIterator.java +203 -0
  1120. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WalFileType.java +55 -0
  1121. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WalFilter.java +86 -0
  1122. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WalProcessingOption.java +54 -0
  1123. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBatch.java +394 -0
  1124. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBatchInterface.java +283 -0
  1125. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBatchWithIndex.java +358 -0
  1126. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBufferManager.java +50 -0
  1127. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteOptions.java +255 -0
  1128. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteStallCondition.java +44 -0
  1129. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteStallInfo.java +75 -0
  1130. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/ByteUtil.java +52 -0
  1131. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/BytewiseComparator.java +121 -0
  1132. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/Environment.java +245 -0
  1133. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/IntComparator.java +67 -0
  1134. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/ReverseBytewiseComparator.java +88 -0
  1135. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/SizeUnit.java +16 -0
  1136. package/vendor/rocksdb/java/src/test/java/org/rocksdb/AbstractTransactionTest.java +979 -0
  1137. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BackupEngineOptionsTest.java +297 -0
  1138. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BackupEngineTest.java +261 -0
  1139. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BlobOptionsTest.java +353 -0
  1140. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BlockBasedTableConfigTest.java +415 -0
  1141. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BuiltinComparatorTest.java +145 -0
  1142. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ByteBufferUnsupportedOperationTest.java +132 -0
  1143. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BytewiseComparatorRegressionTest.java +132 -0
  1144. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CheckPointTest.java +82 -0
  1145. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ClockCacheTest.java +25 -0
  1146. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ColumnFamilyOptionsTest.java +712 -0
  1147. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ColumnFamilyTest.java +562 -0
  1148. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactRangeOptionsTest.java +102 -0
  1149. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionFilterFactoryTest.java +61 -0
  1150. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionJobInfoTest.java +114 -0
  1151. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionJobStatsTest.java +196 -0
  1152. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionOptionsFIFOTest.java +35 -0
  1153. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionOptionsTest.java +52 -0
  1154. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionOptionsUniversalTest.java +80 -0
  1155. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionPriorityTest.java +31 -0
  1156. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionStopStyleTest.java +31 -0
  1157. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ComparatorOptionsTest.java +58 -0
  1158. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompressionOptionsTest.java +71 -0
  1159. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompressionTypesTest.java +25 -0
  1160. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ConcurrentTaskLimiterTest.java +56 -0
  1161. package/vendor/rocksdb/java/src/test/java/org/rocksdb/DBOptionsTest.java +902 -0
  1162. package/vendor/rocksdb/java/src/test/java/org/rocksdb/DefaultEnvTest.java +113 -0
  1163. package/vendor/rocksdb/java/src/test/java/org/rocksdb/DirectSliceTest.java +93 -0
  1164. package/vendor/rocksdb/java/src/test/java/org/rocksdb/EnvOptionsTest.java +145 -0
  1165. package/vendor/rocksdb/java/src/test/java/org/rocksdb/EventListenerTest.java +725 -0
  1166. package/vendor/rocksdb/java/src/test/java/org/rocksdb/FilterTest.java +39 -0
  1167. package/vendor/rocksdb/java/src/test/java/org/rocksdb/FlushOptionsTest.java +31 -0
  1168. package/vendor/rocksdb/java/src/test/java/org/rocksdb/FlushTest.java +49 -0
  1169. package/vendor/rocksdb/java/src/test/java/org/rocksdb/InfoLogLevelTest.java +109 -0
  1170. package/vendor/rocksdb/java/src/test/java/org/rocksdb/IngestExternalFileOptionsTest.java +107 -0
  1171. package/vendor/rocksdb/java/src/test/java/org/rocksdb/KeyMayExistTest.java +528 -0
  1172. package/vendor/rocksdb/java/src/test/java/org/rocksdb/LRUCacheTest.java +32 -0
  1173. package/vendor/rocksdb/java/src/test/java/org/rocksdb/LoggerTest.java +235 -0
  1174. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MemTableTest.java +108 -0
  1175. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MemoryUtilTest.java +136 -0
  1176. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MergeTest.java +465 -0
  1177. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MixedOptionsTest.java +85 -0
  1178. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MultiColumnRegressionTest.java +145 -0
  1179. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MultiGetManyKeysTest.java +241 -0
  1180. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MultiGetTest.java +530 -0
  1181. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MutableColumnFamilyOptionsTest.java +167 -0
  1182. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MutableDBOptionsTest.java +85 -0
  1183. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MutableOptionsGetSetTest.java +429 -0
  1184. package/vendor/rocksdb/java/src/test/java/org/rocksdb/NativeComparatorWrapperTest.java +90 -0
  1185. package/vendor/rocksdb/java/src/test/java/org/rocksdb/NativeLibraryLoaderTest.java +41 -0
  1186. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptimisticTransactionDBTest.java +131 -0
  1187. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptimisticTransactionOptionsTest.java +38 -0
  1188. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptimisticTransactionTest.java +446 -0
  1189. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptionsTest.java +1488 -0
  1190. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptionsUtilTest.java +129 -0
  1191. package/vendor/rocksdb/java/src/test/java/org/rocksdb/PlainTableConfigTest.java +89 -0
  1192. package/vendor/rocksdb/java/src/test/java/org/rocksdb/PlatformRandomHelper.java +58 -0
  1193. package/vendor/rocksdb/java/src/test/java/org/rocksdb/PutMultiplePartsTest.java +164 -0
  1194. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RateLimiterTest.java +65 -0
  1195. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ReadOnlyTest.java +222 -0
  1196. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ReadOptionsTest.java +374 -0
  1197. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksDBExceptionTest.java +115 -0
  1198. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksDBTest.java +1692 -0
  1199. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksIteratorTest.java +289 -0
  1200. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksMemEnvTest.java +137 -0
  1201. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksNativeLibraryResource.java +18 -0
  1202. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SecondaryDBTest.java +135 -0
  1203. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SliceTest.java +80 -0
  1204. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SnapshotTest.java +169 -0
  1205. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstFileManagerTest.java +66 -0
  1206. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstFileReaderTest.java +222 -0
  1207. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstFileWriterTest.java +239 -0
  1208. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstPartitionerTest.java +72 -0
  1209. package/vendor/rocksdb/java/src/test/java/org/rocksdb/StatisticsCollectorTest.java +55 -0
  1210. package/vendor/rocksdb/java/src/test/java/org/rocksdb/StatisticsTest.java +168 -0
  1211. package/vendor/rocksdb/java/src/test/java/org/rocksdb/StatsCallbackMock.java +19 -0
  1212. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TableFilterTest.java +106 -0
  1213. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TimedEnvTest.java +40 -0
  1214. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionDBOptionsTest.java +64 -0
  1215. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionDBTest.java +177 -0
  1216. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionLogIteratorTest.java +139 -0
  1217. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionOptionsTest.java +72 -0
  1218. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionTest.java +488 -0
  1219. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TtlDBTest.java +112 -0
  1220. package/vendor/rocksdb/java/src/test/java/org/rocksdb/Types.java +43 -0
  1221. package/vendor/rocksdb/java/src/test/java/org/rocksdb/VerifyChecksumsTest.java +213 -0
  1222. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WALRecoveryModeTest.java +22 -0
  1223. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WalFilterTest.java +165 -0
  1224. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchHandlerTest.java +76 -0
  1225. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchTest.java +528 -0
  1226. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchThreadedTest.java +101 -0
  1227. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchWithIndexTest.java +1068 -0
  1228. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteOptionsTest.java +75 -0
  1229. package/vendor/rocksdb/java/src/test/java/org/rocksdb/test/RemoveEmptyValueCompactionFilterFactory.java +21 -0
  1230. package/vendor/rocksdb/java/src/test/java/org/rocksdb/test/RocksJunitRunner.java +174 -0
  1231. package/vendor/rocksdb/java/src/test/java/org/rocksdb/test/TestableEventListener.java +23 -0
  1232. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/ByteBufferAllocator.java +16 -0
  1233. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/BytewiseComparatorIntTest.java +267 -0
  1234. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/BytewiseComparatorTest.java +531 -0
  1235. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/CapturingWriteBatchHandler.java +190 -0
  1236. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/DirectByteBufferAllocator.java +18 -0
  1237. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/EnvironmentTest.java +304 -0
  1238. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/HeapByteBufferAllocator.java +18 -0
  1239. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/IntComparatorTest.java +266 -0
  1240. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/JNIComparatorTest.java +180 -0
  1241. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/ReverseBytewiseComparatorIntTest.java +270 -0
  1242. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/SizeUnitTest.java +27 -0
  1243. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/TestUtil.java +72 -0
  1244. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/WriteBatchGetter.java +139 -0
  1245. package/vendor/rocksdb/java/understanding_options.md +79 -0
  1246. package/vendor/rocksdb/logging/auto_roll_logger.cc +368 -0
  1247. package/vendor/rocksdb/logging/auto_roll_logger.h +166 -0
  1248. package/vendor/rocksdb/logging/auto_roll_logger_test.cc +731 -0
  1249. package/vendor/rocksdb/logging/env_logger.h +195 -0
  1250. package/vendor/rocksdb/logging/env_logger_test.cc +163 -0
  1251. package/vendor/rocksdb/logging/event_logger.cc +68 -0
  1252. package/vendor/rocksdb/logging/event_logger.h +202 -0
  1253. package/vendor/rocksdb/logging/event_logger_test.cc +45 -0
  1254. package/vendor/rocksdb/logging/log_buffer.cc +91 -0
  1255. package/vendor/rocksdb/logging/log_buffer.h +57 -0
  1256. package/vendor/rocksdb/logging/logging.h +62 -0
  1257. package/vendor/rocksdb/memory/allocator.h +58 -0
  1258. package/vendor/rocksdb/memory/arena.cc +170 -0
  1259. package/vendor/rocksdb/memory/arena.h +135 -0
  1260. package/vendor/rocksdb/memory/arena_test.cc +295 -0
  1261. package/vendor/rocksdb/memory/concurrent_arena.cc +45 -0
  1262. package/vendor/rocksdb/memory/concurrent_arena.h +215 -0
  1263. package/vendor/rocksdb/memory/jemalloc_nodump_allocator.cc +303 -0
  1264. package/vendor/rocksdb/memory/jemalloc_nodump_allocator.h +99 -0
  1265. package/vendor/rocksdb/memory/memkind_kmem_allocator.cc +44 -0
  1266. package/vendor/rocksdb/memory/memkind_kmem_allocator.h +43 -0
  1267. package/vendor/rocksdb/memory/memory_allocator.cc +80 -0
  1268. package/vendor/rocksdb/memory/memory_allocator_impl.h +47 -0
  1269. package/vendor/rocksdb/memory/memory_allocator_test.cc +236 -0
  1270. package/vendor/rocksdb/memory/memory_usage.h +38 -0
  1271. package/vendor/rocksdb/memtable/alloc_tracker.cc +63 -0
  1272. package/vendor/rocksdb/memtable/hash_linklist_rep.cc +924 -0
  1273. package/vendor/rocksdb/memtable/hash_skiplist_rep.cc +391 -0
  1274. package/vendor/rocksdb/memtable/inlineskiplist.h +1051 -0
  1275. package/vendor/rocksdb/memtable/inlineskiplist_test.cc +665 -0
  1276. package/vendor/rocksdb/memtable/memtablerep_bench.cc +687 -0
  1277. package/vendor/rocksdb/memtable/skiplist.h +498 -0
  1278. package/vendor/rocksdb/memtable/skiplist_test.cc +388 -0
  1279. package/vendor/rocksdb/memtable/skiplistrep.cc +368 -0
  1280. package/vendor/rocksdb/memtable/stl_wrappers.h +33 -0
  1281. package/vendor/rocksdb/memtable/vectorrep.cc +307 -0
  1282. package/vendor/rocksdb/memtable/write_buffer_manager.cc +185 -0
  1283. package/vendor/rocksdb/memtable/write_buffer_manager_test.cc +304 -0
  1284. package/vendor/rocksdb/microbench/CMakeLists.txt +17 -0
  1285. package/vendor/rocksdb/microbench/README.md +60 -0
  1286. package/vendor/rocksdb/microbench/db_basic_bench.cc +1583 -0
  1287. package/vendor/rocksdb/microbench/ribbon_bench.cc +155 -0
  1288. package/vendor/rocksdb/monitoring/file_read_sample.h +23 -0
  1289. package/vendor/rocksdb/monitoring/histogram.cc +270 -0
  1290. package/vendor/rocksdb/monitoring/histogram.h +143 -0
  1291. package/vendor/rocksdb/monitoring/histogram_test.cc +254 -0
  1292. package/vendor/rocksdb/monitoring/histogram_windowing.cc +194 -0
  1293. package/vendor/rocksdb/monitoring/histogram_windowing.h +84 -0
  1294. package/vendor/rocksdb/monitoring/in_memory_stats_history.cc +50 -0
  1295. package/vendor/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  1296. package/vendor/rocksdb/monitoring/instrumented_mutex.cc +90 -0
  1297. package/vendor/rocksdb/monitoring/instrumented_mutex.h +126 -0
  1298. package/vendor/rocksdb/monitoring/iostats_context.cc +78 -0
  1299. package/vendor/rocksdb/monitoring/iostats_context_imp.h +62 -0
  1300. package/vendor/rocksdb/monitoring/iostats_context_test.cc +31 -0
  1301. package/vendor/rocksdb/monitoring/perf_context.cc +313 -0
  1302. package/vendor/rocksdb/monitoring/perf_context_imp.h +96 -0
  1303. package/vendor/rocksdb/monitoring/perf_level.cc +23 -0
  1304. package/vendor/rocksdb/monitoring/perf_level_imp.h +14 -0
  1305. package/vendor/rocksdb/monitoring/perf_step_timer.h +77 -0
  1306. package/vendor/rocksdb/monitoring/persistent_stats_history.cc +170 -0
  1307. package/vendor/rocksdb/monitoring/persistent_stats_history.h +83 -0
  1308. package/vendor/rocksdb/monitoring/statistics.cc +534 -0
  1309. package/vendor/rocksdb/monitoring/statistics_impl.h +144 -0
  1310. package/vendor/rocksdb/monitoring/statistics_test.cc +88 -0
  1311. package/vendor/rocksdb/monitoring/stats_history_test.cc +662 -0
  1312. package/vendor/rocksdb/monitoring/thread_status_impl.cc +163 -0
  1313. package/vendor/rocksdb/monitoring/thread_status_updater.cc +328 -0
  1314. package/vendor/rocksdb/monitoring/thread_status_updater.h +226 -0
  1315. package/vendor/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  1316. package/vendor/rocksdb/monitoring/thread_status_util.cc +208 -0
  1317. package/vendor/rocksdb/monitoring/thread_status_util.h +139 -0
  1318. package/vendor/rocksdb/monitoring/thread_status_util_debug.cc +46 -0
  1319. package/vendor/rocksdb/options/cf_options.cc +1196 -0
  1320. package/vendor/rocksdb/options/cf_options.h +347 -0
  1321. package/vendor/rocksdb/options/configurable.cc +712 -0
  1322. package/vendor/rocksdb/options/configurable_helper.h +185 -0
  1323. package/vendor/rocksdb/options/configurable_test.cc +861 -0
  1324. package/vendor/rocksdb/options/configurable_test.h +116 -0
  1325. package/vendor/rocksdb/options/customizable.cc +133 -0
  1326. package/vendor/rocksdb/options/customizable_test.cc +2116 -0
  1327. package/vendor/rocksdb/options/db_options.cc +1079 -0
  1328. package/vendor/rocksdb/options/db_options.h +152 -0
  1329. package/vendor/rocksdb/options/options.cc +692 -0
  1330. package/vendor/rocksdb/options/options_helper.cc +1424 -0
  1331. package/vendor/rocksdb/options/options_helper.h +116 -0
  1332. package/vendor/rocksdb/options/options_parser.cc +736 -0
  1333. package/vendor/rocksdb/options/options_parser.h +149 -0
  1334. package/vendor/rocksdb/options/options_settable_test.cc +655 -0
  1335. package/vendor/rocksdb/options/options_test.cc +5060 -0
  1336. package/vendor/rocksdb/plugin/README.md +43 -0
  1337. package/vendor/rocksdb/port/README +10 -0
  1338. package/vendor/rocksdb/port/jemalloc_helper.h +107 -0
  1339. package/vendor/rocksdb/port/lang.h +97 -0
  1340. package/vendor/rocksdb/port/likely.h +18 -0
  1341. package/vendor/rocksdb/port/malloc.h +17 -0
  1342. package/vendor/rocksdb/port/mmap.cc +98 -0
  1343. package/vendor/rocksdb/port/mmap.h +70 -0
  1344. package/vendor/rocksdb/port/port.h +21 -0
  1345. package/vendor/rocksdb/port/port_dirent.h +44 -0
  1346. package/vendor/rocksdb/port/port_example.h +101 -0
  1347. package/vendor/rocksdb/port/port_posix.cc +300 -0
  1348. package/vendor/rocksdb/port/port_posix.h +243 -0
  1349. package/vendor/rocksdb/port/stack_trace.cc +336 -0
  1350. package/vendor/rocksdb/port/stack_trace.h +31 -0
  1351. package/vendor/rocksdb/port/sys_time.h +63 -0
  1352. package/vendor/rocksdb/port/util_logger.h +18 -0
  1353. package/vendor/rocksdb/port/win/env_default.cc +45 -0
  1354. package/vendor/rocksdb/port/win/env_win.cc +1437 -0
  1355. package/vendor/rocksdb/port/win/env_win.h +305 -0
  1356. package/vendor/rocksdb/port/win/io_win.cc +1101 -0
  1357. package/vendor/rocksdb/port/win/io_win.h +508 -0
  1358. package/vendor/rocksdb/port/win/port_win.cc +303 -0
  1359. package/vendor/rocksdb/port/win/port_win.h +379 -0
  1360. package/vendor/rocksdb/port/win/win_jemalloc.cc +80 -0
  1361. package/vendor/rocksdb/port/win/win_logger.cc +192 -0
  1362. package/vendor/rocksdb/port/win/win_logger.h +64 -0
  1363. package/vendor/rocksdb/port/win/win_thread.cc +170 -0
  1364. package/vendor/rocksdb/port/win/win_thread.h +117 -0
  1365. package/vendor/rocksdb/port/win/xpress_win.cc +210 -0
  1366. package/vendor/rocksdb/port/win/xpress_win.h +26 -0
  1367. package/vendor/rocksdb/port/xpress.h +17 -0
  1368. package/vendor/rocksdb/rocksdb.pc.in +10 -0
  1369. package/vendor/rocksdb/src.mk +713 -0
  1370. package/vendor/rocksdb/table/adaptive/adaptive_table_factory.cc +125 -0
  1371. package/vendor/rocksdb/table/adaptive/adaptive_table_factory.h +56 -0
  1372. package/vendor/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  1373. package/vendor/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  1374. package/vendor/rocksdb/table/block_based/block.cc +1291 -0
  1375. package/vendor/rocksdb/table/block_based/block.h +921 -0
  1376. package/vendor/rocksdb/table/block_based/block_based_table_builder.cc +2027 -0
  1377. package/vendor/rocksdb/table/block_based/block_based_table_builder.h +209 -0
  1378. package/vendor/rocksdb/table/block_based/block_based_table_factory.cc +962 -0
  1379. package/vendor/rocksdb/table/block_based/block_based_table_factory.h +102 -0
  1380. package/vendor/rocksdb/table/block_based/block_based_table_iterator.cc +500 -0
  1381. package/vendor/rocksdb/table/block_based/block_based_table_iterator.h +310 -0
  1382. package/vendor/rocksdb/table/block_based/block_based_table_reader.cc +3043 -0
  1383. package/vendor/rocksdb/table/block_based/block_based_table_reader.h +745 -0
  1384. package/vendor/rocksdb/table/block_based/block_based_table_reader_impl.h +203 -0
  1385. package/vendor/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +758 -0
  1386. package/vendor/rocksdb/table/block_based/block_based_table_reader_test.cc +567 -0
  1387. package/vendor/rocksdb/table/block_based/block_builder.cc +234 -0
  1388. package/vendor/rocksdb/table/block_based/block_builder.h +104 -0
  1389. package/vendor/rocksdb/table/block_based/block_cache.cc +106 -0
  1390. package/vendor/rocksdb/table/block_based/block_cache.h +140 -0
  1391. package/vendor/rocksdb/table/block_based/block_prefetcher.cc +120 -0
  1392. package/vendor/rocksdb/table/block_based/block_prefetcher.h +72 -0
  1393. package/vendor/rocksdb/table/block_based/block_prefix_index.cc +226 -0
  1394. package/vendor/rocksdb/table/block_based/block_prefix_index.h +70 -0
  1395. package/vendor/rocksdb/table/block_based/block_test.cc +1543 -0
  1396. package/vendor/rocksdb/table/block_based/block_type.h +34 -0
  1397. package/vendor/rocksdb/table/block_based/cachable_entry.h +244 -0
  1398. package/vendor/rocksdb/table/block_based/data_block_footer.cc +59 -0
  1399. package/vendor/rocksdb/table/block_based/data_block_footer.h +25 -0
  1400. package/vendor/rocksdb/table/block_based/data_block_hash_index.cc +94 -0
  1401. package/vendor/rocksdb/table/block_based/data_block_hash_index.h +137 -0
  1402. package/vendor/rocksdb/table/block_based/data_block_hash_index_test.cc +718 -0
  1403. package/vendor/rocksdb/table/block_based/filter_block.h +183 -0
  1404. package/vendor/rocksdb/table/block_based/filter_block_reader_common.cc +163 -0
  1405. package/vendor/rocksdb/table/block_based/filter_block_reader_common.h +76 -0
  1406. package/vendor/rocksdb/table/block_based/filter_policy.cc +1966 -0
  1407. package/vendor/rocksdb/table/block_based/filter_policy_internal.h +340 -0
  1408. package/vendor/rocksdb/table/block_based/flush_block_policy.cc +132 -0
  1409. package/vendor/rocksdb/table/block_based/flush_block_policy_impl.h +40 -0
  1410. package/vendor/rocksdb/table/block_based/full_filter_block.cc +290 -0
  1411. package/vendor/rocksdb/table/block_based/full_filter_block.h +147 -0
  1412. package/vendor/rocksdb/table/block_based/full_filter_block_test.cc +323 -0
  1413. package/vendor/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  1414. package/vendor/rocksdb/table/block_based/hash_index_reader.h +49 -0
  1415. package/vendor/rocksdb/table/block_based/index_builder.cc +282 -0
  1416. package/vendor/rocksdb/table/block_based/index_builder.h +455 -0
  1417. package/vendor/rocksdb/table/block_based/index_reader_common.cc +57 -0
  1418. package/vendor/rocksdb/table/block_based/index_reader_common.h +85 -0
  1419. package/vendor/rocksdb/table/block_based/mock_block_based_table.h +62 -0
  1420. package/vendor/rocksdb/table/block_based/parsed_full_filter_block.cc +23 -0
  1421. package/vendor/rocksdb/table/block_based/parsed_full_filter_block.h +47 -0
  1422. package/vendor/rocksdb/table/block_based/partitioned_filter_block.cc +554 -0
  1423. package/vendor/rocksdb/table/block_based/partitioned_filter_block.h +182 -0
  1424. package/vendor/rocksdb/table/block_based/partitioned_filter_block_test.cc +436 -0
  1425. package/vendor/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  1426. package/vendor/rocksdb/table/block_based/partitioned_index_iterator.h +160 -0
  1427. package/vendor/rocksdb/table/block_based/partitioned_index_reader.cc +224 -0
  1428. package/vendor/rocksdb/table/block_based/partitioned_index_reader.h +56 -0
  1429. package/vendor/rocksdb/table/block_based/reader_common.cc +52 -0
  1430. package/vendor/rocksdb/table/block_based/reader_common.h +34 -0
  1431. package/vendor/rocksdb/table/block_based/uncompression_dict_reader.cc +126 -0
  1432. package/vendor/rocksdb/table/block_based/uncompression_dict_reader.h +61 -0
  1433. package/vendor/rocksdb/table/block_fetcher.cc +405 -0
  1434. package/vendor/rocksdb/table/block_fetcher.h +142 -0
  1435. package/vendor/rocksdb/table/block_fetcher_test.cc +520 -0
  1436. package/vendor/rocksdb/table/cleanable_test.cc +390 -0
  1437. package/vendor/rocksdb/table/compaction_merging_iterator.cc +370 -0
  1438. package/vendor/rocksdb/table/compaction_merging_iterator.h +44 -0
  1439. package/vendor/rocksdb/table/cuckoo/cuckoo_table_builder.cc +551 -0
  1440. package/vendor/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  1441. package/vendor/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +631 -0
  1442. package/vendor/rocksdb/table/cuckoo/cuckoo_table_factory.cc +100 -0
  1443. package/vendor/rocksdb/table/cuckoo/cuckoo_table_factory.h +80 -0
  1444. package/vendor/rocksdb/table/cuckoo/cuckoo_table_reader.cc +412 -0
  1445. package/vendor/rocksdb/table/cuckoo/cuckoo_table_reader.h +100 -0
  1446. package/vendor/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +574 -0
  1447. package/vendor/rocksdb/table/format.cc +573 -0
  1448. package/vendor/rocksdb/table/format.h +378 -0
  1449. package/vendor/rocksdb/table/get_context.cc +616 -0
  1450. package/vendor/rocksdb/table/get_context.h +245 -0
  1451. package/vendor/rocksdb/table/internal_iterator.h +224 -0
  1452. package/vendor/rocksdb/table/iter_heap.h +44 -0
  1453. package/vendor/rocksdb/table/iterator.cc +130 -0
  1454. package/vendor/rocksdb/table/iterator_wrapper.h +190 -0
  1455. package/vendor/rocksdb/table/merger_test.cc +182 -0
  1456. package/vendor/rocksdb/table/merging_iterator.cc +1725 -0
  1457. package/vendor/rocksdb/table/merging_iterator.h +97 -0
  1458. package/vendor/rocksdb/table/meta_blocks.cc +564 -0
  1459. package/vendor/rocksdb/table/meta_blocks.h +172 -0
  1460. package/vendor/rocksdb/table/mock_table.cc +346 -0
  1461. package/vendor/rocksdb/table/mock_table.h +94 -0
  1462. package/vendor/rocksdb/table/multiget_context.h +405 -0
  1463. package/vendor/rocksdb/table/persistent_cache_helper.cc +111 -0
  1464. package/vendor/rocksdb/table/persistent_cache_helper.h +46 -0
  1465. package/vendor/rocksdb/table/persistent_cache_options.h +34 -0
  1466. package/vendor/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  1467. package/vendor/rocksdb/table/plain/plain_table_bloom.h +132 -0
  1468. package/vendor/rocksdb/table/plain/plain_table_builder.cc +335 -0
  1469. package/vendor/rocksdb/table/plain/plain_table_builder.h +152 -0
  1470. package/vendor/rocksdb/table/plain/plain_table_factory.cc +296 -0
  1471. package/vendor/rocksdb/table/plain/plain_table_factory.h +180 -0
  1472. package/vendor/rocksdb/table/plain/plain_table_index.cc +211 -0
  1473. package/vendor/rocksdb/table/plain/plain_table_index.h +246 -0
  1474. package/vendor/rocksdb/table/plain/plain_table_key_coding.cc +507 -0
  1475. package/vendor/rocksdb/table/plain/plain_table_key_coding.h +199 -0
  1476. package/vendor/rocksdb/table/plain/plain_table_reader.cc +771 -0
  1477. package/vendor/rocksdb/table/plain/plain_table_reader.h +243 -0
  1478. package/vendor/rocksdb/table/scoped_arena_iterator.h +57 -0
  1479. package/vendor/rocksdb/table/sst_file_dumper.cc +520 -0
  1480. package/vendor/rocksdb/table/sst_file_dumper.h +99 -0
  1481. package/vendor/rocksdb/table/sst_file_reader.cc +101 -0
  1482. package/vendor/rocksdb/table/sst_file_reader_test.cc +423 -0
  1483. package/vendor/rocksdb/table/sst_file_writer.cc +436 -0
  1484. package/vendor/rocksdb/table/sst_file_writer_collectors.h +95 -0
  1485. package/vendor/rocksdb/table/table_builder.h +228 -0
  1486. package/vendor/rocksdb/table/table_factory.cc +52 -0
  1487. package/vendor/rocksdb/table/table_properties.cc +351 -0
  1488. package/vendor/rocksdb/table/table_properties_internal.h +14 -0
  1489. package/vendor/rocksdb/table/table_reader.h +187 -0
  1490. package/vendor/rocksdb/table/table_reader_bench.cc +339 -0
  1491. package/vendor/rocksdb/table/table_test.cc +5882 -0
  1492. package/vendor/rocksdb/table/two_level_iterator.cc +220 -0
  1493. package/vendor/rocksdb/table/two_level_iterator.h +43 -0
  1494. package/vendor/rocksdb/table/unique_id.cc +223 -0
  1495. package/vendor/rocksdb/table/unique_id_impl.h +93 -0
  1496. package/vendor/rocksdb/test_util/mock_time_env.cc +38 -0
  1497. package/vendor/rocksdb/test_util/mock_time_env.h +78 -0
  1498. package/vendor/rocksdb/test_util/secondary_cache_test_util.cc +96 -0
  1499. package/vendor/rocksdb/test_util/secondary_cache_test_util.h +119 -0
  1500. package/vendor/rocksdb/test_util/sync_point.cc +82 -0
  1501. package/vendor/rocksdb/test_util/sync_point.h +180 -0
  1502. package/vendor/rocksdb/test_util/sync_point_impl.cc +152 -0
  1503. package/vendor/rocksdb/test_util/sync_point_impl.h +96 -0
  1504. package/vendor/rocksdb/test_util/testharness.cc +107 -0
  1505. package/vendor/rocksdb/test_util/testharness.h +124 -0
  1506. package/vendor/rocksdb/test_util/testutil.cc +722 -0
  1507. package/vendor/rocksdb/test_util/testutil.h +860 -0
  1508. package/vendor/rocksdb/test_util/testutil_test.cc +43 -0
  1509. package/vendor/rocksdb/test_util/transaction_test_util.cc +400 -0
  1510. package/vendor/rocksdb/test_util/transaction_test_util.h +147 -0
  1511. package/vendor/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  1512. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/CMakeLists.txt +4 -0
  1513. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/gtest-all.cc +11394 -0
  1514. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/gtest.h +22115 -0
  1515. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/gtest_main.cc +37 -0
  1516. package/vendor/rocksdb/thirdparty.inc +268 -0
  1517. package/vendor/rocksdb/tools/CMakeLists.txt +30 -0
  1518. package/vendor/rocksdb/tools/Dockerfile +5 -0
  1519. package/vendor/rocksdb/tools/advisor/README.md +96 -0
  1520. package/vendor/rocksdb/tools/advisor/advisor/__init__.py +0 -0
  1521. package/vendor/rocksdb/tools/advisor/advisor/bench_runner.py +39 -0
  1522. package/vendor/rocksdb/tools/advisor/advisor/config_optimizer_example.py +140 -0
  1523. package/vendor/rocksdb/tools/advisor/advisor/db_bench_runner.py +237 -0
  1524. package/vendor/rocksdb/tools/advisor/advisor/db_config_optimizer.py +293 -0
  1525. package/vendor/rocksdb/tools/advisor/advisor/db_log_parser.py +134 -0
  1526. package/vendor/rocksdb/tools/advisor/advisor/db_options_parser.py +348 -0
  1527. package/vendor/rocksdb/tools/advisor/advisor/db_stats_fetcher.py +346 -0
  1528. package/vendor/rocksdb/tools/advisor/advisor/db_timeseries_parser.py +203 -0
  1529. package/vendor/rocksdb/tools/advisor/advisor/ini_parser.py +76 -0
  1530. package/vendor/rocksdb/tools/advisor/advisor/rule_parser.py +510 -0
  1531. package/vendor/rocksdb/tools/advisor/advisor/rule_parser_example.py +98 -0
  1532. package/vendor/rocksdb/tools/advisor/advisor/rules.ini +214 -0
  1533. package/vendor/rocksdb/tools/advisor/test/__init__.py +0 -0
  1534. package/vendor/rocksdb/tools/advisor/test/input_files/LOG-0 +30 -0
  1535. package/vendor/rocksdb/tools/advisor/test/input_files/LOG-1 +25 -0
  1536. package/vendor/rocksdb/tools/advisor/test/input_files/OPTIONS-000005 +49 -0
  1537. package/vendor/rocksdb/tools/advisor/test/input_files/log_stats_parser_keys_ts +3 -0
  1538. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err1.ini +56 -0
  1539. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err2.ini +15 -0
  1540. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err3.ini +15 -0
  1541. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err4.ini +15 -0
  1542. package/vendor/rocksdb/tools/advisor/test/input_files/test_rules.ini +47 -0
  1543. package/vendor/rocksdb/tools/advisor/test/input_files/triggered_rules.ini +83 -0
  1544. package/vendor/rocksdb/tools/advisor/test/test_db_bench_runner.py +141 -0
  1545. package/vendor/rocksdb/tools/advisor/test/test_db_log_parser.py +96 -0
  1546. package/vendor/rocksdb/tools/advisor/test/test_db_options_parser.py +214 -0
  1547. package/vendor/rocksdb/tools/advisor/test/test_db_stats_fetcher.py +121 -0
  1548. package/vendor/rocksdb/tools/advisor/test/test_rule_parser.py +226 -0
  1549. package/vendor/rocksdb/tools/analyze_txn_stress_test.sh +77 -0
  1550. package/vendor/rocksdb/tools/auto_sanity_test.sh +93 -0
  1551. package/vendor/rocksdb/tools/backup_db.sh +15 -0
  1552. package/vendor/rocksdb/tools/benchmark.sh +1173 -0
  1553. package/vendor/rocksdb/tools/benchmark_ci.py +182 -0
  1554. package/vendor/rocksdb/tools/benchmark_compare.sh +342 -0
  1555. package/vendor/rocksdb/tools/benchmark_leveldb.sh +187 -0
  1556. package/vendor/rocksdb/tools/blob_dump.cc +103 -0
  1557. package/vendor/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  1558. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  1559. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  1560. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  1561. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2314 -0
  1562. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +397 -0
  1563. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +729 -0
  1564. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +791 -0
  1565. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +17 -0
  1566. package/vendor/rocksdb/tools/check_all_python.py +22 -0
  1567. package/vendor/rocksdb/tools/check_format_compatible.sh +379 -0
  1568. package/vendor/rocksdb/tools/db_bench.cc +21 -0
  1569. package/vendor/rocksdb/tools/db_bench_tool.cc +8604 -0
  1570. package/vendor/rocksdb/tools/db_bench_tool_test.cc +342 -0
  1571. package/vendor/rocksdb/tools/db_crashtest.py +1018 -0
  1572. package/vendor/rocksdb/tools/db_repl_stress.cc +132 -0
  1573. package/vendor/rocksdb/tools/db_sanity_test.cc +296 -0
  1574. package/vendor/rocksdb/tools/dbench_monitor +102 -0
  1575. package/vendor/rocksdb/tools/dump/db_dump_tool.cc +258 -0
  1576. package/vendor/rocksdb/tools/dump/rocksdb_dump.cc +60 -0
  1577. package/vendor/rocksdb/tools/dump/rocksdb_undump.cc +59 -0
  1578. package/vendor/rocksdb/tools/generate_random_db.sh +31 -0
  1579. package/vendor/rocksdb/tools/ingest_external_sst.sh +18 -0
  1580. package/vendor/rocksdb/tools/io_tracer_parser.cc +17 -0
  1581. package/vendor/rocksdb/tools/io_tracer_parser_test.cc +182 -0
  1582. package/vendor/rocksdb/tools/io_tracer_parser_tool.cc +142 -0
  1583. package/vendor/rocksdb/tools/io_tracer_parser_tool.h +38 -0
  1584. package/vendor/rocksdb/tools/ldb.cc +13 -0
  1585. package/vendor/rocksdb/tools/ldb_cmd.cc +4263 -0
  1586. package/vendor/rocksdb/tools/ldb_cmd_impl.h +744 -0
  1587. package/vendor/rocksdb/tools/ldb_cmd_test.cc +1216 -0
  1588. package/vendor/rocksdb/tools/ldb_test.py +955 -0
  1589. package/vendor/rocksdb/tools/ldb_tool.cc +182 -0
  1590. package/vendor/rocksdb/tools/pflag +217 -0
  1591. package/vendor/rocksdb/tools/reduce_levels_test.cc +212 -0
  1592. package/vendor/rocksdb/tools/regression_test.sh +525 -0
  1593. package/vendor/rocksdb/tools/restore_db.sh +15 -0
  1594. package/vendor/rocksdb/tools/rocksdb_dump_test.sh +9 -0
  1595. package/vendor/rocksdb/tools/run_blob_bench.sh +223 -0
  1596. package/vendor/rocksdb/tools/run_flash_bench.sh +359 -0
  1597. package/vendor/rocksdb/tools/run_leveldb.sh +175 -0
  1598. package/vendor/rocksdb/tools/sample-dump.dmp +0 -0
  1599. package/vendor/rocksdb/tools/simulated_hybrid_file_system.cc +243 -0
  1600. package/vendor/rocksdb/tools/simulated_hybrid_file_system.h +124 -0
  1601. package/vendor/rocksdb/tools/sst_dump.cc +12 -0
  1602. package/vendor/rocksdb/tools/sst_dump_test.cc +471 -0
  1603. package/vendor/rocksdb/tools/sst_dump_tool.cc +582 -0
  1604. package/vendor/rocksdb/tools/trace_analyzer.cc +17 -0
  1605. package/vendor/rocksdb/tools/trace_analyzer_test.cc +880 -0
  1606. package/vendor/rocksdb/tools/trace_analyzer_tool.cc +1929 -0
  1607. package/vendor/rocksdb/tools/trace_analyzer_tool.h +329 -0
  1608. package/vendor/rocksdb/tools/verify_random_db.sh +41 -0
  1609. package/vendor/rocksdb/tools/write_external_sst.sh +26 -0
  1610. package/vendor/rocksdb/tools/write_stress.cc +305 -0
  1611. package/vendor/rocksdb/tools/write_stress_runner.py +83 -0
  1612. package/vendor/rocksdb/trace_replay/block_cache_tracer.cc +509 -0
  1613. package/vendor/rocksdb/trace_replay/block_cache_tracer.h +239 -0
  1614. package/vendor/rocksdb/trace_replay/block_cache_tracer_test.cc +421 -0
  1615. package/vendor/rocksdb/trace_replay/io_tracer.cc +303 -0
  1616. package/vendor/rocksdb/trace_replay/io_tracer.h +185 -0
  1617. package/vendor/rocksdb/trace_replay/io_tracer_test.cc +353 -0
  1618. package/vendor/rocksdb/trace_replay/trace_record.cc +206 -0
  1619. package/vendor/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  1620. package/vendor/rocksdb/trace_replay/trace_record_handler.h +46 -0
  1621. package/vendor/rocksdb/trace_replay/trace_record_result.cc +146 -0
  1622. package/vendor/rocksdb/trace_replay/trace_replay.cc +622 -0
  1623. package/vendor/rocksdb/trace_replay/trace_replay.h +183 -0
  1624. package/vendor/rocksdb/util/aligned_buffer.h +235 -0
  1625. package/vendor/rocksdb/util/async_file_reader.cc +81 -0
  1626. package/vendor/rocksdb/util/async_file_reader.h +144 -0
  1627. package/vendor/rocksdb/util/autovector.h +393 -0
  1628. package/vendor/rocksdb/util/autovector_test.cc +324 -0
  1629. package/vendor/rocksdb/util/bloom_impl.h +489 -0
  1630. package/vendor/rocksdb/util/bloom_test.cc +1175 -0
  1631. package/vendor/rocksdb/util/build_version.cc.in +79 -0
  1632. package/vendor/rocksdb/util/cast_util.h +42 -0
  1633. package/vendor/rocksdb/util/channel.h +69 -0
  1634. package/vendor/rocksdb/util/cleanable.cc +181 -0
  1635. package/vendor/rocksdb/util/coding.cc +90 -0
  1636. package/vendor/rocksdb/util/coding.h +389 -0
  1637. package/vendor/rocksdb/util/coding_lean.h +101 -0
  1638. package/vendor/rocksdb/util/coding_test.cc +217 -0
  1639. package/vendor/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  1640. package/vendor/rocksdb/util/comparator.cc +383 -0
  1641. package/vendor/rocksdb/util/compression.cc +122 -0
  1642. package/vendor/rocksdb/util/compression.h +1795 -0
  1643. package/vendor/rocksdb/util/compression_context_cache.cc +106 -0
  1644. package/vendor/rocksdb/util/compression_context_cache.h +47 -0
  1645. package/vendor/rocksdb/util/concurrent_task_limiter_impl.cc +64 -0
  1646. package/vendor/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  1647. package/vendor/rocksdb/util/core_local.h +84 -0
  1648. package/vendor/rocksdb/util/coro_utils.h +112 -0
  1649. package/vendor/rocksdb/util/crc32c.cc +1292 -0
  1650. package/vendor/rocksdb/util/crc32c.h +56 -0
  1651. package/vendor/rocksdb/util/crc32c_arm64.cc +213 -0
  1652. package/vendor/rocksdb/util/crc32c_arm64.h +52 -0
  1653. package/vendor/rocksdb/util/crc32c_ppc.c +94 -0
  1654. package/vendor/rocksdb/util/crc32c_ppc.h +22 -0
  1655. package/vendor/rocksdb/util/crc32c_ppc_asm.S +756 -0
  1656. package/vendor/rocksdb/util/crc32c_ppc_constants.h +900 -0
  1657. package/vendor/rocksdb/util/crc32c_test.cc +213 -0
  1658. package/vendor/rocksdb/util/data_structure.cc +18 -0
  1659. package/vendor/rocksdb/util/defer.h +82 -0
  1660. package/vendor/rocksdb/util/defer_test.cc +51 -0
  1661. package/vendor/rocksdb/util/distributed_mutex.h +50 -0
  1662. package/vendor/rocksdb/util/duplicate_detector.h +69 -0
  1663. package/vendor/rocksdb/util/dynamic_bloom.cc +70 -0
  1664. package/vendor/rocksdb/util/dynamic_bloom.h +214 -0
  1665. package/vendor/rocksdb/util/dynamic_bloom_test.cc +325 -0
  1666. package/vendor/rocksdb/util/fastrange.h +114 -0
  1667. package/vendor/rocksdb/util/file_checksum_helper.cc +170 -0
  1668. package/vendor/rocksdb/util/file_checksum_helper.h +101 -0
  1669. package/vendor/rocksdb/util/file_reader_writer_test.cc +1058 -0
  1670. package/vendor/rocksdb/util/filelock_test.cc +148 -0
  1671. package/vendor/rocksdb/util/filter_bench.cc +840 -0
  1672. package/vendor/rocksdb/util/gflags_compat.h +29 -0
  1673. package/vendor/rocksdb/util/hash.cc +201 -0
  1674. package/vendor/rocksdb/util/hash.h +137 -0
  1675. package/vendor/rocksdb/util/hash128.h +26 -0
  1676. package/vendor/rocksdb/util/hash_containers.h +51 -0
  1677. package/vendor/rocksdb/util/hash_map.h +67 -0
  1678. package/vendor/rocksdb/util/hash_test.cc +853 -0
  1679. package/vendor/rocksdb/util/heap.h +174 -0
  1680. package/vendor/rocksdb/util/heap_test.cc +131 -0
  1681. package/vendor/rocksdb/util/kv_map.h +33 -0
  1682. package/vendor/rocksdb/util/log_write_bench.cc +88 -0
  1683. package/vendor/rocksdb/util/math.h +299 -0
  1684. package/vendor/rocksdb/util/math128.h +316 -0
  1685. package/vendor/rocksdb/util/murmurhash.cc +196 -0
  1686. package/vendor/rocksdb/util/murmurhash.h +43 -0
  1687. package/vendor/rocksdb/util/mutexlock.h +181 -0
  1688. package/vendor/rocksdb/util/ppc-opcode.h +27 -0
  1689. package/vendor/rocksdb/util/random.cc +63 -0
  1690. package/vendor/rocksdb/util/random.h +190 -0
  1691. package/vendor/rocksdb/util/random_test.cc +107 -0
  1692. package/vendor/rocksdb/util/rate_limiter.cc +376 -0
  1693. package/vendor/rocksdb/util/rate_limiter_impl.h +146 -0
  1694. package/vendor/rocksdb/util/rate_limiter_test.cc +520 -0
  1695. package/vendor/rocksdb/util/repeatable_thread.h +149 -0
  1696. package/vendor/rocksdb/util/repeatable_thread_test.cc +111 -0
  1697. package/vendor/rocksdb/util/ribbon_alg.h +1225 -0
  1698. package/vendor/rocksdb/util/ribbon_config.cc +506 -0
  1699. package/vendor/rocksdb/util/ribbon_config.h +182 -0
  1700. package/vendor/rocksdb/util/ribbon_impl.h +1137 -0
  1701. package/vendor/rocksdb/util/ribbon_test.cc +1308 -0
  1702. package/vendor/rocksdb/util/set_comparator.h +24 -0
  1703. package/vendor/rocksdb/util/single_thread_executor.h +56 -0
  1704. package/vendor/rocksdb/util/slice.cc +367 -0
  1705. package/vendor/rocksdb/util/slice_test.cc +252 -0
  1706. package/vendor/rocksdb/util/slice_transform_test.cc +159 -0
  1707. package/vendor/rocksdb/util/status.cc +162 -0
  1708. package/vendor/rocksdb/util/stderr_logger.cc +30 -0
  1709. package/vendor/rocksdb/util/stderr_logger.h +31 -0
  1710. package/vendor/rocksdb/util/stop_watch.h +136 -0
  1711. package/vendor/rocksdb/util/string_util.cc +502 -0
  1712. package/vendor/rocksdb/util/string_util.h +175 -0
  1713. package/vendor/rocksdb/util/thread_guard.h +41 -0
  1714. package/vendor/rocksdb/util/thread_list_test.cc +362 -0
  1715. package/vendor/rocksdb/util/thread_local.cc +521 -0
  1716. package/vendor/rocksdb/util/thread_local.h +100 -0
  1717. package/vendor/rocksdb/util/thread_local_test.cc +578 -0
  1718. package/vendor/rocksdb/util/thread_operation.h +113 -0
  1719. package/vendor/rocksdb/util/threadpool_imp.cc +551 -0
  1720. package/vendor/rocksdb/util/threadpool_imp.h +120 -0
  1721. package/vendor/rocksdb/util/timer.h +340 -0
  1722. package/vendor/rocksdb/util/timer_queue.h +231 -0
  1723. package/vendor/rocksdb/util/timer_queue_test.cc +73 -0
  1724. package/vendor/rocksdb/util/timer_test.cc +402 -0
  1725. package/vendor/rocksdb/util/udt_util.h +77 -0
  1726. package/vendor/rocksdb/util/user_comparator_wrapper.h +64 -0
  1727. package/vendor/rocksdb/util/vector_iterator.h +118 -0
  1728. package/vendor/rocksdb/util/work_queue.h +150 -0
  1729. package/vendor/rocksdb/util/work_queue_test.cc +272 -0
  1730. package/vendor/rocksdb/util/xxhash.cc +48 -0
  1731. package/vendor/rocksdb/util/xxhash.h +6360 -0
  1732. package/vendor/rocksdb/util/xxph3.h +1764 -0
  1733. package/vendor/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  1734. package/vendor/rocksdb/utilities/agg_merge/agg_merge_impl.h +49 -0
  1735. package/vendor/rocksdb/utilities/agg_merge/agg_merge_test.cc +135 -0
  1736. package/vendor/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  1737. package/vendor/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  1738. package/vendor/rocksdb/utilities/backup/backup_engine.cc +3355 -0
  1739. package/vendor/rocksdb/utilities/backup/backup_engine_impl.h +34 -0
  1740. package/vendor/rocksdb/utilities/backup/backup_engine_test.cc +4414 -0
  1741. package/vendor/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  1742. package/vendor/rocksdb/utilities/blob_db/blob_compaction_filter.h +202 -0
  1743. package/vendor/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  1744. package/vendor/rocksdb/utilities/blob_db/blob_db.h +264 -0
  1745. package/vendor/rocksdb/utilities/blob_db/blob_db_gc_stats.h +54 -0
  1746. package/vendor/rocksdb/utilities/blob_db/blob_db_impl.cc +2185 -0
  1747. package/vendor/rocksdb/utilities/blob_db/blob_db_impl.h +501 -0
  1748. package/vendor/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +111 -0
  1749. package/vendor/rocksdb/utilities/blob_db/blob_db_iterator.h +148 -0
  1750. package/vendor/rocksdb/utilities/blob_db/blob_db_listener.h +69 -0
  1751. package/vendor/rocksdb/utilities/blob_db/blob_db_test.cc +2430 -0
  1752. package/vendor/rocksdb/utilities/blob_db/blob_dump_tool.cc +280 -0
  1753. package/vendor/rocksdb/utilities/blob_db/blob_dump_tool.h +56 -0
  1754. package/vendor/rocksdb/utilities/blob_db/blob_file.cc +316 -0
  1755. package/vendor/rocksdb/utilities/blob_db/blob_file.h +244 -0
  1756. package/vendor/rocksdb/utilities/cache_dump_load.cc +67 -0
  1757. package/vendor/rocksdb/utilities/cache_dump_load_impl.cc +369 -0
  1758. package/vendor/rocksdb/utilities/cache_dump_load_impl.h +356 -0
  1759. package/vendor/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +106 -0
  1760. package/vendor/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +57 -0
  1761. package/vendor/rocksdb/utilities/cassandra/cassandra_format_test.cc +377 -0
  1762. package/vendor/rocksdb/utilities/cassandra/cassandra_functional_test.cc +444 -0
  1763. package/vendor/rocksdb/utilities/cassandra/cassandra_options.h +41 -0
  1764. package/vendor/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +98 -0
  1765. package/vendor/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +164 -0
  1766. package/vendor/rocksdb/utilities/cassandra/format.cc +367 -0
  1767. package/vendor/rocksdb/utilities/cassandra/format.h +183 -0
  1768. package/vendor/rocksdb/utilities/cassandra/merge_operator.cc +80 -0
  1769. package/vendor/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  1770. package/vendor/rocksdb/utilities/cassandra/serialize.h +81 -0
  1771. package/vendor/rocksdb/utilities/cassandra/test_utils.cc +69 -0
  1772. package/vendor/rocksdb/utilities/cassandra/test_utils.h +42 -0
  1773. package/vendor/rocksdb/utilities/checkpoint/checkpoint_impl.cc +470 -0
  1774. package/vendor/rocksdb/utilities/checkpoint/checkpoint_impl.h +64 -0
  1775. package/vendor/rocksdb/utilities/checkpoint/checkpoint_test.cc +988 -0
  1776. package/vendor/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +41 -0
  1777. package/vendor/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +24 -0
  1778. package/vendor/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +26 -0
  1779. package/vendor/rocksdb/utilities/compaction_filters.cc +52 -0
  1780. package/vendor/rocksdb/utilities/convenience/info_log_finder.cc +26 -0
  1781. package/vendor/rocksdb/utilities/counted_fs.cc +379 -0
  1782. package/vendor/rocksdb/utilities/counted_fs.h +158 -0
  1783. package/vendor/rocksdb/utilities/debug.cc +118 -0
  1784. package/vendor/rocksdb/utilities/env_mirror.cc +273 -0
  1785. package/vendor/rocksdb/utilities/env_mirror_test.cc +216 -0
  1786. package/vendor/rocksdb/utilities/env_timed.cc +181 -0
  1787. package/vendor/rocksdb/utilities/env_timed.h +95 -0
  1788. package/vendor/rocksdb/utilities/env_timed_test.cc +34 -0
  1789. package/vendor/rocksdb/utilities/fault_injection_env.cc +555 -0
  1790. package/vendor/rocksdb/utilities/fault_injection_env.h +258 -0
  1791. package/vendor/rocksdb/utilities/fault_injection_fs.cc +1071 -0
  1792. package/vendor/rocksdb/utilities/fault_injection_fs.h +593 -0
  1793. package/vendor/rocksdb/utilities/fault_injection_secondary_cache.cc +136 -0
  1794. package/vendor/rocksdb/utilities/fault_injection_secondary_cache.h +109 -0
  1795. package/vendor/rocksdb/utilities/leveldb_options/leveldb_options.cc +57 -0
  1796. package/vendor/rocksdb/utilities/memory/memory_test.cc +269 -0
  1797. package/vendor/rocksdb/utilities/memory/memory_util.cc +50 -0
  1798. package/vendor/rocksdb/utilities/memory_allocators.h +103 -0
  1799. package/vendor/rocksdb/utilities/merge_operators/bytesxor.cc +57 -0
  1800. package/vendor/rocksdb/utilities/merge_operators/bytesxor.h +40 -0
  1801. package/vendor/rocksdb/utilities/merge_operators/max.cc +64 -0
  1802. package/vendor/rocksdb/utilities/merge_operators/max_operator.h +35 -0
  1803. package/vendor/rocksdb/utilities/merge_operators/put.cc +74 -0
  1804. package/vendor/rocksdb/utilities/merge_operators/put_operator.h +56 -0
  1805. package/vendor/rocksdb/utilities/merge_operators/sortlist.cc +95 -0
  1806. package/vendor/rocksdb/utilities/merge_operators/sortlist.h +42 -0
  1807. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend.cc +76 -0
  1808. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend.h +32 -0
  1809. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +130 -0
  1810. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend2.h +52 -0
  1811. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +636 -0
  1812. package/vendor/rocksdb/utilities/merge_operators/uint64add.cc +56 -0
  1813. package/vendor/rocksdb/utilities/merge_operators/uint64add.h +35 -0
  1814. package/vendor/rocksdb/utilities/merge_operators.cc +115 -0
  1815. package/vendor/rocksdb/utilities/merge_operators.h +36 -0
  1816. package/vendor/rocksdb/utilities/object_registry.cc +381 -0
  1817. package/vendor/rocksdb/utilities/object_registry_test.cc +862 -0
  1818. package/vendor/rocksdb/utilities/option_change_migration/option_change_migration.cc +176 -0
  1819. package/vendor/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +548 -0
  1820. package/vendor/rocksdb/utilities/options/options_util.cc +117 -0
  1821. package/vendor/rocksdb/utilities/options/options_util_test.cc +782 -0
  1822. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier.cc +420 -0
  1823. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier.h +154 -0
  1824. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +608 -0
  1825. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +291 -0
  1826. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  1827. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +84 -0
  1828. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +122 -0
  1829. package/vendor/rocksdb/utilities/persistent_cache/hash_table.h +237 -0
  1830. package/vendor/rocksdb/utilities/persistent_cache/hash_table_bench.cc +310 -0
  1831. package/vendor/rocksdb/utilities/persistent_cache/hash_table_evictable.h +166 -0
  1832. package/vendor/rocksdb/utilities/persistent_cache/hash_table_test.cc +161 -0
  1833. package/vendor/rocksdb/utilities/persistent_cache/lrulist.h +172 -0
  1834. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +355 -0
  1835. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +413 -0
  1836. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_test.h +284 -0
  1837. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +165 -0
  1838. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +340 -0
  1839. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  1840. package/vendor/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +138 -0
  1841. package/vendor/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +139 -0
  1842. package/vendor/rocksdb/utilities/simulator_cache/cache_simulator.cc +287 -0
  1843. package/vendor/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  1844. package/vendor/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +497 -0
  1845. package/vendor/rocksdb/utilities/simulator_cache/sim_cache.cc +372 -0
  1846. package/vendor/rocksdb/utilities/simulator_cache/sim_cache_test.cc +226 -0
  1847. package/vendor/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +221 -0
  1848. package/vendor/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +68 -0
  1849. package/vendor/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +238 -0
  1850. package/vendor/rocksdb/utilities/trace/file_trace_reader_writer.cc +133 -0
  1851. package/vendor/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  1852. package/vendor/rocksdb/utilities/trace/replayer_impl.cc +314 -0
  1853. package/vendor/rocksdb/utilities/trace/replayer_impl.h +84 -0
  1854. package/vendor/rocksdb/utilities/transactions/lock/lock_manager.cc +27 -0
  1855. package/vendor/rocksdb/utilities/transactions/lock/lock_manager.h +80 -0
  1856. package/vendor/rocksdb/utilities/transactions/lock/lock_tracker.h +207 -0
  1857. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +719 -0
  1858. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +222 -0
  1859. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +170 -0
  1860. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +324 -0
  1861. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +255 -0
  1862. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +97 -0
  1863. package/vendor/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +34 -0
  1864. package/vendor/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +448 -0
  1865. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  1866. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  1867. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  1868. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  1869. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  1870. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  1871. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  1872. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +137 -0
  1873. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  1874. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +220 -0
  1875. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  1876. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  1877. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +255 -0
  1878. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1021 -0
  1879. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +580 -0
  1880. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +525 -0
  1881. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +263 -0
  1882. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  1883. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +518 -0
  1884. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  1885. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +118 -0
  1886. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  1887. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +211 -0
  1888. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  1889. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  1890. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  1891. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  1892. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +83 -0
  1893. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  1894. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  1895. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  1896. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  1897. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +197 -0
  1898. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  1899. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +130 -0
  1900. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +151 -0
  1901. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1902. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1903. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +199 -0
  1904. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1905. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1906. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1907. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1908. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1909. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +501 -0
  1910. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +135 -0
  1911. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +154 -0
  1912. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1913. package/vendor/rocksdb/utilities/transactions/optimistic_transaction.cc +194 -0
  1914. package/vendor/rocksdb/utilities/transactions/optimistic_transaction.h +99 -0
  1915. package/vendor/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +109 -0
  1916. package/vendor/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +86 -0
  1917. package/vendor/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1479 -0
  1918. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction.cc +1177 -0
  1919. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction.h +311 -0
  1920. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +780 -0
  1921. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction_db.h +316 -0
  1922. package/vendor/rocksdb/utilities/transactions/snapshot_checker.cc +37 -0
  1923. package/vendor/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +457 -0
  1924. package/vendor/rocksdb/utilities/transactions/transaction_base.cc +757 -0
  1925. package/vendor/rocksdb/utilities/transactions/transaction_base.h +382 -0
  1926. package/vendor/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +133 -0
  1927. package/vendor/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +24 -0
  1928. package/vendor/rocksdb/utilities/transactions/transaction_test.cc +6751 -0
  1929. package/vendor/rocksdb/utilities/transactions/transaction_test.h +578 -0
  1930. package/vendor/rocksdb/utilities/transactions/transaction_util.cc +204 -0
  1931. package/vendor/rocksdb/utilities/transactions/transaction_util.h +83 -0
  1932. package/vendor/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +578 -0
  1933. package/vendor/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +4066 -0
  1934. package/vendor/rocksdb/utilities/transactions/write_prepared_txn.cc +515 -0
  1935. package/vendor/rocksdb/utilities/transactions/write_prepared_txn.h +117 -0
  1936. package/vendor/rocksdb/utilities/transactions/write_prepared_txn_db.cc +1038 -0
  1937. package/vendor/rocksdb/utilities/transactions/write_prepared_txn_db.h +1123 -0
  1938. package/vendor/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +779 -0
  1939. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn.cc +1056 -0
  1940. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn.h +339 -0
  1941. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +476 -0
  1942. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn_db.h +106 -0
  1943. package/vendor/rocksdb/utilities/ttl/db_ttl_impl.cc +617 -0
  1944. package/vendor/rocksdb/utilities/ttl/db_ttl_impl.h +243 -0
  1945. package/vendor/rocksdb/utilities/ttl/ttl_test.cc +913 -0
  1946. package/vendor/rocksdb/utilities/util_merge_operators_test.cc +100 -0
  1947. package/vendor/rocksdb/utilities/wal_filter.cc +22 -0
  1948. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +694 -0
  1949. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +742 -0
  1950. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +342 -0
  1951. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2409 -0
@@ -0,0 +1,3513 @@
1
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+ //
6
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
+ // Use of this source code is governed by a BSD-style license that can be
8
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
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"
17
+ #include "db/db_test_util.h"
18
+ #include "options/options_helper.h"
19
+ #include "port/stack_trace.h"
20
+ #include "rocksdb/advanced_options.h"
21
+ #include "rocksdb/convenience.h"
22
+ #include "rocksdb/filter_policy.h"
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"
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"
31
+
32
+ namespace ROCKSDB_NAMESPACE {
33
+
34
+ namespace {
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 kFastLocalBloom =
41
+ test::FastLocalBloomFilterPolicy::kClassName();
42
+ const std::string kStandard128Ribbon =
43
+ test::Standard128RibbonFilterPolicy::kClassName();
44
+ const std::string kAutoBloom = BloomFilterPolicy::kClassName();
45
+ const std::string kAutoRibbon = RibbonFilterPolicy::kClassName();
46
+
47
+ template <typename T>
48
+ T Pop(T& var) {
49
+ auto rv = var;
50
+ var = 0;
51
+ return rv;
52
+ }
53
+ PerfContextByLevel& GetLevelPerfContext(uint32_t level) {
54
+ return (*(get_perf_context()->level_to_perf_context))[level];
55
+ }
56
+ } // anonymous namespace
57
+
58
+ // DB tests related to bloom filter.
59
+
60
+ class DBBloomFilterTest : public DBTestBase {
61
+ public:
62
+ DBBloomFilterTest()
63
+ : DBTestBase("db_bloom_filter_test", /*env_do_fsync=*/true) {}
64
+ };
65
+
66
+ class DBBloomFilterTestWithParam
67
+ : public DBTestBase,
68
+ public testing::WithParamInterface<
69
+ std::tuple<std::string, bool, uint32_t>> {
70
+ // public testing::WithParamInterface<bool> {
71
+ protected:
72
+ std::string bfp_impl_;
73
+ bool partition_filters_;
74
+ uint32_t format_version_;
75
+
76
+ public:
77
+ DBBloomFilterTestWithParam()
78
+ : DBTestBase("db_bloom_filter_tests", /*env_do_fsync=*/true) {}
79
+
80
+ ~DBBloomFilterTestWithParam() override {}
81
+
82
+ void SetUp() override {
83
+ bfp_impl_ = std::get<0>(GetParam());
84
+ partition_filters_ = std::get<1>(GetParam());
85
+ format_version_ = std::get<2>(GetParam());
86
+ }
87
+ };
88
+
89
+ class DBBloomFilterTestDefFormatVersion : public DBBloomFilterTestWithParam {};
90
+
91
+ class SliceTransformLimitedDomainGeneric : public SliceTransform {
92
+ const char* Name() const override {
93
+ return "SliceTransformLimitedDomainGeneric";
94
+ }
95
+
96
+ Slice Transform(const Slice& src) const override {
97
+ return Slice(src.data(), 5);
98
+ }
99
+
100
+ bool InDomain(const Slice& src) const override {
101
+ // prefix will be x????
102
+ return src.size() >= 5;
103
+ }
104
+
105
+ bool InRange(const Slice& dst) const override {
106
+ // prefix will be x????
107
+ return dst.size() == 5;
108
+ }
109
+ };
110
+
111
+ // KeyMayExist can lead to a few false positives, but not false negatives.
112
+ // To make test deterministic, use a much larger number of bits per key-20 than
113
+ // bits in the key, so that false positives are eliminated
114
+ TEST_P(DBBloomFilterTestDefFormatVersion, KeyMayExist) {
115
+ do {
116
+ ReadOptions ropts;
117
+ std::string value;
118
+ anon::OptionsOverride options_override;
119
+ options_override.filter_policy = Create(20, bfp_impl_);
120
+ options_override.partition_filters = partition_filters_;
121
+ options_override.metadata_block_size = 32;
122
+ options_override.full_block_cache = true;
123
+ Options options = CurrentOptions(options_override);
124
+ if (partition_filters_) {
125
+ auto* table_options =
126
+ options.table_factory->GetOptions<BlockBasedTableOptions>();
127
+ if (table_options != nullptr &&
128
+ table_options->index_type !=
129
+ BlockBasedTableOptions::kTwoLevelIndexSearch) {
130
+ // In the current implementation partitioned filters depend on
131
+ // partitioned indexes
132
+ continue;
133
+ }
134
+ }
135
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
136
+ CreateAndReopenWithCF({"pikachu"}, options);
137
+
138
+ ASSERT_TRUE(!db_->KeyMayExist(ropts, handles_[1], "a", &value));
139
+
140
+ ASSERT_OK(Put(1, "a", "b"));
141
+ bool value_found = false;
142
+ ASSERT_TRUE(
143
+ db_->KeyMayExist(ropts, handles_[1], "a", &value, &value_found));
144
+ ASSERT_TRUE(value_found);
145
+ ASSERT_EQ("b", value);
146
+
147
+ ASSERT_OK(Flush(1));
148
+ value.clear();
149
+
150
+ uint64_t numopen = TestGetTickerCount(options, NO_FILE_OPENS);
151
+ uint64_t cache_added = TestGetTickerCount(options, BLOCK_CACHE_ADD);
152
+ ASSERT_TRUE(
153
+ db_->KeyMayExist(ropts, handles_[1], "a", &value, &value_found));
154
+ ASSERT_TRUE(!value_found);
155
+ // assert that no new files were opened and no new blocks were
156
+ // read into block cache.
157
+ ASSERT_EQ(numopen, TestGetTickerCount(options, NO_FILE_OPENS));
158
+ ASSERT_EQ(cache_added, TestGetTickerCount(options, BLOCK_CACHE_ADD));
159
+
160
+ ASSERT_OK(Delete(1, "a"));
161
+
162
+ numopen = TestGetTickerCount(options, NO_FILE_OPENS);
163
+ cache_added = TestGetTickerCount(options, BLOCK_CACHE_ADD);
164
+ ASSERT_TRUE(!db_->KeyMayExist(ropts, handles_[1], "a", &value));
165
+ ASSERT_EQ(numopen, TestGetTickerCount(options, NO_FILE_OPENS));
166
+ ASSERT_EQ(cache_added, TestGetTickerCount(options, BLOCK_CACHE_ADD));
167
+
168
+ ASSERT_OK(Flush(1));
169
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr, handles_[1],
170
+ true /* disallow trivial move */));
171
+
172
+ numopen = TestGetTickerCount(options, NO_FILE_OPENS);
173
+ cache_added = TestGetTickerCount(options, BLOCK_CACHE_ADD);
174
+ ASSERT_TRUE(!db_->KeyMayExist(ropts, handles_[1], "a", &value));
175
+ ASSERT_EQ(numopen, TestGetTickerCount(options, NO_FILE_OPENS));
176
+ ASSERT_EQ(cache_added, TestGetTickerCount(options, BLOCK_CACHE_ADD));
177
+
178
+ ASSERT_OK(Delete(1, "c"));
179
+
180
+ numopen = TestGetTickerCount(options, NO_FILE_OPENS);
181
+ cache_added = TestGetTickerCount(options, BLOCK_CACHE_ADD);
182
+ ASSERT_TRUE(!db_->KeyMayExist(ropts, handles_[1], "c", &value));
183
+ ASSERT_EQ(numopen, TestGetTickerCount(options, NO_FILE_OPENS));
184
+ ASSERT_EQ(cache_added, TestGetTickerCount(options, BLOCK_CACHE_ADD));
185
+
186
+ // KeyMayExist function only checks data in block caches, which is not used
187
+ // by plain table format.
188
+ } while (
189
+ ChangeOptions(kSkipPlainTable | kSkipHashIndex | kSkipFIFOCompaction));
190
+ }
191
+
192
+ TEST_F(DBBloomFilterTest, GetFilterByPrefixBloomCustomPrefixExtractor) {
193
+ for (bool partition_filters : {true, false}) {
194
+ Options options = last_options_;
195
+ options.prefix_extractor =
196
+ std::make_shared<SliceTransformLimitedDomainGeneric>();
197
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
198
+ get_perf_context()->EnablePerLevelPerfContext();
199
+ BlockBasedTableOptions bbto;
200
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10));
201
+ if (partition_filters) {
202
+ bbto.partition_filters = true;
203
+ bbto.index_type = BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
204
+ }
205
+ bbto.whole_key_filtering = false;
206
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
207
+ DestroyAndReopen(options);
208
+
209
+ WriteOptions wo;
210
+ ReadOptions ro;
211
+ FlushOptions fo;
212
+ fo.wait = true;
213
+ std::string value;
214
+
215
+ ASSERT_OK(dbfull()->Put(wo, "barbarbar", "foo"));
216
+ ASSERT_OK(dbfull()->Put(wo, "barbarbar2", "foo2"));
217
+ ASSERT_OK(dbfull()->Put(wo, "foofoofoo", "bar"));
218
+
219
+ ASSERT_OK(dbfull()->Flush(fo));
220
+
221
+ ASSERT_EQ("foo", Get("barbarbar"));
222
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
223
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 0);
224
+
225
+ ASSERT_EQ("foo2", Get("barbarbar2"));
226
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
227
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 0);
228
+
229
+ ASSERT_EQ("NOT_FOUND", Get("barbarbar3"));
230
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
231
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 0);
232
+
233
+ ASSERT_EQ("NOT_FOUND", Get("barfoofoo"));
234
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
235
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 1);
236
+
237
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
238
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
239
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 1);
240
+
241
+ ro.total_order_seek = true;
242
+ // NOTE: total_order_seek no longer affects Get()
243
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
244
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
245
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 1);
246
+
247
+ // No bloom on extractor changed
248
+ ASSERT_OK(db_->SetOptions({{"prefix_extractor", "capped:10"}}));
249
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
250
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
251
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 0);
252
+
253
+ // No bloom on extractor changed, after re-open
254
+ options.prefix_extractor.reset(NewCappedPrefixTransform(10));
255
+ Reopen(options);
256
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
257
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
258
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 0);
259
+
260
+ get_perf_context()->Reset();
261
+ }
262
+ }
263
+
264
+ TEST_F(DBBloomFilterTest, GetFilterByPrefixBloom) {
265
+ for (bool partition_filters : {true, false}) {
266
+ Options options = last_options_;
267
+ options.prefix_extractor.reset(NewFixedPrefixTransform(8));
268
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
269
+ get_perf_context()->EnablePerLevelPerfContext();
270
+ BlockBasedTableOptions bbto;
271
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10));
272
+ if (partition_filters) {
273
+ bbto.partition_filters = true;
274
+ bbto.index_type = BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
275
+ }
276
+ bbto.whole_key_filtering = false;
277
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
278
+ DestroyAndReopen(options);
279
+
280
+ WriteOptions wo;
281
+ ReadOptions ro;
282
+ FlushOptions fo;
283
+ fo.wait = true;
284
+ std::string value;
285
+
286
+ ASSERT_OK(dbfull()->Put(wo, "barbarbar", "foo"));
287
+ ASSERT_OK(dbfull()->Put(wo, "barbarbar2", "foo2"));
288
+ ASSERT_OK(dbfull()->Put(wo, "foofoofoo", "bar"));
289
+
290
+ ASSERT_OK(dbfull()->Flush(fo));
291
+
292
+ ASSERT_EQ("foo", Get("barbarbar"));
293
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
294
+ ASSERT_EQ("foo2", Get("barbarbar2"));
295
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
296
+ ASSERT_EQ("NOT_FOUND", Get("barbarbar3"));
297
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
298
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 0);
299
+
300
+ ASSERT_EQ("NOT_FOUND", Get("barfoofoo"));
301
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
302
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 1);
303
+
304
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
305
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
306
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 1);
307
+
308
+ ro.total_order_seek = true;
309
+ // NOTE: total_order_seek no longer affects Get()
310
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
311
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
312
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 1);
313
+
314
+ // No bloom on extractor changed
315
+ ASSERT_OK(db_->SetOptions({{"prefix_extractor", "capped:10"}}));
316
+ ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
317
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
318
+ EXPECT_EQ(Pop(GetLevelPerfContext(0).bloom_filter_useful), 0);
319
+
320
+ get_perf_context()->Reset();
321
+ }
322
+ }
323
+
324
+ TEST_F(DBBloomFilterTest, WholeKeyFilterProp) {
325
+ for (bool partition_filters : {true, false}) {
326
+ Options options = last_options_;
327
+ options.prefix_extractor.reset(NewFixedPrefixTransform(3));
328
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
329
+ get_perf_context()->EnablePerLevelPerfContext();
330
+
331
+ BlockBasedTableOptions bbto;
332
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10));
333
+ bbto.whole_key_filtering = false;
334
+ if (partition_filters) {
335
+ bbto.partition_filters = true;
336
+ bbto.index_type = BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
337
+ }
338
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
339
+ DestroyAndReopen(options);
340
+
341
+ WriteOptions wo;
342
+ ReadOptions ro;
343
+ FlushOptions fo;
344
+ fo.wait = true;
345
+ std::string value;
346
+
347
+ ASSERT_OK(dbfull()->Put(wo, "foobar", "foo"));
348
+ // Needs insert some keys to make sure files are not filtered out by key
349
+ // ranges.
350
+ ASSERT_OK(dbfull()->Put(wo, "aaa", ""));
351
+ ASSERT_OK(dbfull()->Put(wo, "zzz", ""));
352
+ ASSERT_OK(dbfull()->Flush(fo));
353
+
354
+ Reopen(options);
355
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
356
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
357
+ ASSERT_EQ("NOT_FOUND", Get("foo"));
358
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
359
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
360
+ ASSERT_EQ("NOT_FOUND", Get("bar"));
361
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
362
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
363
+ ASSERT_EQ("foo", Get("foobar"));
364
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
365
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
366
+
367
+ // Reopen with whole key filtering enabled and prefix extractor
368
+ // NULL. Bloom filter should be off for both of whole key and
369
+ // prefix bloom.
370
+ bbto.whole_key_filtering = true;
371
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
372
+ options.prefix_extractor.reset();
373
+ Reopen(options);
374
+
375
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
376
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
377
+ ASSERT_EQ("NOT_FOUND", Get("foo"));
378
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
379
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
380
+ ASSERT_EQ("NOT_FOUND", Get("bar"));
381
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
382
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
383
+ ASSERT_EQ("foo", Get("foobar"));
384
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
385
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
386
+ // Write DB with only full key filtering.
387
+ ASSERT_OK(dbfull()->Put(wo, "foobar", "foo"));
388
+ // Needs insert some keys to make sure files are not filtered out by key
389
+ // ranges.
390
+ ASSERT_OK(dbfull()->Put(wo, "aaa", ""));
391
+ ASSERT_OK(dbfull()->Put(wo, "zzz", ""));
392
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
393
+
394
+ // Reopen with both of whole key off and prefix extractor enabled.
395
+ // Still no bloom filter should be used.
396
+ options.prefix_extractor.reset(NewFixedPrefixTransform(3));
397
+ bbto.whole_key_filtering = false;
398
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
399
+ Reopen(options);
400
+
401
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
402
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
403
+ ASSERT_EQ("NOT_FOUND", Get("foo"));
404
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
405
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
406
+ ASSERT_EQ("NOT_FOUND", Get("bar"));
407
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
408
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
409
+ ASSERT_EQ("foo", Get("foobar"));
410
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
411
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
412
+
413
+ // Try to create a DB with mixed files:
414
+ ASSERT_OK(dbfull()->Put(wo, "foobar", "foo"));
415
+ // Needs insert some keys to make sure files are not filtered out by key
416
+ // ranges.
417
+ ASSERT_OK(dbfull()->Put(wo, "aaa", ""));
418
+ ASSERT_OK(dbfull()->Put(wo, "zzz", ""));
419
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
420
+
421
+ options.prefix_extractor.reset();
422
+ bbto.whole_key_filtering = true;
423
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
424
+ Reopen(options);
425
+
426
+ // Try to create a DB with mixed files.
427
+ ASSERT_OK(dbfull()->Put(wo, "barfoo", "bar"));
428
+ // In this case needs insert some keys to make sure files are
429
+ // not filtered out by key ranges.
430
+ ASSERT_OK(dbfull()->Put(wo, "aaa", ""));
431
+ ASSERT_OK(dbfull()->Put(wo, "zzz", ""));
432
+ ASSERT_OK(Flush());
433
+
434
+ // Now we have two files:
435
+ // File 1: An older file with prefix bloom (disabled)
436
+ // File 2: A newer file with whole bloom filter.
437
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
438
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
439
+ ASSERT_EQ("NOT_FOUND", Get("foo"));
440
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
441
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
442
+ ASSERT_EQ("NOT_FOUND", Get("bar"));
443
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
444
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
445
+ ASSERT_EQ("foo", Get("foobar"));
446
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
447
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
448
+ ASSERT_EQ("bar", Get("barfoo"));
449
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
450
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
451
+
452
+ // Reopen with the same setting: only whole key is used
453
+ Reopen(options);
454
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
455
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
456
+ ASSERT_EQ("NOT_FOUND", Get("foo"));
457
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
458
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
459
+ ASSERT_EQ("NOT_FOUND", Get("bar"));
460
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
461
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
462
+ ASSERT_EQ("foo", Get("foobar"));
463
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
464
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
465
+ ASSERT_EQ("bar", Get("barfoo"));
466
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
467
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
468
+
469
+ // Restart with both filters are allowed
470
+ options.prefix_extractor.reset(NewFixedPrefixTransform(3));
471
+ bbto.whole_key_filtering = true;
472
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
473
+ Reopen(options);
474
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
475
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
476
+ // File 1 will has it filtered out.
477
+ // File 2 will not, as prefix `foo` exists in the file.
478
+ ASSERT_EQ("NOT_FOUND", Get("foo"));
479
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
480
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
481
+ ASSERT_EQ("NOT_FOUND", Get("bar"));
482
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
483
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
484
+ ASSERT_EQ("foo", Get("foobar"));
485
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
486
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
487
+ ASSERT_EQ("bar", Get("barfoo"));
488
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
489
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
490
+
491
+ // Restart with only prefix bloom is allowed.
492
+ options.prefix_extractor.reset(NewFixedPrefixTransform(3));
493
+ bbto.whole_key_filtering = false;
494
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
495
+ Reopen(options);
496
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
497
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
498
+ ASSERT_EQ("NOT_FOUND", Get("foo"));
499
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
500
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
501
+ ASSERT_EQ("NOT_FOUND", Get("bar"));
502
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 1);
503
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
504
+ ASSERT_EQ("foo", Get("foobar"));
505
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
506
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
507
+ ASSERT_EQ("bar", Get("barfoo"));
508
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
509
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 0);
510
+ uint64_t bloom_filter_useful_all_levels = 0;
511
+ for (auto& kv : (*(get_perf_context()->level_to_perf_context))) {
512
+ if (kv.second.bloom_filter_useful > 0) {
513
+ bloom_filter_useful_all_levels += kv.second.bloom_filter_useful;
514
+ }
515
+ }
516
+ ASSERT_EQ(12, bloom_filter_useful_all_levels);
517
+ get_perf_context()->Reset();
518
+ }
519
+ }
520
+
521
+ TEST_P(DBBloomFilterTestWithParam, BloomFilter) {
522
+ do {
523
+ Options options = CurrentOptions();
524
+ env_->count_random_reads_ = true;
525
+ options.env = env_;
526
+ // ChangeCompactOptions() only changes compaction style, which does not
527
+ // trigger reset of table_factory
528
+ BlockBasedTableOptions table_options;
529
+ table_options.no_block_cache = true;
530
+ table_options.filter_policy = Create(10, bfp_impl_);
531
+ table_options.partition_filters = partition_filters_;
532
+ if (partition_filters_) {
533
+ table_options.index_type =
534
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
535
+ }
536
+ table_options.format_version = format_version_;
537
+ if (format_version_ >= 4) {
538
+ // value delta encoding challenged more with index interval > 1
539
+ table_options.index_block_restart_interval = 8;
540
+ }
541
+ table_options.metadata_block_size = 32;
542
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
543
+
544
+ CreateAndReopenWithCF({"pikachu"}, options);
545
+
546
+ // Populate multiple layers
547
+ const int N = 10000;
548
+ for (int i = 0; i < N; i++) {
549
+ ASSERT_OK(Put(1, Key(i), Key(i)));
550
+ }
551
+ Compact(1, "a", "z");
552
+ for (int i = 0; i < N; i += 100) {
553
+ ASSERT_OK(Put(1, Key(i), Key(i)));
554
+ }
555
+ ASSERT_OK(Flush(1));
556
+
557
+ // Prevent auto compactions triggered by seeks
558
+ env_->delay_sstable_sync_.store(true, std::memory_order_release);
559
+
560
+ // Lookup present keys. Should rarely read from small sstable.
561
+ env_->random_read_counter_.Reset();
562
+ for (int i = 0; i < N; i++) {
563
+ ASSERT_EQ(Key(i), Get(1, Key(i)));
564
+ }
565
+ int reads = env_->random_read_counter_.Read();
566
+ fprintf(stderr, "%d present => %d reads\n", N, reads);
567
+ ASSERT_GE(reads, N);
568
+ if (partition_filters_) {
569
+ // Without block cache, we read an extra partition filter per each
570
+ // level*read and a partition index per each read
571
+ ASSERT_LE(reads, 4 * N + 2 * N / 100);
572
+ } else {
573
+ ASSERT_LE(reads, N + 2 * N / 100);
574
+ }
575
+
576
+ // Lookup present keys. Should rarely read from either sstable.
577
+ env_->random_read_counter_.Reset();
578
+ for (int i = 0; i < N; i++) {
579
+ ASSERT_EQ("NOT_FOUND", Get(1, Key(i) + ".missing"));
580
+ }
581
+ reads = env_->random_read_counter_.Read();
582
+ fprintf(stderr, "%d missing => %d reads\n", N, reads);
583
+ if (partition_filters_) {
584
+ // With partitioned filter we read one extra filter per level per each
585
+ // missed read.
586
+ ASSERT_LE(reads, 2 * N + 3 * N / 100);
587
+ } else {
588
+ ASSERT_LE(reads, 3 * N / 100);
589
+ }
590
+
591
+ // Sanity check some table properties
592
+ std::map<std::string, std::string> props;
593
+ ASSERT_TRUE(db_->GetMapProperty(
594
+ handles_[1], DB::Properties::kAggregatedTableProperties, &props));
595
+ uint64_t nkeys = N + N / 100;
596
+ uint64_t filter_size = ParseUint64(props["filter_size"]);
597
+ EXPECT_LE(filter_size,
598
+ (partition_filters_ ? 12 : 11) * nkeys / /*bits / byte*/ 8);
599
+ if (bfp_impl_ == kAutoRibbon) {
600
+ // Sometimes using Ribbon filter which is more space-efficient
601
+ EXPECT_GE(filter_size, 7 * nkeys / /*bits / byte*/ 8);
602
+ } else {
603
+ // Always Bloom
604
+ EXPECT_GE(filter_size, 10 * nkeys / /*bits / byte*/ 8);
605
+ }
606
+
607
+ uint64_t num_filter_entries = ParseUint64(props["num_filter_entries"]);
608
+ EXPECT_EQ(num_filter_entries, nkeys);
609
+
610
+ env_->delay_sstable_sync_.store(false, std::memory_order_release);
611
+ Close();
612
+ } while (ChangeCompactOptions());
613
+ }
614
+
615
+ namespace {
616
+
617
+ class AlwaysTrueBitsBuilder : public FilterBitsBuilder {
618
+ public:
619
+ void AddKey(const Slice&) override {}
620
+ size_t EstimateEntriesAdded() override { return 0U; }
621
+ Slice Finish(std::unique_ptr<const char[]>* /* buf */) override {
622
+ // Interpreted as "always true" filter (0 probes over 1 byte of
623
+ // payload, 5 bytes metadata)
624
+ return Slice("\0\0\0\0\0\0", 6);
625
+ }
626
+ using FilterBitsBuilder::Finish;
627
+ size_t ApproximateNumEntries(size_t) override { return SIZE_MAX; }
628
+ };
629
+
630
+ class AlwaysTrueFilterPolicy : public ReadOnlyBuiltinFilterPolicy {
631
+ public:
632
+ explicit AlwaysTrueFilterPolicy(bool skip) : skip_(skip) {}
633
+
634
+ FilterBitsBuilder* GetBuilderWithContext(
635
+ const FilterBuildingContext&) const override {
636
+ if (skip_) {
637
+ return nullptr;
638
+ } else {
639
+ return new AlwaysTrueBitsBuilder();
640
+ }
641
+ }
642
+
643
+ private:
644
+ bool skip_;
645
+ };
646
+
647
+ } // anonymous namespace
648
+
649
+ TEST_P(DBBloomFilterTestWithParam, SkipFilterOnEssentiallyZeroBpk) {
650
+ constexpr int maxKey = 10;
651
+ auto PutFn = [&]() {
652
+ int i;
653
+ // Put
654
+ for (i = 0; i < maxKey; i++) {
655
+ ASSERT_OK(Put(Key(i), Key(i)));
656
+ }
657
+ Flush();
658
+ };
659
+ auto GetFn = [&]() {
660
+ int i;
661
+ // Get OK
662
+ for (i = 0; i < maxKey; i++) {
663
+ ASSERT_EQ(Key(i), Get(Key(i)));
664
+ }
665
+ // Get NotFound
666
+ for (; i < maxKey * 2; i++) {
667
+ ASSERT_EQ(Get(Key(i)), "NOT_FOUND");
668
+ }
669
+ };
670
+ auto PutAndGetFn = [&]() {
671
+ PutFn();
672
+ GetFn();
673
+ };
674
+ std::map<std::string, std::string> props;
675
+ const auto& kAggTableProps = DB::Properties::kAggregatedTableProperties;
676
+
677
+ Options options = CurrentOptions();
678
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
679
+ BlockBasedTableOptions table_options;
680
+ table_options.partition_filters = partition_filters_;
681
+ if (partition_filters_) {
682
+ table_options.index_type =
683
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
684
+ }
685
+ table_options.format_version = format_version_;
686
+
687
+ // Test 1: bits per key < 0.5 means skip filters -> no filter
688
+ // constructed or read.
689
+ table_options.filter_policy = Create(0.4, bfp_impl_);
690
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
691
+ DestroyAndReopen(options);
692
+ PutAndGetFn();
693
+
694
+ // Verify no filter access nor contruction
695
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
696
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
697
+
698
+ props.clear();
699
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
700
+ EXPECT_EQ(props["filter_size"], "0");
701
+
702
+ // Test 2: use custom API to skip filters -> no filter constructed
703
+ // or read.
704
+ table_options.filter_policy.reset(
705
+ new AlwaysTrueFilterPolicy(/* skip */ true));
706
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
707
+ DestroyAndReopen(options);
708
+ PutAndGetFn();
709
+
710
+ // Verify no filter access nor construction
711
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
712
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
713
+
714
+ props.clear();
715
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
716
+ EXPECT_EQ(props["filter_size"], "0");
717
+
718
+ // Control test: using an actual filter with 100% FP rate -> the filter
719
+ // is constructed and checked on read.
720
+ table_options.filter_policy.reset(
721
+ new AlwaysTrueFilterPolicy(/* skip */ false));
722
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
723
+ DestroyAndReopen(options);
724
+ PutAndGetFn();
725
+
726
+ // Verify filter is accessed (and constructed)
727
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_FULL_POSITIVE), maxKey * 2);
728
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), maxKey);
729
+ props.clear();
730
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
731
+ EXPECT_NE(props["filter_size"], "0");
732
+
733
+ // Test 3 (options test): Able to read existing filters with longstanding
734
+ // generated options file entry `filter_policy=rocksdb.BuiltinBloomFilter`
735
+ ASSERT_OK(FilterPolicy::CreateFromString(ConfigOptions(),
736
+ "rocksdb.BuiltinBloomFilter",
737
+ &table_options.filter_policy));
738
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
739
+ Reopen(options);
740
+ GetFn();
741
+
742
+ // Verify filter is accessed
743
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_FULL_POSITIVE), maxKey * 2);
744
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), maxKey);
745
+
746
+ // But new filters are not generated (configuration details unknown)
747
+ DestroyAndReopen(options);
748
+ PutAndGetFn();
749
+
750
+ // Verify no filter access nor construction
751
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
752
+ EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
753
+
754
+ props.clear();
755
+ ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
756
+ EXPECT_EQ(props["filter_size"], "0");
757
+ }
758
+
759
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
760
+ INSTANTIATE_TEST_CASE_P(
761
+ FormatDef, DBBloomFilterTestDefFormatVersion,
762
+ ::testing::Values(
763
+ std::make_tuple(kAutoBloom, true, test::kDefaultFormatVersion),
764
+ std::make_tuple(kAutoBloom, false, test::kDefaultFormatVersion),
765
+ std::make_tuple(kAutoRibbon, false, test::kDefaultFormatVersion)));
766
+
767
+ INSTANTIATE_TEST_CASE_P(
768
+ FormatDef, DBBloomFilterTestWithParam,
769
+ ::testing::Values(
770
+ std::make_tuple(kAutoBloom, true, test::kDefaultFormatVersion),
771
+ std::make_tuple(kAutoBloom, false, test::kDefaultFormatVersion),
772
+ std::make_tuple(kAutoRibbon, false, test::kDefaultFormatVersion)));
773
+
774
+ INSTANTIATE_TEST_CASE_P(
775
+ FormatLatest, DBBloomFilterTestWithParam,
776
+ ::testing::Values(std::make_tuple(kAutoBloom, true, kLatestFormatVersion),
777
+ std::make_tuple(kAutoBloom, false, kLatestFormatVersion),
778
+ std::make_tuple(kAutoRibbon, false,
779
+ kLatestFormatVersion)));
780
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
781
+
782
+ TEST_F(DBBloomFilterTest, BloomFilterRate) {
783
+ while (ChangeFilterOptions()) {
784
+ Options options = CurrentOptions();
785
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
786
+ get_perf_context()->EnablePerLevelPerfContext();
787
+ CreateAndReopenWithCF({"pikachu"}, options);
788
+
789
+ const int maxKey = 10000;
790
+ for (int i = 0; i < maxKey; i++) {
791
+ ASSERT_OK(Put(1, Key(i), Key(i)));
792
+ }
793
+ // Add a large key to make the file contain wide range
794
+ ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
795
+ Flush(1);
796
+
797
+ // Check if they can be found
798
+ for (int i = 0; i < maxKey; i++) {
799
+ ASSERT_EQ(Key(i), Get(1, Key(i)));
800
+ }
801
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
802
+
803
+ // Check if filter is useful
804
+ for (int i = 0; i < maxKey; i++) {
805
+ ASSERT_EQ("NOT_FOUND", Get(1, Key(i + 33333)));
806
+ }
807
+ ASSERT_GE(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), maxKey * 0.98);
808
+ ASSERT_GE(GetLevelPerfContext(0).bloom_filter_useful, maxKey * 0.98);
809
+ get_perf_context()->Reset();
810
+ }
811
+ }
812
+
813
+ namespace {
814
+ struct CompatibilityConfig {
815
+ std::shared_ptr<const FilterPolicy> policy;
816
+ bool partitioned;
817
+ uint32_t format_version;
818
+
819
+ void SetInTableOptions(BlockBasedTableOptions* table_options) {
820
+ table_options->filter_policy = policy;
821
+ table_options->partition_filters = partitioned;
822
+ if (partitioned) {
823
+ table_options->index_type =
824
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
825
+ } else {
826
+ table_options->index_type =
827
+ BlockBasedTableOptions::IndexType::kBinarySearch;
828
+ }
829
+ table_options->format_version = format_version;
830
+ }
831
+ };
832
+ // High bits per key -> almost no FPs
833
+ std::shared_ptr<const FilterPolicy> kCompatibilityBloomPolicy{
834
+ NewBloomFilterPolicy(20)};
835
+ // bloom_before_level=-1 -> always use Ribbon
836
+ std::shared_ptr<const FilterPolicy> kCompatibilityRibbonPolicy{
837
+ NewRibbonFilterPolicy(20, -1)};
838
+
839
+ std::vector<CompatibilityConfig> kCompatibilityConfigs = {
840
+ {kCompatibilityBloomPolicy, false, BlockBasedTableOptions().format_version},
841
+ {kCompatibilityBloomPolicy, true, BlockBasedTableOptions().format_version},
842
+ {kCompatibilityBloomPolicy, false, /* legacy Bloom */ 4U},
843
+ {kCompatibilityRibbonPolicy, false,
844
+ BlockBasedTableOptions().format_version},
845
+ {kCompatibilityRibbonPolicy, true, BlockBasedTableOptions().format_version},
846
+ };
847
+ } // anonymous namespace
848
+
849
+ TEST_F(DBBloomFilterTest, BloomFilterCompatibility) {
850
+ Options options = CurrentOptions();
851
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
852
+ options.level0_file_num_compaction_trigger =
853
+ static_cast<int>(kCompatibilityConfigs.size()) + 1;
854
+ options.max_open_files = -1;
855
+
856
+ Close();
857
+
858
+ // Create one file for each kind of filter. Each file covers a distinct key
859
+ // range.
860
+ for (size_t i = 0; i < kCompatibilityConfigs.size(); ++i) {
861
+ BlockBasedTableOptions table_options;
862
+ kCompatibilityConfigs[i].SetInTableOptions(&table_options);
863
+ ASSERT_TRUE(table_options.filter_policy != nullptr);
864
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
865
+ Reopen(options);
866
+
867
+ std::string prefix = std::to_string(i) + "_";
868
+ ASSERT_OK(Put(prefix + "A", "val"));
869
+ ASSERT_OK(Put(prefix + "Z", "val"));
870
+ ASSERT_OK(Flush());
871
+ }
872
+
873
+ // Test filter is used between each pair of {reader,writer} configurations,
874
+ // because any built-in FilterPolicy should be able to read filters from any
875
+ // other built-in FilterPolicy
876
+ for (size_t i = 0; i < kCompatibilityConfigs.size(); ++i) {
877
+ BlockBasedTableOptions table_options;
878
+ kCompatibilityConfigs[i].SetInTableOptions(&table_options);
879
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
880
+ Reopen(options);
881
+ for (size_t j = 0; j < kCompatibilityConfigs.size(); ++j) {
882
+ std::string prefix = std::to_string(j) + "_";
883
+ ASSERT_EQ("val", Get(prefix + "A")); // Filter positive
884
+ ASSERT_EQ("val", Get(prefix + "Z")); // Filter positive
885
+ // Filter negative, with high probability
886
+ ASSERT_EQ("NOT_FOUND", Get(prefix + "Q"));
887
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_FULL_POSITIVE), 2);
888
+ EXPECT_EQ(PopTicker(options, BLOOM_FILTER_USEFUL), 1);
889
+ }
890
+ }
891
+ }
892
+
893
+ // To align with the type of hash entry being reserved in implementation.
894
+ using FilterConstructionReserveMemoryHash = uint64_t;
895
+
896
+ class ChargeFilterConstructionTestWithParam
897
+ : public DBTestBase,
898
+ public testing::WithParamInterface<std::tuple<
899
+ CacheEntryRoleOptions::Decision, std::string, bool, bool>> {
900
+ public:
901
+ ChargeFilterConstructionTestWithParam()
902
+ : DBTestBase("db_bloom_filter_tests",
903
+ /*env_do_fsync=*/true),
904
+ num_key_(0),
905
+ charge_filter_construction_(std::get<0>(GetParam())),
906
+ policy_(std::get<1>(GetParam())),
907
+ partition_filters_(std::get<2>(GetParam())),
908
+ detect_filter_construct_corruption_(std::get<3>(GetParam())) {
909
+ if (charge_filter_construction_ ==
910
+ CacheEntryRoleOptions::Decision::kDisabled ||
911
+ policy_ == kLegacyBloom) {
912
+ // For these cases, we only interested in whether filter construction
913
+ // cache charging happens instead of its accuracy. Therefore we don't
914
+ // need many keys.
915
+ num_key_ = 5;
916
+ } else if (partition_filters_) {
917
+ // For PartitionFilter case, since we set
918
+ // table_options.metadata_block_size big enough such that each partition
919
+ // trigger at least 1 dummy entry reservation each for hash entries and
920
+ // final filter, we need a large number of keys to ensure we have at least
921
+ // two partitions.
922
+ num_key_ = 18 *
923
+ CacheReservationManagerImpl<
924
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
925
+ sizeof(FilterConstructionReserveMemoryHash);
926
+ } else if (policy_ == kFastLocalBloom) {
927
+ // For Bloom Filter + FullFilter case, since we design the num_key_ to
928
+ // make hash entry cache charging be a multiple of dummy entries, the
929
+ // correct behavior of charging final filter on top of it will trigger at
930
+ // least another dummy entry insertion. Therefore we can assert that
931
+ // behavior and we don't need a large number of keys to verify we
932
+ // indeed charge the final filter for in cache, even though final
933
+ // filter is a lot smaller than hash entries.
934
+ num_key_ = 1 *
935
+ CacheReservationManagerImpl<
936
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
937
+ sizeof(FilterConstructionReserveMemoryHash);
938
+ } else {
939
+ // For Ribbon Filter + FullFilter case, we need a large enough number of
940
+ // keys so that charging final filter after releasing the hash entries
941
+ // reservation will trigger at least another dummy entry (or equivalently
942
+ // to saying, causing another peak in cache charging) as banding
943
+ // reservation might not be a multiple of dummy entry.
944
+ num_key_ = 12 *
945
+ CacheReservationManagerImpl<
946
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
947
+ sizeof(FilterConstructionReserveMemoryHash);
948
+ }
949
+ }
950
+
951
+ BlockBasedTableOptions GetBlockBasedTableOptions() {
952
+ BlockBasedTableOptions table_options;
953
+
954
+ // We set cache capacity big enough to prevent cache full for convenience in
955
+ // calculation.
956
+ constexpr std::size_t kCacheCapacity = 100 * 1024 * 1024;
957
+
958
+ table_options.cache_usage_options.options_overrides.insert(
959
+ {CacheEntryRole::kFilterConstruction,
960
+ {/*.charged = */ charge_filter_construction_}});
961
+ table_options.filter_policy = Create(10, policy_);
962
+ table_options.partition_filters = partition_filters_;
963
+ if (table_options.partition_filters) {
964
+ table_options.index_type =
965
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
966
+ // We set table_options.metadata_block_size big enough so that each
967
+ // partition trigger at least 1 dummy entry insertion each for hash
968
+ // entries and final filter.
969
+ table_options.metadata_block_size = 409000;
970
+ }
971
+ table_options.detect_filter_construct_corruption =
972
+ detect_filter_construct_corruption_;
973
+
974
+ LRUCacheOptions lo;
975
+ lo.capacity = kCacheCapacity;
976
+ lo.num_shard_bits = 0; // 2^0 shard
977
+ lo.strict_capacity_limit = true;
978
+ cache_ = std::make_shared<
979
+ TargetCacheChargeTrackingCache<CacheEntryRole::kFilterConstruction>>(
980
+ (NewLRUCache(lo)));
981
+ table_options.block_cache = cache_;
982
+
983
+ return table_options;
984
+ }
985
+
986
+ std::size_t GetNumKey() { return num_key_; }
987
+
988
+ CacheEntryRoleOptions::Decision ChargeFilterConstructMemory() {
989
+ return charge_filter_construction_;
990
+ }
991
+
992
+ std::string GetFilterPolicy() { return policy_; }
993
+
994
+ bool PartitionFilters() { return partition_filters_; }
995
+
996
+ std::shared_ptr<
997
+ TargetCacheChargeTrackingCache<CacheEntryRole::kFilterConstruction>>
998
+ GetCache() {
999
+ return cache_;
1000
+ }
1001
+
1002
+ private:
1003
+ std::size_t num_key_;
1004
+ CacheEntryRoleOptions::Decision charge_filter_construction_;
1005
+ std::string policy_;
1006
+ bool partition_filters_;
1007
+ std::shared_ptr<
1008
+ TargetCacheChargeTrackingCache<CacheEntryRole::kFilterConstruction>>
1009
+ cache_;
1010
+ bool detect_filter_construct_corruption_;
1011
+ };
1012
+
1013
+ INSTANTIATE_TEST_CASE_P(
1014
+ ChargeFilterConstructionTestWithParam,
1015
+ ChargeFilterConstructionTestWithParam,
1016
+ ::testing::Values(
1017
+ std::make_tuple(CacheEntryRoleOptions::Decision::kDisabled,
1018
+ kFastLocalBloom, false, false),
1019
+
1020
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1021
+ kFastLocalBloom, false, false),
1022
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1023
+ kFastLocalBloom, false, true),
1024
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1025
+ kFastLocalBloom, true, false),
1026
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1027
+ kFastLocalBloom, true, true),
1028
+
1029
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1030
+ kStandard128Ribbon, false, false),
1031
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1032
+ kStandard128Ribbon, false, true),
1033
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1034
+ kStandard128Ribbon, true, false),
1035
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled,
1036
+ kStandard128Ribbon, true, true),
1037
+
1038
+ std::make_tuple(CacheEntryRoleOptions::Decision::kEnabled, kLegacyBloom,
1039
+ false, false)));
1040
+
1041
+ // TODO: Speed up this test, and reduce disk space usage (~700MB)
1042
+ // The current test inserts many keys (on the scale of dummy entry size)
1043
+ // in order to make small memory user (e.g, final filter, partitioned hash
1044
+ // entries/filter/banding) , which is proportional to the number of
1045
+ // keys, big enough so that its cache charging triggers dummy entry insertion
1046
+ // and becomes observable in the test.
1047
+ //
1048
+ // However, inserting that many keys slows down this test and leaves future
1049
+ // developers an opportunity to speed it up.
1050
+ //
1051
+ // Possible approaches & challenges:
1052
+ // 1. Use sync point during cache charging of filter construction
1053
+ //
1054
+ // Benefit: It does not rely on triggering dummy entry insertion
1055
+ // but the sync point to verify small memory user is charged correctly.
1056
+ //
1057
+ // Challenge: this approach is intrusive.
1058
+ //
1059
+ // 2. Make dummy entry size configurable and set it small in the test
1060
+ //
1061
+ // Benefit: It increases the precision of cache charging and therefore
1062
+ // small memory usage can still trigger insertion of dummy entry.
1063
+ //
1064
+ // Challenge: change CacheReservationManager related APIs and a hack
1065
+ // might be needed to control the size of dummmy entry of
1066
+ // CacheReservationManager used in filter construction for testing
1067
+ // since CacheReservationManager is not exposed at the high level.
1068
+ //
1069
+ TEST_P(ChargeFilterConstructionTestWithParam, Basic) {
1070
+ Options options = CurrentOptions();
1071
+ // We set write_buffer_size big enough so that in the case where there is
1072
+ // filter construction cache charging, flush won't be triggered before we
1073
+ // manually trigger it for clean testing
1074
+ options.write_buffer_size = 640 << 20;
1075
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1076
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1077
+ std::shared_ptr<
1078
+ TargetCacheChargeTrackingCache<CacheEntryRole::kFilterConstruction>>
1079
+ cache = GetCache();
1080
+ options.create_if_missing = true;
1081
+ // Disable auto compaction to prevent its unexpected side effect
1082
+ // to the number of keys per partition designed by us in the test
1083
+ options.disable_auto_compactions = true;
1084
+ DestroyAndReopen(options);
1085
+ int num_key = static_cast<int>(GetNumKey());
1086
+ for (int i = 0; i < num_key; i++) {
1087
+ ASSERT_OK(Put(Key(i), Key(i)));
1088
+ }
1089
+
1090
+ ASSERT_EQ(cache->GetChargedCacheIncrementSum(), 0)
1091
+ << "Flush was triggered too early in the test case with filter "
1092
+ "construction cache charging - please make sure no flush triggered "
1093
+ "during the key insertions above";
1094
+
1095
+ ASSERT_OK(Flush());
1096
+
1097
+ bool charge_filter_construction = (ChargeFilterConstructMemory() ==
1098
+ CacheEntryRoleOptions::Decision::kEnabled);
1099
+ std::string policy = GetFilterPolicy();
1100
+ bool partition_filters = PartitionFilters();
1101
+ bool detect_filter_construct_corruption =
1102
+ table_options.detect_filter_construct_corruption;
1103
+
1104
+ std::deque<std::size_t> filter_construction_cache_res_peaks =
1105
+ cache->GetChargedCachePeaks();
1106
+ std::size_t filter_construction_cache_res_increments_sum =
1107
+ cache->GetChargedCacheIncrementSum();
1108
+
1109
+ if (!charge_filter_construction) {
1110
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 0);
1111
+ return;
1112
+ }
1113
+
1114
+ if (policy == kLegacyBloom) {
1115
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 0)
1116
+ << "There shouldn't be filter construction cache charging as this "
1117
+ "feature does not support kLegacyBloom";
1118
+ return;
1119
+ }
1120
+
1121
+ const std::size_t kDummyEntrySize = CacheReservationManagerImpl<
1122
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize();
1123
+
1124
+ const std::size_t predicted_hash_entries_cache_res =
1125
+ num_key * sizeof(FilterConstructionReserveMemoryHash);
1126
+ ASSERT_EQ(predicted_hash_entries_cache_res % kDummyEntrySize, 0)
1127
+ << "It's by this test's design that predicted_hash_entries_cache_res is "
1128
+ "a multipe of dummy entry";
1129
+
1130
+ const std::size_t predicted_hash_entries_cache_res_dummy_entry_num =
1131
+ predicted_hash_entries_cache_res / kDummyEntrySize;
1132
+ const std::size_t predicted_final_filter_cache_res =
1133
+ static_cast<std::size_t>(
1134
+ std::ceil(1.0 * predicted_hash_entries_cache_res_dummy_entry_num / 6 *
1135
+ (policy == kStandard128Ribbon ? 0.7 : 1))) *
1136
+ kDummyEntrySize;
1137
+ const std::size_t predicted_banding_cache_res =
1138
+ static_cast<std::size_t>(
1139
+ std::ceil(predicted_hash_entries_cache_res_dummy_entry_num * 2.5)) *
1140
+ kDummyEntrySize;
1141
+
1142
+ if (policy == kFastLocalBloom) {
1143
+ /* kFastLocalBloom + FullFilter
1144
+ * p0
1145
+ * / \
1146
+ * b / \
1147
+ * / \
1148
+ * / \
1149
+ * 0/ \
1150
+ * hash entries = b - 0, final filter = p0 - b
1151
+ * p0 = hash entries + final filter
1152
+ *
1153
+ * The test is designed in a way such that the reservation for b is a
1154
+ * multiple of dummy entries so that reservation for (p0 - b)
1155
+ * will trigger at least another dummy entry insertion.
1156
+ *
1157
+ * kFastLocalBloom + FullFilter +
1158
+ * detect_filter_construct_corruption
1159
+ * The peak p0 stays the same as
1160
+ * (kFastLocalBloom + FullFilter) but just lasts
1161
+ * longer since we release hash entries reservation later.
1162
+ *
1163
+ * kFastLocalBloom + PartitionedFilter
1164
+ * p1
1165
+ * / \
1166
+ * p0 b'/ \
1167
+ * / \ / \
1168
+ * b / \ / \
1169
+ * / \ / \
1170
+ * / a \
1171
+ * 0/ \
1172
+ * partitioned hash entries1 = b - 0, partitioned hash entries1 = b' - a
1173
+ * parittioned final filter1 = p0 - b, parittioned final filter2 = p1 - b'
1174
+ *
1175
+ * (increment p0 - 0) + (increment p1 - a)
1176
+ * = partitioned hash entries1 + partitioned hash entries2
1177
+ * + parittioned final filter1 + parittioned final filter2
1178
+ * = hash entries + final filter
1179
+ *
1180
+ * kFastLocalBloom + PartitionedFilter +
1181
+ * detect_filter_construct_corruption
1182
+ * The peak p0, p1 stay the same as
1183
+ * (kFastLocalBloom + PartitionedFilter) but just
1184
+ * last longer since we release hash entries reservation later.
1185
+ *
1186
+ */
1187
+ if (!partition_filters) {
1188
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 1)
1189
+ << "Filter construction cache charging should have only 1 peak in "
1190
+ "case: kFastLocalBloom + FullFilter";
1191
+ std::size_t filter_construction_cache_res_peak =
1192
+ filter_construction_cache_res_peaks[0];
1193
+ EXPECT_GT(filter_construction_cache_res_peak,
1194
+ predicted_hash_entries_cache_res)
1195
+ << "The testing number of hash entries is designed to make hash "
1196
+ "entries cache charging be multiples of dummy entries"
1197
+ " so the correct behavior of charging final filter on top of it"
1198
+ " should've triggered at least another dummy entry insertion";
1199
+
1200
+ std::size_t predicted_filter_construction_cache_res_peak =
1201
+ predicted_hash_entries_cache_res + predicted_final_filter_cache_res;
1202
+ EXPECT_GE(filter_construction_cache_res_peak,
1203
+ predicted_filter_construction_cache_res_peak * 0.9);
1204
+ EXPECT_LE(filter_construction_cache_res_peak,
1205
+ predicted_filter_construction_cache_res_peak * 1.1);
1206
+ return;
1207
+ } else {
1208
+ EXPECT_GE(filter_construction_cache_res_peaks.size(), 2)
1209
+ << "Filter construction cache charging should have multiple peaks "
1210
+ "in case: kFastLocalBloom + "
1211
+ "PartitionedFilter";
1212
+ std::size_t predicted_filter_construction_cache_res_increments_sum =
1213
+ predicted_hash_entries_cache_res + predicted_final_filter_cache_res;
1214
+ EXPECT_GE(filter_construction_cache_res_increments_sum,
1215
+ predicted_filter_construction_cache_res_increments_sum * 0.9);
1216
+ EXPECT_LE(filter_construction_cache_res_increments_sum,
1217
+ predicted_filter_construction_cache_res_increments_sum * 1.1);
1218
+ return;
1219
+ }
1220
+ }
1221
+
1222
+ if (policy == kStandard128Ribbon) {
1223
+ /* kStandard128Ribbon + FullFilter
1224
+ * p0
1225
+ * / \ p1
1226
+ * / \/\
1227
+ * b / b' \
1228
+ * / \
1229
+ * 0/ \
1230
+ * hash entries = b - 0, banding = p0 - b, final filter = p1 - b'
1231
+ * p0 = hash entries + banding
1232
+ *
1233
+ * The test is designed in a way such that the reservation for (p1 - b')
1234
+ * will trigger at least another dummy entry insertion
1235
+ * (or equivalently to saying, creating another peak).
1236
+ *
1237
+ * kStandard128Ribbon + FullFilter +
1238
+ * detect_filter_construct_corruption
1239
+ *
1240
+ * new p0
1241
+ * / \
1242
+ * / \
1243
+ * pre p0 \
1244
+ * / \
1245
+ * / \
1246
+ * b / \
1247
+ * / \
1248
+ * 0/ \
1249
+ * hash entries = b - 0, banding = pre p0 - b,
1250
+ * final filter = new p0 - pre p0
1251
+ * new p0 = hash entries + banding + final filter
1252
+ *
1253
+ * The previous p0 will no longer be a peak since under
1254
+ * detect_filter_construct_corruption == true, we do not release hash
1255
+ * entries reserveration (like p0 - b' previously) until after final filter
1256
+ * creation and post-verification
1257
+ *
1258
+ * kStandard128Ribbon + PartitionedFilter
1259
+ * p3
1260
+ * p0 /\ p4
1261
+ * / \ p1 / \ /\
1262
+ * / \/\ b''/ a' \
1263
+ * b / b' \ / \
1264
+ * / \ / \
1265
+ * 0/ a \
1266
+ * partitioned hash entries1 = b - 0, partitioned hash entries2 = b'' - a
1267
+ * partitioned banding1 = p0 - b, partitioned banding2 = p3 - b''
1268
+ * parittioned final filter1 = p1 - b',parittioned final filter2 = p4 - a'
1269
+ *
1270
+ * (increment p0 - 0) + (increment p1 - b')
1271
+ * + (increment p3 - a) + (increment p4 - a')
1272
+ * = partitioned hash entries1 + partitioned hash entries2
1273
+ * + parittioned banding1 + parittioned banding2
1274
+ * + parittioned final filter1 + parittioned final filter2
1275
+ * = hash entries + banding + final filter
1276
+ *
1277
+ * kStandard128Ribbon + PartitionedFilter +
1278
+ * detect_filter_construct_corruption
1279
+ *
1280
+ * new p3
1281
+ * / \
1282
+ * pre p3 \
1283
+ * new p0 / \
1284
+ * / \ / \
1285
+ * pre p0 \ / \
1286
+ * / \ b'/ \
1287
+ * / \ / \
1288
+ * b / \ / \
1289
+ * / \a \
1290
+ * 0/ \
1291
+ * partitioned hash entries1 = b - 0, partitioned hash entries2 = b' - a
1292
+ * partitioned banding1 = pre p0 - b, partitioned banding2 = pre p3 - b'
1293
+ * parittioned final filter1 = new p0 - pre p0,
1294
+ * parittioned final filter2 = new p3 - pre p3
1295
+ *
1296
+ * The previous p0 and p3 will no longer be a peak since under
1297
+ * detect_filter_construct_corruption == true, we do not release hash
1298
+ * entries reserveration (like p0 - b', p3 - a' previously) until after
1299
+ * parittioned final filter creation and post-verification
1300
+ *
1301
+ * However, increments sum stay the same as shown below:
1302
+ * (increment new p0 - 0) + (increment new p3 - a)
1303
+ * = partitioned hash entries1 + partitioned hash entries2
1304
+ * + parittioned banding1 + parittioned banding2
1305
+ * + parittioned final filter1 + parittioned final filter2
1306
+ * = hash entries + banding + final filter
1307
+ *
1308
+ */
1309
+ if (!partition_filters) {
1310
+ ASSERT_GE(
1311
+ std::floor(
1312
+ 1.0 * predicted_final_filter_cache_res /
1313
+ CacheReservationManagerImpl<
1314
+ CacheEntryRole::kFilterConstruction>::GetDummyEntrySize()),
1315
+ 1)
1316
+ << "Final filter cache charging too small for this test - please "
1317
+ "increase the number of keys";
1318
+ if (!detect_filter_construct_corruption) {
1319
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 2)
1320
+ << "Filter construction cache charging should have 2 peaks in "
1321
+ "case: kStandard128Ribbon + "
1322
+ "FullFilter. "
1323
+ "The second peak is resulted from charging the final filter "
1324
+ "after "
1325
+ "decreasing the hash entry reservation since the testing final "
1326
+ "filter reservation is designed to be at least 1 dummy entry "
1327
+ "size";
1328
+
1329
+ std::size_t filter_construction_cache_res_peak =
1330
+ filter_construction_cache_res_peaks[0];
1331
+ std::size_t predicted_filter_construction_cache_res_peak =
1332
+ predicted_hash_entries_cache_res + predicted_banding_cache_res;
1333
+ EXPECT_GE(filter_construction_cache_res_peak,
1334
+ predicted_filter_construction_cache_res_peak * 0.9);
1335
+ EXPECT_LE(filter_construction_cache_res_peak,
1336
+ predicted_filter_construction_cache_res_peak * 1.1);
1337
+ } else {
1338
+ EXPECT_EQ(filter_construction_cache_res_peaks.size(), 1)
1339
+ << "Filter construction cache charging should have 1 peaks in "
1340
+ "case: kStandard128Ribbon + FullFilter "
1341
+ "+ detect_filter_construct_corruption. "
1342
+ "The previous second peak now disappears since we don't "
1343
+ "decrease the hash entry reservation"
1344
+ "until after final filter reservation and post-verification";
1345
+
1346
+ std::size_t filter_construction_cache_res_peak =
1347
+ filter_construction_cache_res_peaks[0];
1348
+ std::size_t predicted_filter_construction_cache_res_peak =
1349
+ predicted_hash_entries_cache_res + predicted_banding_cache_res +
1350
+ predicted_final_filter_cache_res;
1351
+ EXPECT_GE(filter_construction_cache_res_peak,
1352
+ predicted_filter_construction_cache_res_peak * 0.9);
1353
+ EXPECT_LE(filter_construction_cache_res_peak,
1354
+ predicted_filter_construction_cache_res_peak * 1.1);
1355
+ }
1356
+ return;
1357
+ } else {
1358
+ if (!detect_filter_construct_corruption) {
1359
+ EXPECT_GE(filter_construction_cache_res_peaks.size(), 3)
1360
+ << "Filter construction cache charging should have more than 3 "
1361
+ "peaks "
1362
+ "in case: kStandard128Ribbon + "
1363
+ "PartitionedFilter";
1364
+ } else {
1365
+ EXPECT_GE(filter_construction_cache_res_peaks.size(), 2)
1366
+ << "Filter construction cache charging should have more than 2 "
1367
+ "peaks "
1368
+ "in case: kStandard128Ribbon + "
1369
+ "PartitionedFilter + detect_filter_construct_corruption";
1370
+ }
1371
+ std::size_t predicted_filter_construction_cache_res_increments_sum =
1372
+ predicted_hash_entries_cache_res + predicted_banding_cache_res +
1373
+ predicted_final_filter_cache_res;
1374
+ EXPECT_GE(filter_construction_cache_res_increments_sum,
1375
+ predicted_filter_construction_cache_res_increments_sum * 0.9);
1376
+ EXPECT_LE(filter_construction_cache_res_increments_sum,
1377
+ predicted_filter_construction_cache_res_increments_sum * 1.1);
1378
+ return;
1379
+ }
1380
+ }
1381
+ }
1382
+
1383
+ class DBFilterConstructionCorruptionTestWithParam
1384
+ : public DBTestBase,
1385
+ public testing::WithParamInterface<
1386
+ std::tuple<bool /* detect_filter_construct_corruption */, std::string,
1387
+ bool /* partition_filters */>> {
1388
+ public:
1389
+ DBFilterConstructionCorruptionTestWithParam()
1390
+ : DBTestBase("db_bloom_filter_tests",
1391
+ /*env_do_fsync=*/true) {}
1392
+
1393
+ BlockBasedTableOptions GetBlockBasedTableOptions() {
1394
+ BlockBasedTableOptions table_options;
1395
+ table_options.detect_filter_construct_corruption = std::get<0>(GetParam());
1396
+ table_options.filter_policy = Create(10, std::get<1>(GetParam()));
1397
+ table_options.partition_filters = std::get<2>(GetParam());
1398
+ if (table_options.partition_filters) {
1399
+ table_options.index_type =
1400
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1401
+ // We set table_options.metadata_block_size small enough so we can
1402
+ // trigger filter partitioning with GetNumKey() amount of keys
1403
+ table_options.metadata_block_size = 10;
1404
+ }
1405
+
1406
+ return table_options;
1407
+ }
1408
+
1409
+ // Return an appropriate amount of keys for testing
1410
+ // to generate a long filter (i.e, size >= 8 + kMetadataLen)
1411
+ std::size_t GetNumKey() { return 5000; }
1412
+ };
1413
+
1414
+ INSTANTIATE_TEST_CASE_P(
1415
+ DBFilterConstructionCorruptionTestWithParam,
1416
+ DBFilterConstructionCorruptionTestWithParam,
1417
+ ::testing::Values(std::make_tuple(false, kFastLocalBloom, false),
1418
+ std::make_tuple(true, kFastLocalBloom, false),
1419
+ std::make_tuple(true, kFastLocalBloom, true),
1420
+ std::make_tuple(true, kStandard128Ribbon, false),
1421
+ std::make_tuple(true, kStandard128Ribbon, true)));
1422
+
1423
+ TEST_P(DBFilterConstructionCorruptionTestWithParam, DetectCorruption) {
1424
+ Options options = CurrentOptions();
1425
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1426
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1427
+ options.create_if_missing = true;
1428
+ options.disable_auto_compactions = true;
1429
+
1430
+ DestroyAndReopen(options);
1431
+ int num_key = static_cast<int>(GetNumKey());
1432
+ Status s;
1433
+
1434
+ // Case 1: No corruption in filter construction
1435
+ for (int i = 0; i < num_key; i++) {
1436
+ ASSERT_OK(Put(Key(i), Key(i)));
1437
+ }
1438
+ s = Flush();
1439
+ EXPECT_TRUE(s.ok());
1440
+
1441
+ // Case 2: Corruption of hash entries in filter construction
1442
+ for (int i = 0; i < num_key; i++) {
1443
+ ASSERT_OK(Put(Key(i), Key(i)));
1444
+ }
1445
+
1446
+ SyncPoint::GetInstance()->SetCallBack(
1447
+ "XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
1448
+ std::deque<uint64_t>* hash_entries_to_corrupt =
1449
+ (std::deque<uint64_t>*)arg;
1450
+ assert(!hash_entries_to_corrupt->empty());
1451
+ *(hash_entries_to_corrupt->begin()) =
1452
+ *(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
1453
+ });
1454
+ SyncPoint::GetInstance()->EnableProcessing();
1455
+
1456
+ s = Flush();
1457
+
1458
+ if (table_options.detect_filter_construct_corruption) {
1459
+ EXPECT_TRUE(s.IsCorruption());
1460
+ EXPECT_TRUE(
1461
+ s.ToString().find("Filter's hash entries checksum mismatched") !=
1462
+ std::string::npos);
1463
+ } else {
1464
+ EXPECT_TRUE(s.ok());
1465
+ }
1466
+
1467
+ SyncPoint::GetInstance()->DisableProcessing();
1468
+ SyncPoint::GetInstance()->ClearCallBack(
1469
+ "XXPH3FilterBitsBuilder::Finish::"
1470
+ "TamperHashEntries");
1471
+
1472
+ // Case 3: Corruption of filter content in filter construction
1473
+ DestroyAndReopen(options);
1474
+
1475
+ for (int i = 0; i < num_key; i++) {
1476
+ ASSERT_OK(Put(Key(i), Key(i)));
1477
+ }
1478
+
1479
+ SyncPoint::GetInstance()->SetCallBack(
1480
+ "XXPH3FilterBitsBuilder::Finish::TamperFilter", [&](void* arg) {
1481
+ std::pair<std::unique_ptr<char[]>*, std::size_t>* TEST_arg_pair =
1482
+ (std::pair<std::unique_ptr<char[]>*, std::size_t>*)arg;
1483
+ std::size_t filter_size = TEST_arg_pair->second;
1484
+ // 5 is the kMetadataLen and
1485
+ assert(filter_size >= 8 + 5);
1486
+ std::unique_ptr<char[]>* filter_content_to_corrupt =
1487
+ TEST_arg_pair->first;
1488
+ std::memset(filter_content_to_corrupt->get(), '\0', 8);
1489
+ });
1490
+ SyncPoint::GetInstance()->EnableProcessing();
1491
+
1492
+ s = Flush();
1493
+
1494
+ if (table_options.detect_filter_construct_corruption) {
1495
+ EXPECT_TRUE(s.IsCorruption());
1496
+ EXPECT_TRUE(s.ToString().find("Corrupted filter content") !=
1497
+ std::string::npos);
1498
+ } else {
1499
+ EXPECT_TRUE(s.ok());
1500
+ }
1501
+
1502
+ SyncPoint::GetInstance()->DisableProcessing();
1503
+ SyncPoint::GetInstance()->ClearCallBack(
1504
+ "XXPH3FilterBitsBuilder::Finish::"
1505
+ "TamperFilter");
1506
+ }
1507
+
1508
+ // RocksDB lite does not support dynamic options
1509
+ TEST_P(DBFilterConstructionCorruptionTestWithParam,
1510
+ DynamicallyTurnOnAndOffDetectConstructCorruption) {
1511
+ Options options = CurrentOptions();
1512
+ BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1513
+ // We intend to turn on
1514
+ // table_options.detect_filter_construct_corruption dynamically
1515
+ // therefore we override this test parmater's value
1516
+ table_options.detect_filter_construct_corruption = false;
1517
+
1518
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1519
+ options.create_if_missing = true;
1520
+
1521
+ int num_key = static_cast<int>(GetNumKey());
1522
+ Status s;
1523
+
1524
+ DestroyAndReopen(options);
1525
+
1526
+ // Case 1: !table_options.detect_filter_construct_corruption
1527
+ for (int i = 0; i < num_key; i++) {
1528
+ ASSERT_OK(Put(Key(i), Key(i)));
1529
+ }
1530
+
1531
+ SyncPoint::GetInstance()->SetCallBack(
1532
+ "XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
1533
+ std::deque<uint64_t>* hash_entries_to_corrupt =
1534
+ (std::deque<uint64_t>*)arg;
1535
+ assert(!hash_entries_to_corrupt->empty());
1536
+ *(hash_entries_to_corrupt->begin()) =
1537
+ *(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
1538
+ });
1539
+ SyncPoint::GetInstance()->EnableProcessing();
1540
+
1541
+ s = Flush();
1542
+
1543
+ SyncPoint::GetInstance()->DisableProcessing();
1544
+ SyncPoint::GetInstance()->ClearCallBack(
1545
+ "XXPH3FilterBitsBuilder::Finish::"
1546
+ "TamperHashEntries");
1547
+
1548
+ ASSERT_FALSE(table_options.detect_filter_construct_corruption);
1549
+ EXPECT_TRUE(s.ok());
1550
+
1551
+ // Case 2: dynamically turn on
1552
+ // table_options.detect_filter_construct_corruption
1553
+ ASSERT_OK(db_->SetOptions({{"block_based_table_factory",
1554
+ "{detect_filter_construct_corruption=true;}"}}));
1555
+
1556
+ for (int i = 0; i < num_key; i++) {
1557
+ ASSERT_OK(Put(Key(i), Key(i)));
1558
+ }
1559
+
1560
+ SyncPoint::GetInstance()->SetCallBack(
1561
+ "XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
1562
+ std::deque<uint64_t>* hash_entries_to_corrupt =
1563
+ (std::deque<uint64_t>*)arg;
1564
+ assert(!hash_entries_to_corrupt->empty());
1565
+ *(hash_entries_to_corrupt->begin()) =
1566
+ *(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
1567
+ });
1568
+ SyncPoint::GetInstance()->EnableProcessing();
1569
+
1570
+ s = Flush();
1571
+
1572
+ SyncPoint::GetInstance()->DisableProcessing();
1573
+ SyncPoint::GetInstance()->ClearCallBack(
1574
+ "XXPH3FilterBitsBuilder::Finish::"
1575
+ "TamperHashEntries");
1576
+
1577
+ auto updated_table_options =
1578
+ db_->GetOptions().table_factory->GetOptions<BlockBasedTableOptions>();
1579
+ EXPECT_TRUE(updated_table_options->detect_filter_construct_corruption);
1580
+ EXPECT_TRUE(s.IsCorruption());
1581
+ EXPECT_TRUE(s.ToString().find("Filter's hash entries checksum mismatched") !=
1582
+ std::string::npos);
1583
+
1584
+ // Case 3: dynamically turn off
1585
+ // table_options.detect_filter_construct_corruption
1586
+ ASSERT_OK(db_->SetOptions({{"block_based_table_factory",
1587
+ "{detect_filter_construct_corruption=false;}"}}));
1588
+ updated_table_options =
1589
+ db_->GetOptions().table_factory->GetOptions<BlockBasedTableOptions>();
1590
+ EXPECT_FALSE(updated_table_options->detect_filter_construct_corruption);
1591
+ }
1592
+
1593
+ namespace {
1594
+ // NOTE: This class is referenced by HISTORY.md as a model for a wrapper
1595
+ // FilterPolicy selecting among configurations based on context.
1596
+ class LevelAndStyleCustomFilterPolicy : public FilterPolicy {
1597
+ public:
1598
+ explicit LevelAndStyleCustomFilterPolicy(int bpk_fifo, int bpk_l0_other,
1599
+ int bpk_otherwise)
1600
+ : policy_fifo_(NewBloomFilterPolicy(bpk_fifo)),
1601
+ policy_l0_other_(NewBloomFilterPolicy(bpk_l0_other)),
1602
+ policy_otherwise_(NewBloomFilterPolicy(bpk_otherwise)) {}
1603
+
1604
+ const char* Name() const override {
1605
+ return "LevelAndStyleCustomFilterPolicy";
1606
+ }
1607
+
1608
+ // OK to use built-in policy name because we are deferring to a
1609
+ // built-in builder. We aren't changing the serialized format.
1610
+ const char* CompatibilityName() const override {
1611
+ return policy_fifo_->CompatibilityName();
1612
+ }
1613
+
1614
+ FilterBitsBuilder* GetBuilderWithContext(
1615
+ const FilterBuildingContext& context) const override {
1616
+ if (context.compaction_style == kCompactionStyleFIFO) {
1617
+ return policy_fifo_->GetBuilderWithContext(context);
1618
+ } else if (context.level_at_creation == 0) {
1619
+ return policy_l0_other_->GetBuilderWithContext(context);
1620
+ } else {
1621
+ return policy_otherwise_->GetBuilderWithContext(context);
1622
+ }
1623
+ }
1624
+
1625
+ FilterBitsReader* GetFilterBitsReader(const Slice& contents) const override {
1626
+ // OK to defer to any of them; they all can parse built-in filters
1627
+ // from any settings.
1628
+ return policy_fifo_->GetFilterBitsReader(contents);
1629
+ }
1630
+
1631
+ private:
1632
+ const std::unique_ptr<const FilterPolicy> policy_fifo_;
1633
+ const std::unique_ptr<const FilterPolicy> policy_l0_other_;
1634
+ const std::unique_ptr<const FilterPolicy> policy_otherwise_;
1635
+ };
1636
+
1637
+ static std::map<TableFileCreationReason, std::string>
1638
+ table_file_creation_reason_to_string{
1639
+ {TableFileCreationReason::kCompaction, "kCompaction"},
1640
+ {TableFileCreationReason::kFlush, "kFlush"},
1641
+ {TableFileCreationReason::kMisc, "kMisc"},
1642
+ {TableFileCreationReason::kRecovery, "kRecovery"},
1643
+ };
1644
+
1645
+ class TestingContextCustomFilterPolicy
1646
+ : public LevelAndStyleCustomFilterPolicy {
1647
+ public:
1648
+ explicit TestingContextCustomFilterPolicy(int bpk_fifo, int bpk_l0_other,
1649
+ int bpk_otherwise)
1650
+ : LevelAndStyleCustomFilterPolicy(bpk_fifo, bpk_l0_other, bpk_otherwise) {
1651
+ }
1652
+
1653
+ FilterBitsBuilder* GetBuilderWithContext(
1654
+ const FilterBuildingContext& context) const override {
1655
+ test_report_ += "cf=";
1656
+ test_report_ += context.column_family_name;
1657
+ test_report_ += ",s=";
1658
+ test_report_ +=
1659
+ OptionsHelper::compaction_style_to_string[context.compaction_style];
1660
+ test_report_ += ",n=";
1661
+ test_report_ += std::to_string(context.num_levels);
1662
+ test_report_ += ",l=";
1663
+ test_report_ += std::to_string(context.level_at_creation);
1664
+ test_report_ += ",b=";
1665
+ test_report_ += std::to_string(int{context.is_bottommost});
1666
+ test_report_ += ",r=";
1667
+ test_report_ += table_file_creation_reason_to_string[context.reason];
1668
+ test_report_ += "\n";
1669
+
1670
+ return LevelAndStyleCustomFilterPolicy::GetBuilderWithContext(context);
1671
+ }
1672
+
1673
+ std::string DumpTestReport() {
1674
+ std::string rv;
1675
+ std::swap(rv, test_report_);
1676
+ return rv;
1677
+ }
1678
+
1679
+ private:
1680
+ mutable std::string test_report_;
1681
+ };
1682
+ } // anonymous namespace
1683
+
1684
+ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
1685
+ auto policy = std::make_shared<TestingContextCustomFilterPolicy>(15, 8, 5);
1686
+ Options options;
1687
+ for (bool fifo : {true, false}) {
1688
+ options = CurrentOptions();
1689
+ options.max_open_files = fifo ? -1 : options.max_open_files;
1690
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
1691
+ options.compaction_style =
1692
+ fifo ? kCompactionStyleFIFO : kCompactionStyleLevel;
1693
+
1694
+ BlockBasedTableOptions table_options;
1695
+ table_options.filter_policy = policy;
1696
+ table_options.format_version = 5;
1697
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1698
+
1699
+ TryReopen(options);
1700
+ CreateAndReopenWithCF({fifo ? "abe" : "bob"}, options);
1701
+
1702
+ const int maxKey = 10000;
1703
+ for (int i = 0; i < maxKey / 2; i++) {
1704
+ ASSERT_OK(Put(1, Key(i), Key(i)));
1705
+ }
1706
+ // Add a large key to make the file contain wide range
1707
+ ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
1708
+ Flush(1);
1709
+ EXPECT_EQ(policy->DumpTestReport(),
1710
+ fifo ? "cf=abe,s=kCompactionStyleFIFO,n=7,l=0,b=0,r=kFlush\n"
1711
+ : "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
1712
+
1713
+ for (int i = maxKey / 2; i < maxKey; i++) {
1714
+ ASSERT_OK(Put(1, Key(i), Key(i)));
1715
+ }
1716
+ Flush(1);
1717
+ EXPECT_EQ(policy->DumpTestReport(),
1718
+ fifo ? "cf=abe,s=kCompactionStyleFIFO,n=7,l=0,b=0,r=kFlush\n"
1719
+ : "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
1720
+
1721
+ // Check that they can be found
1722
+ for (int i = 0; i < maxKey; i++) {
1723
+ ASSERT_EQ(Key(i), Get(1, Key(i)));
1724
+ }
1725
+ // Since we have two tables / two filters, we might have Bloom checks on
1726
+ // our queries, but no more than one "useful" per query on a found key.
1727
+ EXPECT_LE(PopTicker(options, BLOOM_FILTER_USEFUL), maxKey);
1728
+
1729
+ // Check that we have two filters, each about
1730
+ // fifo: 0.12% FP rate (15 bits per key)
1731
+ // level: 2.3% FP rate (8 bits per key)
1732
+ for (int i = 0; i < maxKey; i++) {
1733
+ ASSERT_EQ("NOT_FOUND", Get(1, Key(i + 33333)));
1734
+ }
1735
+ {
1736
+ auto useful_count = PopTicker(options, BLOOM_FILTER_USEFUL);
1737
+ EXPECT_GE(useful_count, maxKey * 2 * (fifo ? 0.9980 : 0.975));
1738
+ EXPECT_LE(useful_count, maxKey * 2 * (fifo ? 0.9995 : 0.98));
1739
+ }
1740
+
1741
+ if (!fifo) { // FIFO doesn't fully support CompactRange
1742
+ // Full compaction
1743
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), handles_[1], nullptr,
1744
+ nullptr));
1745
+ EXPECT_EQ(policy->DumpTestReport(),
1746
+ "cf=bob,s=kCompactionStyleLevel,n=7,l=1,b=1,r=kCompaction\n");
1747
+
1748
+ // Check that we now have one filter, about 9.2% FP rate (5 bits per key)
1749
+ for (int i = 0; i < maxKey; i++) {
1750
+ ASSERT_EQ("NOT_FOUND", Get(1, Key(i + 33333)));
1751
+ }
1752
+ {
1753
+ auto useful_count = PopTicker(options, BLOOM_FILTER_USEFUL);
1754
+ EXPECT_GE(useful_count, maxKey * 0.90);
1755
+ EXPECT_LE(useful_count, maxKey * 0.91);
1756
+ }
1757
+ } else {
1758
+ // Also try external SST file
1759
+ {
1760
+ std::string file_path = dbname_ + "/external.sst";
1761
+ SstFileWriter sst_file_writer(EnvOptions(), options, handles_[1]);
1762
+ ASSERT_OK(sst_file_writer.Open(file_path));
1763
+ ASSERT_OK(sst_file_writer.Put("key", "value"));
1764
+ ASSERT_OK(sst_file_writer.Finish());
1765
+ }
1766
+ // Note: kCompactionStyleLevel is default, ignored if num_levels == -1
1767
+ EXPECT_EQ(policy->DumpTestReport(),
1768
+ "cf=abe,s=kCompactionStyleLevel,n=-1,l=-1,b=0,r=kMisc\n");
1769
+ }
1770
+
1771
+ // Destroy
1772
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[1]));
1773
+ ASSERT_OK(dbfull()->DestroyColumnFamilyHandle(handles_[1]));
1774
+ handles_[1] = nullptr;
1775
+ }
1776
+ }
1777
+
1778
+ class SliceTransformLimitedDomain : public SliceTransform {
1779
+ const char* Name() const override { return "SliceTransformLimitedDomain"; }
1780
+
1781
+ Slice Transform(const Slice& src) const override {
1782
+ return Slice(src.data(), 5);
1783
+ }
1784
+
1785
+ bool InDomain(const Slice& src) const override {
1786
+ // prefix will be x????
1787
+ return src.size() >= 5 && src[0] == 'x';
1788
+ }
1789
+
1790
+ bool InRange(const Slice& dst) const override {
1791
+ // prefix will be x????
1792
+ return dst.size() == 5 && dst[0] == 'x';
1793
+ }
1794
+ };
1795
+
1796
+ TEST_F(DBBloomFilterTest, PrefixExtractorWithFilter1) {
1797
+ BlockBasedTableOptions bbto;
1798
+ bbto.filter_policy.reset(ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10));
1799
+ bbto.whole_key_filtering = false;
1800
+
1801
+ Options options = CurrentOptions();
1802
+ options.prefix_extractor = std::make_shared<SliceTransformLimitedDomain>();
1803
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
1804
+
1805
+ DestroyAndReopen(options);
1806
+
1807
+ ASSERT_OK(Put("x1111_AAAA", "val1"));
1808
+ ASSERT_OK(Put("x1112_AAAA", "val2"));
1809
+ ASSERT_OK(Put("x1113_AAAA", "val3"));
1810
+ ASSERT_OK(Put("x1114_AAAA", "val4"));
1811
+ // Not in domain, wont be added to filter
1812
+ ASSERT_OK(Put("zzzzz_AAAA", "val5"));
1813
+
1814
+ ASSERT_OK(Flush());
1815
+
1816
+ ASSERT_EQ(Get("x1111_AAAA"), "val1");
1817
+ ASSERT_EQ(Get("x1112_AAAA"), "val2");
1818
+ ASSERT_EQ(Get("x1113_AAAA"), "val3");
1819
+ ASSERT_EQ(Get("x1114_AAAA"), "val4");
1820
+ // Was not added to filter but rocksdb will try to read it from the filter
1821
+ ASSERT_EQ(Get("zzzzz_AAAA"), "val5");
1822
+ }
1823
+
1824
+ TEST_F(DBBloomFilterTest, PrefixExtractorWithFilter2) {
1825
+ BlockBasedTableOptions bbto;
1826
+ bbto.filter_policy.reset(ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10));
1827
+
1828
+ Options options = CurrentOptions();
1829
+ options.prefix_extractor = std::make_shared<SliceTransformLimitedDomain>();
1830
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
1831
+
1832
+ DestroyAndReopen(options);
1833
+
1834
+ ASSERT_OK(Put("x1113_AAAA", "val3"));
1835
+ ASSERT_OK(Put("x1114_AAAA", "val4"));
1836
+ // Not in domain, wont be added to filter
1837
+ ASSERT_OK(Put("zzzzz_AAAA", "val1"));
1838
+ ASSERT_OK(Put("zzzzz_AAAB", "val2"));
1839
+ ASSERT_OK(Put("zzzzz_AAAC", "val3"));
1840
+ ASSERT_OK(Put("zzzzz_AAAD", "val4"));
1841
+
1842
+ ASSERT_OK(Flush());
1843
+
1844
+ std::vector<std::string> iter_res;
1845
+ auto iter = db_->NewIterator(ReadOptions());
1846
+ // Seek to a key that was not in Domain
1847
+ for (iter->Seek("zzzzz_AAAA"); iter->Valid(); iter->Next()) {
1848
+ iter_res.emplace_back(iter->value().ToString());
1849
+ }
1850
+
1851
+ std::vector<std::string> expected_res = {"val1", "val2", "val3", "val4"};
1852
+ ASSERT_EQ(iter_res, expected_res);
1853
+ delete iter;
1854
+ }
1855
+
1856
+ TEST_F(DBBloomFilterTest, MemtableWholeKeyBloomFilter) {
1857
+ // regression test for #2743. the range delete tombstones in memtable should
1858
+ // be added even when Get() skips searching due to its prefix bloom filter
1859
+ const int kMemtableSize = 1 << 20; // 1MB
1860
+ const int kMemtablePrefixFilterSize = 1 << 13; // 8KB
1861
+ const int kPrefixLen = 4;
1862
+ Options options = CurrentOptions();
1863
+ options.memtable_prefix_bloom_size_ratio =
1864
+ static_cast<double>(kMemtablePrefixFilterSize) / kMemtableSize;
1865
+ options.prefix_extractor.reset(
1866
+ ROCKSDB_NAMESPACE::NewFixedPrefixTransform(kPrefixLen));
1867
+ options.write_buffer_size = kMemtableSize;
1868
+ options.memtable_whole_key_filtering = false;
1869
+ Reopen(options);
1870
+ std::string key1("AAAABBBB");
1871
+ std::string key2("AAAACCCC"); // not in DB
1872
+ std::string key3("AAAADDDD");
1873
+ std::string key4("AAAAEEEE");
1874
+ std::string value1("Value1");
1875
+ std::string value3("Value3");
1876
+ std::string value4("Value4");
1877
+
1878
+ ASSERT_OK(Put(key1, value1, WriteOptions()));
1879
+
1880
+ // check memtable bloom stats
1881
+ ASSERT_EQ("NOT_FOUND", Get(key2));
1882
+ ASSERT_EQ(0, get_perf_context()->bloom_memtable_miss_count);
1883
+ // same prefix, bloom filter false positive
1884
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_hit_count);
1885
+
1886
+ // enable whole key bloom filter
1887
+ options.memtable_whole_key_filtering = true;
1888
+ Reopen(options);
1889
+ // check memtable bloom stats
1890
+ ASSERT_OK(Put(key3, value3, WriteOptions()));
1891
+ ASSERT_EQ("NOT_FOUND", Get(key2));
1892
+ // whole key bloom filter kicks in and determines it's a miss
1893
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_miss_count);
1894
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_hit_count);
1895
+
1896
+ // verify whole key filtering does not depend on prefix_extractor
1897
+ options.prefix_extractor.reset();
1898
+ Reopen(options);
1899
+ // check memtable bloom stats
1900
+ ASSERT_OK(Put(key4, value4, WriteOptions()));
1901
+ ASSERT_EQ("NOT_FOUND", Get(key2));
1902
+ // whole key bloom filter kicks in and determines it's a miss
1903
+ ASSERT_EQ(2, get_perf_context()->bloom_memtable_miss_count);
1904
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_hit_count);
1905
+ }
1906
+
1907
+ TEST_F(DBBloomFilterTest, MemtableWholeKeyBloomFilterMultiGet) {
1908
+ Options options = CurrentOptions();
1909
+ options.memtable_prefix_bloom_size_ratio = 0.015;
1910
+ options.memtable_whole_key_filtering = true;
1911
+ Reopen(options);
1912
+ std::string key1("AA");
1913
+ std::string key2("BB");
1914
+ std::string key3("CC");
1915
+ std::string key4("DD");
1916
+ std::string key_not("EE");
1917
+ std::string value1("Value1");
1918
+ std::string value2("Value2");
1919
+ std::string value3("Value3");
1920
+ std::string value4("Value4");
1921
+
1922
+ ASSERT_OK(Put(key1, value1, WriteOptions()));
1923
+ ASSERT_OK(Put(key2, value2, WriteOptions()));
1924
+ ASSERT_OK(Flush());
1925
+ ASSERT_OK(Put(key3, value3, WriteOptions()));
1926
+ const Snapshot* snapshot = db_->GetSnapshot();
1927
+ ASSERT_OK(Put(key4, value4, WriteOptions()));
1928
+
1929
+ // Delete key2 and key3
1930
+ ASSERT_OK(
1931
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "BA", "CZ"));
1932
+
1933
+ // Read without snapshot
1934
+ auto results = MultiGet({key_not, key1, key2, key3, key4});
1935
+ ASSERT_EQ(results[0], "NOT_FOUND");
1936
+ ASSERT_EQ(results[1], value1);
1937
+ ASSERT_EQ(results[2], "NOT_FOUND");
1938
+ ASSERT_EQ(results[3], "NOT_FOUND");
1939
+ ASSERT_EQ(results[4], value4);
1940
+
1941
+ // Also check Get
1942
+ ASSERT_EQ(Get(key1), value1);
1943
+ ASSERT_EQ(Get(key2), "NOT_FOUND");
1944
+ ASSERT_EQ(Get(key3), "NOT_FOUND");
1945
+ ASSERT_EQ(Get(key4), value4);
1946
+
1947
+ // Read with snapshot
1948
+ results = MultiGet({key_not, key1, key2, key3, key4}, snapshot);
1949
+ ASSERT_EQ(results[0], "NOT_FOUND");
1950
+ ASSERT_EQ(results[1], value1);
1951
+ ASSERT_EQ(results[2], value2);
1952
+ ASSERT_EQ(results[3], value3);
1953
+ ASSERT_EQ(results[4], "NOT_FOUND");
1954
+
1955
+ // Also check Get
1956
+ ASSERT_EQ(Get(key1, snapshot), value1);
1957
+ ASSERT_EQ(Get(key2, snapshot), value2);
1958
+ ASSERT_EQ(Get(key3, snapshot), value3);
1959
+ ASSERT_EQ(Get(key4, snapshot), "NOT_FOUND");
1960
+
1961
+ db_->ReleaseSnapshot(snapshot);
1962
+ }
1963
+
1964
+ TEST_F(DBBloomFilterTest, MemtablePrefixBloomOutOfDomain) {
1965
+ constexpr size_t kPrefixSize = 8;
1966
+ const std::string kKey = "key";
1967
+ assert(kKey.size() < kPrefixSize);
1968
+ Options options = CurrentOptions();
1969
+ options.prefix_extractor.reset(NewFixedPrefixTransform(kPrefixSize));
1970
+ options.memtable_prefix_bloom_size_ratio = 0.25;
1971
+ Reopen(options);
1972
+ ASSERT_OK(Put(kKey, "v"));
1973
+ ASSERT_EQ("v", Get(kKey));
1974
+ std::unique_ptr<Iterator> iter(dbfull()->NewIterator(ReadOptions()));
1975
+ iter->Seek(kKey);
1976
+ ASSERT_TRUE(iter->Valid());
1977
+ ASSERT_EQ(kKey, iter->key());
1978
+ iter->SeekForPrev(kKey);
1979
+ ASSERT_TRUE(iter->Valid());
1980
+ ASSERT_EQ(kKey, iter->key());
1981
+ }
1982
+
1983
+ class DBBloomFilterTestVaryPrefixAndFormatVer
1984
+ : public DBTestBase,
1985
+ public testing::WithParamInterface<std::tuple<bool, uint32_t>> {
1986
+ protected:
1987
+ bool use_prefix_;
1988
+ uint32_t format_version_;
1989
+
1990
+ public:
1991
+ DBBloomFilterTestVaryPrefixAndFormatVer()
1992
+ : DBTestBase("db_bloom_filter_tests", /*env_do_fsync=*/true) {}
1993
+
1994
+ ~DBBloomFilterTestVaryPrefixAndFormatVer() override {}
1995
+
1996
+ void SetUp() override {
1997
+ use_prefix_ = std::get<0>(GetParam());
1998
+ format_version_ = std::get<1>(GetParam());
1999
+ }
2000
+
2001
+ static std::string UKey(uint32_t i) { return Key(static_cast<int>(i)); }
2002
+ };
2003
+
2004
+ TEST_P(DBBloomFilterTestVaryPrefixAndFormatVer, PartitionedMultiGet) {
2005
+ Options options = CurrentOptions();
2006
+ if (use_prefix_) {
2007
+ // Entire key from UKey()
2008
+ options.prefix_extractor.reset(NewCappedPrefixTransform(9));
2009
+ }
2010
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2011
+ BlockBasedTableOptions bbto;
2012
+ bbto.filter_policy.reset(NewBloomFilterPolicy(20));
2013
+ bbto.partition_filters = true;
2014
+ bbto.index_type = BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
2015
+ bbto.whole_key_filtering = !use_prefix_;
2016
+ if (use_prefix_) { // (not related to prefix, just alternating between)
2017
+ // Make sure code appropriately deals with metadata block size setting
2018
+ // that is "too small" (smaller than minimum size for filter builder)
2019
+ bbto.metadata_block_size = 63;
2020
+ } else {
2021
+ // Make sure the test will work even on platforms with large minimum
2022
+ // filter size, due to large cache line size.
2023
+ // (Largest cache line size + 10+% overhead.)
2024
+ bbto.metadata_block_size = 290;
2025
+ }
2026
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2027
+ DestroyAndReopen(options);
2028
+ ReadOptions ropts;
2029
+
2030
+ constexpr uint32_t N = 12000;
2031
+ // Add N/2 evens
2032
+ for (uint32_t i = 0; i < N; i += 2) {
2033
+ ASSERT_OK(Put(UKey(i), UKey(i)));
2034
+ }
2035
+ ASSERT_OK(Flush());
2036
+ ASSERT_EQ(TotalTableFiles(), 1);
2037
+
2038
+ constexpr uint32_t Q = 29;
2039
+ // MultiGet In
2040
+ std::array<std::string, Q> keys;
2041
+ std::array<Slice, Q> key_slices;
2042
+ std::array<ColumnFamilyHandle*, Q> column_families;
2043
+ // MultiGet Out
2044
+ std::array<Status, Q> statuses;
2045
+ std::array<PinnableSlice, Q> values;
2046
+
2047
+ PopTicker(options, BLOCK_CACHE_FILTER_HIT);
2048
+ PopTicker(options, BLOCK_CACHE_FILTER_MISS);
2049
+ PopTicker(options, BLOOM_FILTER_PREFIX_USEFUL);
2050
+ PopTicker(options, BLOOM_FILTER_USEFUL);
2051
+ PopTicker(options, BLOOM_FILTER_PREFIX_CHECKED);
2052
+ PopTicker(options, BLOOM_FILTER_FULL_POSITIVE);
2053
+ PopTicker(options, BLOOM_FILTER_FULL_TRUE_POSITIVE);
2054
+ PopTicker(options, BLOOM_FILTER_PREFIX_TRUE_POSITIVE);
2055
+
2056
+ // Check that initial clump of keys only loads one partition filter from
2057
+ // block cache.
2058
+ // And that spread out keys load many partition filters.
2059
+ // In both cases, mix present vs. not present keys.
2060
+ for (uint32_t stride : {uint32_t{1}, (N / Q) | 1}) {
2061
+ for (uint32_t i = 0; i < Q; ++i) {
2062
+ keys[i] = UKey(i * stride);
2063
+ key_slices[i] = Slice(keys[i]);
2064
+ column_families[i] = db_->DefaultColumnFamily();
2065
+ statuses[i] = Status();
2066
+ values[i] = PinnableSlice();
2067
+ }
2068
+
2069
+ db_->MultiGet(ropts, Q, &column_families[0], &key_slices[0], &values[0],
2070
+ /*timestamps=*/nullptr, &statuses[0], true);
2071
+
2072
+ // Confirm correct status results
2073
+ uint32_t number_not_found = 0;
2074
+ for (uint32_t i = 0; i < Q; ++i) {
2075
+ if ((i * stride % 2) == 0) {
2076
+ ASSERT_OK(statuses[i]);
2077
+ } else {
2078
+ ASSERT_TRUE(statuses[i].IsNotFound());
2079
+ ++number_not_found;
2080
+ }
2081
+ }
2082
+
2083
+ // Confirm correct Bloom stats (no FPs)
2084
+ uint64_t filter_useful =
2085
+ PopTicker(options, use_prefix_ ? BLOOM_FILTER_PREFIX_USEFUL
2086
+ : BLOOM_FILTER_USEFUL);
2087
+ uint64_t filter_checked =
2088
+ PopTicker(options, use_prefix_ ? BLOOM_FILTER_PREFIX_CHECKED
2089
+ : BLOOM_FILTER_FULL_POSITIVE) +
2090
+ (use_prefix_ ? 0 : filter_useful);
2091
+ EXPECT_EQ(filter_useful, number_not_found);
2092
+ EXPECT_EQ(filter_checked, Q);
2093
+ EXPECT_EQ(PopTicker(options, use_prefix_ ? BLOOM_FILTER_PREFIX_TRUE_POSITIVE
2094
+ : BLOOM_FILTER_FULL_TRUE_POSITIVE),
2095
+ Q - number_not_found);
2096
+
2097
+ // Confirm no duplicate loading same filter partition
2098
+ uint64_t filter_accesses = PopTicker(options, BLOCK_CACHE_FILTER_HIT) +
2099
+ PopTicker(options, BLOCK_CACHE_FILTER_MISS);
2100
+ if (stride == 1) {
2101
+ EXPECT_EQ(filter_accesses, 1);
2102
+ } else {
2103
+ // for large stride
2104
+ EXPECT_GE(filter_accesses, Q / 2 + 1);
2105
+ }
2106
+ }
2107
+
2108
+ // Check that a clump of keys (present and not) works when spanning
2109
+ // two partitions
2110
+ int found_spanning = 0;
2111
+ for (uint32_t start = 0; start < N / 2;) {
2112
+ for (uint32_t i = 0; i < Q; ++i) {
2113
+ keys[i] = UKey(start + i);
2114
+ key_slices[i] = Slice(keys[i]);
2115
+ column_families[i] = db_->DefaultColumnFamily();
2116
+ statuses[i] = Status();
2117
+ values[i] = PinnableSlice();
2118
+ }
2119
+
2120
+ db_->MultiGet(ropts, Q, &column_families[0], &key_slices[0], &values[0],
2121
+ /*timestamps=*/nullptr, &statuses[0], true);
2122
+
2123
+ // Confirm correct status results
2124
+ uint32_t number_not_found = 0;
2125
+ for (uint32_t i = 0; i < Q; ++i) {
2126
+ if (((start + i) % 2) == 0) {
2127
+ ASSERT_OK(statuses[i]);
2128
+ } else {
2129
+ ASSERT_TRUE(statuses[i].IsNotFound());
2130
+ ++number_not_found;
2131
+ }
2132
+ }
2133
+
2134
+ // Confirm correct Bloom stats (might see some FPs)
2135
+ uint64_t filter_useful =
2136
+ PopTicker(options, use_prefix_ ? BLOOM_FILTER_PREFIX_USEFUL
2137
+ : BLOOM_FILTER_USEFUL);
2138
+ uint64_t filter_checked =
2139
+ PopTicker(options, use_prefix_ ? BLOOM_FILTER_PREFIX_CHECKED
2140
+ : BLOOM_FILTER_FULL_POSITIVE) +
2141
+ (use_prefix_ ? 0 : filter_useful);
2142
+ EXPECT_GE(filter_useful, number_not_found - 2); // possible FP
2143
+ EXPECT_EQ(filter_checked, Q);
2144
+ EXPECT_EQ(PopTicker(options, use_prefix_ ? BLOOM_FILTER_PREFIX_TRUE_POSITIVE
2145
+ : BLOOM_FILTER_FULL_TRUE_POSITIVE),
2146
+ Q - number_not_found);
2147
+
2148
+ // Confirm no duplicate loading of same filter partition
2149
+ uint64_t filter_accesses = PopTicker(options, BLOCK_CACHE_FILTER_HIT) +
2150
+ PopTicker(options, BLOCK_CACHE_FILTER_MISS);
2151
+ if (filter_accesses == 2) {
2152
+ // Spanned across partitions.
2153
+ ++found_spanning;
2154
+ if (found_spanning >= 2) {
2155
+ break;
2156
+ } else {
2157
+ // Ensure that at least once we have at least one present and
2158
+ // one non-present key on both sides of partition boundary.
2159
+ start += 2;
2160
+ }
2161
+ } else {
2162
+ EXPECT_EQ(filter_accesses, 1);
2163
+ // See explanation at "start += 2"
2164
+ start += Q - 4;
2165
+ }
2166
+ }
2167
+ EXPECT_TRUE(found_spanning >= 2);
2168
+ }
2169
+
2170
+ INSTANTIATE_TEST_CASE_P(DBBloomFilterTestVaryPrefixAndFormatVer,
2171
+ DBBloomFilterTestVaryPrefixAndFormatVer,
2172
+ ::testing::Values(
2173
+ // (use_prefix, format_version)
2174
+ std::make_tuple(false, 2),
2175
+ std::make_tuple(false, 3),
2176
+ std::make_tuple(false, 4),
2177
+ std::make_tuple(false, 5), std::make_tuple(true, 2),
2178
+ std::make_tuple(true, 3), std::make_tuple(true, 4),
2179
+ std::make_tuple(true, 5)));
2180
+
2181
+ namespace {
2182
+ static const std::string kPlainTable = "test_PlainTableBloom";
2183
+ } // anonymous namespace
2184
+
2185
+ class BloomStatsTestWithParam
2186
+ : public DBBloomFilterTest,
2187
+ public testing::WithParamInterface<std::tuple<std::string, bool>> {
2188
+ public:
2189
+ BloomStatsTestWithParam() {
2190
+ bfp_impl_ = std::get<0>(GetParam());
2191
+ partition_filters_ = std::get<1>(GetParam());
2192
+
2193
+ options_.create_if_missing = true;
2194
+ options_.prefix_extractor.reset(
2195
+ ROCKSDB_NAMESPACE::NewFixedPrefixTransform(4));
2196
+ options_.memtable_prefix_bloom_size_ratio =
2197
+ 8.0 * 1024.0 / static_cast<double>(options_.write_buffer_size);
2198
+ if (bfp_impl_ == kPlainTable) {
2199
+ assert(!partition_filters_); // not supported in plain table
2200
+ PlainTableOptions table_options;
2201
+ options_.table_factory.reset(NewPlainTableFactory(table_options));
2202
+ } else {
2203
+ BlockBasedTableOptions table_options;
2204
+ if (partition_filters_) {
2205
+ table_options.partition_filters = partition_filters_;
2206
+ table_options.index_type =
2207
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
2208
+ }
2209
+ table_options.filter_policy = Create(10, bfp_impl_);
2210
+ options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
2211
+ }
2212
+ options_.env = env_;
2213
+
2214
+ get_perf_context()->Reset();
2215
+ DestroyAndReopen(options_);
2216
+ }
2217
+
2218
+ ~BloomStatsTestWithParam() override {
2219
+ get_perf_context()->Reset();
2220
+ Destroy(options_);
2221
+ }
2222
+
2223
+ // Required if inheriting from testing::WithParamInterface<>
2224
+ static void SetUpTestCase() {}
2225
+ static void TearDownTestCase() {}
2226
+
2227
+ std::string bfp_impl_;
2228
+ bool partition_filters_;
2229
+ Options options_;
2230
+ };
2231
+
2232
+ // 1 Insert 2 K-V pairs into DB
2233
+ // 2 Call Get() for both keys - expext memtable bloom hit stat to be 2
2234
+ // 3 Call Get() for nonexisting key - expect memtable bloom miss stat to be 1
2235
+ // 4 Call Flush() to create SST
2236
+ // 5 Call Get() for both keys - expext SST bloom hit stat to be 2
2237
+ // 6 Call Get() for nonexisting key - expect SST bloom miss stat to be 1
2238
+ // Test both: block and plain SST
2239
+ TEST_P(BloomStatsTestWithParam, BloomStatsTest) {
2240
+ std::string key1("AAAA");
2241
+ std::string key2("RXDB"); // not in DB
2242
+ std::string key3("ZBRA");
2243
+ std::string value1("Value1");
2244
+ std::string value3("Value3");
2245
+
2246
+ ASSERT_OK(Put(key1, value1, WriteOptions()));
2247
+ ASSERT_OK(Put(key3, value3, WriteOptions()));
2248
+
2249
+ // check memtable bloom stats
2250
+ ASSERT_EQ(value1, Get(key1));
2251
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_hit_count);
2252
+ ASSERT_EQ(value3, Get(key3));
2253
+ ASSERT_EQ(2, get_perf_context()->bloom_memtable_hit_count);
2254
+ ASSERT_EQ(0, get_perf_context()->bloom_memtable_miss_count);
2255
+
2256
+ ASSERT_EQ("NOT_FOUND", Get(key2));
2257
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_miss_count);
2258
+ ASSERT_EQ(2, get_perf_context()->bloom_memtable_hit_count);
2259
+
2260
+ // sanity checks
2261
+ ASSERT_EQ(0, get_perf_context()->bloom_sst_hit_count);
2262
+ ASSERT_EQ(0, get_perf_context()->bloom_sst_miss_count);
2263
+
2264
+ Flush();
2265
+
2266
+ // sanity checks
2267
+ ASSERT_EQ(0, get_perf_context()->bloom_sst_hit_count);
2268
+ ASSERT_EQ(0, get_perf_context()->bloom_sst_miss_count);
2269
+
2270
+ // check SST bloom stats
2271
+ ASSERT_EQ(value1, Get(key1));
2272
+ ASSERT_EQ(1, get_perf_context()->bloom_sst_hit_count);
2273
+ ASSERT_EQ(value3, Get(key3));
2274
+ ASSERT_EQ(2, get_perf_context()->bloom_sst_hit_count);
2275
+
2276
+ ASSERT_EQ("NOT_FOUND", Get(key2));
2277
+ ASSERT_EQ(1, get_perf_context()->bloom_sst_miss_count);
2278
+ }
2279
+
2280
+ // Same scenario as in BloomStatsTest but using an iterator
2281
+ TEST_P(BloomStatsTestWithParam, BloomStatsTestWithIter) {
2282
+ std::string key1("AAAA");
2283
+ std::string key2("RXDB"); // not in DB
2284
+ std::string key3("ZBRA");
2285
+ std::string value1("Value1");
2286
+ std::string value3("Value3");
2287
+
2288
+ ASSERT_OK(Put(key1, value1, WriteOptions()));
2289
+ ASSERT_OK(Put(key3, value3, WriteOptions()));
2290
+
2291
+ std::unique_ptr<Iterator> iter(dbfull()->NewIterator(ReadOptions()));
2292
+
2293
+ // check memtable bloom stats
2294
+ iter->Seek(key1);
2295
+ ASSERT_OK(iter->status());
2296
+ ASSERT_TRUE(iter->Valid());
2297
+ ASSERT_EQ(value1, iter->value().ToString());
2298
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_hit_count);
2299
+ ASSERT_EQ(0, get_perf_context()->bloom_memtable_miss_count);
2300
+
2301
+ iter->Seek(key3);
2302
+ ASSERT_OK(iter->status());
2303
+ ASSERT_TRUE(iter->Valid());
2304
+ ASSERT_EQ(value3, iter->value().ToString());
2305
+ ASSERT_EQ(2, get_perf_context()->bloom_memtable_hit_count);
2306
+ ASSERT_EQ(0, get_perf_context()->bloom_memtable_miss_count);
2307
+
2308
+ iter->Seek(key2);
2309
+ ASSERT_OK(iter->status());
2310
+ ASSERT_TRUE(!iter->Valid());
2311
+ ASSERT_EQ(1, get_perf_context()->bloom_memtable_miss_count);
2312
+ ASSERT_EQ(2, get_perf_context()->bloom_memtable_hit_count);
2313
+
2314
+ Flush();
2315
+
2316
+ iter.reset(dbfull()->NewIterator(ReadOptions()));
2317
+
2318
+ // Check SST bloom stats
2319
+ iter->Seek(key1);
2320
+ ASSERT_OK(iter->status());
2321
+ ASSERT_TRUE(iter->Valid());
2322
+ ASSERT_EQ(value1, iter->value().ToString());
2323
+ ASSERT_EQ(1, get_perf_context()->bloom_sst_hit_count);
2324
+
2325
+ iter->Seek(key3);
2326
+ ASSERT_OK(iter->status());
2327
+ ASSERT_TRUE(iter->Valid());
2328
+ ASSERT_EQ(value3, iter->value().ToString());
2329
+ uint64_t expected_hits = 2;
2330
+ ASSERT_EQ(expected_hits, get_perf_context()->bloom_sst_hit_count);
2331
+
2332
+ iter->Seek(key2);
2333
+ ASSERT_OK(iter->status());
2334
+ ASSERT_TRUE(!iter->Valid());
2335
+ ASSERT_EQ(1, get_perf_context()->bloom_sst_miss_count);
2336
+ ASSERT_EQ(expected_hits, get_perf_context()->bloom_sst_hit_count);
2337
+ }
2338
+
2339
+ INSTANTIATE_TEST_CASE_P(
2340
+ BloomStatsTestWithParam, BloomStatsTestWithParam,
2341
+ ::testing::Values(std::make_tuple(kLegacyBloom, false),
2342
+ std::make_tuple(kLegacyBloom, true),
2343
+ std::make_tuple(kFastLocalBloom, false),
2344
+ std::make_tuple(kFastLocalBloom, true),
2345
+ std::make_tuple(kPlainTable, false)));
2346
+
2347
+ namespace {
2348
+ void PrefixScanInit(DBBloomFilterTest* dbtest) {
2349
+ char buf[100];
2350
+ std::string keystr;
2351
+ const int small_range_sstfiles = 5;
2352
+ const int big_range_sstfiles = 5;
2353
+
2354
+ // Generate 11 sst files with the following prefix ranges.
2355
+ // GROUP 0: [0,10] (level 1)
2356
+ // GROUP 1: [1,2], [2,3], [3,4], [4,5], [5, 6] (level 0)
2357
+ // GROUP 2: [0,6], [0,7], [0,8], [0,9], [0,10] (level 0)
2358
+ //
2359
+ // A seek with the previous API would do 11 random I/Os (to all the
2360
+ // files). With the new API and a prefix filter enabled, we should
2361
+ // only do 2 random I/O, to the 2 files containing the key.
2362
+
2363
+ // GROUP 0
2364
+ snprintf(buf, sizeof(buf), "%02d______:start", 0);
2365
+ keystr = std::string(buf);
2366
+ ASSERT_OK(dbtest->Put(keystr, keystr));
2367
+ snprintf(buf, sizeof(buf), "%02d______:end", 10);
2368
+ keystr = std::string(buf);
2369
+ ASSERT_OK(dbtest->Put(keystr, keystr));
2370
+ ASSERT_OK(dbtest->Flush());
2371
+ ASSERT_OK(dbtest->dbfull()->CompactRange(CompactRangeOptions(), nullptr,
2372
+ nullptr)); // move to level 1
2373
+
2374
+ // GROUP 1
2375
+ for (int i = 1; i <= small_range_sstfiles; i++) {
2376
+ snprintf(buf, sizeof(buf), "%02d______:start", i);
2377
+ keystr = std::string(buf);
2378
+ ASSERT_OK(dbtest->Put(keystr, keystr));
2379
+ snprintf(buf, sizeof(buf), "%02d______:end", i + 1);
2380
+ keystr = std::string(buf);
2381
+ ASSERT_OK(dbtest->Put(keystr, keystr));
2382
+ dbtest->Flush();
2383
+ }
2384
+
2385
+ // GROUP 2
2386
+ for (int i = 1; i <= big_range_sstfiles; i++) {
2387
+ snprintf(buf, sizeof(buf), "%02d______:start", 0);
2388
+ keystr = std::string(buf);
2389
+ ASSERT_OK(dbtest->Put(keystr, keystr));
2390
+ snprintf(buf, sizeof(buf), "%02d______:end", small_range_sstfiles + i + 1);
2391
+ keystr = std::string(buf);
2392
+ ASSERT_OK(dbtest->Put(keystr, keystr));
2393
+ dbtest->Flush();
2394
+ }
2395
+ }
2396
+ } // anonymous namespace
2397
+
2398
+ TEST_F(DBBloomFilterTest, PrefixScan) {
2399
+ while (ChangeFilterOptions()) {
2400
+ int count;
2401
+ Slice prefix;
2402
+ Slice key;
2403
+ char buf[100];
2404
+ Iterator* iter;
2405
+ snprintf(buf, sizeof(buf), "03______:");
2406
+ prefix = Slice(buf, 8);
2407
+ key = Slice(buf, 9);
2408
+ ASSERT_EQ(key.difference_offset(prefix), 8);
2409
+ ASSERT_EQ(prefix.difference_offset(key), 8);
2410
+ // db configs
2411
+ env_->count_random_reads_ = true;
2412
+ Options options = CurrentOptions();
2413
+ options.env = env_;
2414
+ options.prefix_extractor.reset(NewFixedPrefixTransform(8));
2415
+ options.disable_auto_compactions = true;
2416
+ options.max_background_compactions = 2;
2417
+ options.create_if_missing = true;
2418
+ options.memtable_factory.reset(NewHashSkipListRepFactory(16));
2419
+ assert(!options.unordered_write);
2420
+ // It is incompatible with allow_concurrent_memtable_write=false
2421
+ options.allow_concurrent_memtable_write = false;
2422
+
2423
+ BlockBasedTableOptions table_options;
2424
+ table_options.no_block_cache = true;
2425
+ table_options.filter_policy.reset(NewBloomFilterPolicy(10));
2426
+ table_options.whole_key_filtering = false;
2427
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2428
+
2429
+ // 11 RAND I/Os
2430
+ DestroyAndReopen(options);
2431
+ PrefixScanInit(this);
2432
+ count = 0;
2433
+ env_->random_read_counter_.Reset();
2434
+ iter = db_->NewIterator(ReadOptions());
2435
+ for (iter->Seek(prefix); iter->Valid(); iter->Next()) {
2436
+ if (!iter->key().starts_with(prefix)) {
2437
+ break;
2438
+ }
2439
+ count++;
2440
+ }
2441
+ ASSERT_OK(iter->status());
2442
+ delete iter;
2443
+ ASSERT_EQ(count, 2);
2444
+ ASSERT_EQ(env_->random_read_counter_.Read(), 2);
2445
+ Close();
2446
+ } // end of while
2447
+ }
2448
+
2449
+ TEST_F(DBBloomFilterTest, OptimizeFiltersForHits) {
2450
+ const int kNumKeysPerFlush = 1000;
2451
+
2452
+ Options options = CurrentOptions();
2453
+ options.memtable_factory.reset(
2454
+ test::NewSpecialSkipListFactory(kNumKeysPerFlush));
2455
+ options.target_file_size_base = 64 * 1024;
2456
+ options.level0_file_num_compaction_trigger = 2;
2457
+ options.level0_slowdown_writes_trigger = 2;
2458
+ options.level0_stop_writes_trigger = 4;
2459
+ options.max_bytes_for_level_base = 256 * 1024;
2460
+ options.max_write_buffer_number = 2;
2461
+ options.max_background_compactions = 8;
2462
+ options.max_background_flushes = 8;
2463
+ options.compression = kNoCompression;
2464
+ options.compaction_style = kCompactionStyleLevel;
2465
+ options.level_compaction_dynamic_level_bytes = true;
2466
+ BlockBasedTableOptions bbto;
2467
+ bbto.cache_index_and_filter_blocks = true;
2468
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10));
2469
+ bbto.whole_key_filtering = true;
2470
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2471
+ options.optimize_filters_for_hits = true;
2472
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2473
+ get_perf_context()->Reset();
2474
+ get_perf_context()->EnablePerLevelPerfContext();
2475
+ CreateAndReopenWithCF({"mypikachu"}, options);
2476
+
2477
+ int numkeys = 200000;
2478
+
2479
+ // Generate randomly shuffled keys, so the updates are almost
2480
+ // random.
2481
+ std::vector<int> keys;
2482
+ keys.reserve(numkeys);
2483
+ for (int i = 0; i < numkeys; i += 2) {
2484
+ keys.push_back(i);
2485
+ }
2486
+ RandomShuffle(std::begin(keys), std::end(keys), /*seed*/ 42);
2487
+ int num_inserted = 0;
2488
+ for (int key : keys) {
2489
+ ASSERT_OK(Put(1, Key(key), "val"));
2490
+ num_inserted++;
2491
+ // The write after each `kNumKeysPerFlush` keys triggers a flush. Always
2492
+ // wait for that flush and any follow-on compactions for deterministic LSM
2493
+ // shape.
2494
+ if (num_inserted > kNumKeysPerFlush &&
2495
+ num_inserted % kNumKeysPerFlush == 1) {
2496
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable(handles_[1]));
2497
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
2498
+ }
2499
+ }
2500
+ ASSERT_OK(Put(1, Key(0), "val"));
2501
+ ASSERT_OK(Put(1, Key(numkeys), "val"));
2502
+ ASSERT_OK(Flush(1));
2503
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
2504
+
2505
+ if (NumTableFilesAtLevel(0, 1) == 0) {
2506
+ // No Level 0 file. Create one.
2507
+ ASSERT_OK(Put(1, Key(0), "val"));
2508
+ ASSERT_OK(Put(1, Key(numkeys), "val"));
2509
+ ASSERT_OK(Flush(1));
2510
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
2511
+ }
2512
+
2513
+ for (int i = 1; i < numkeys; i += 2) {
2514
+ ASSERT_EQ(Get(1, Key(i)), "NOT_FOUND");
2515
+ }
2516
+
2517
+ ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L0));
2518
+ ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L1));
2519
+ ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L2_AND_UP));
2520
+
2521
+ // Now we have three sorted run, L0, L5 and L6 with most files in L6 have
2522
+ // no bloom filter. Most keys be checked bloom filters twice.
2523
+ ASSERT_GT(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 65000 * 2);
2524
+ ASSERT_LT(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 120000 * 2);
2525
+ uint64_t bloom_filter_useful_all_levels = 0;
2526
+ for (auto& kv : (*(get_perf_context()->level_to_perf_context))) {
2527
+ if (kv.second.bloom_filter_useful > 0) {
2528
+ bloom_filter_useful_all_levels += kv.second.bloom_filter_useful;
2529
+ }
2530
+ }
2531
+ ASSERT_GT(bloom_filter_useful_all_levels, 65000 * 2);
2532
+ ASSERT_LT(bloom_filter_useful_all_levels, 120000 * 2);
2533
+
2534
+ for (int i = 0; i < numkeys; i += 2) {
2535
+ ASSERT_EQ(Get(1, Key(i)), "val");
2536
+ }
2537
+
2538
+ // Part 2 (read path): rewrite last level with blooms, then verify they get
2539
+ // cached only if !optimize_filters_for_hits
2540
+ options.disable_auto_compactions = true;
2541
+ options.num_levels = 9;
2542
+ options.optimize_filters_for_hits = false;
2543
+ options.statistics = CreateDBStatistics();
2544
+ bbto.block_cache.reset();
2545
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2546
+
2547
+ ReopenWithColumnFamilies({"default", "mypikachu"}, options);
2548
+ MoveFilesToLevel(7 /* level */, 1 /* column family index */);
2549
+
2550
+ std::string value = Get(1, Key(0));
2551
+ uint64_t prev_cache_filter_hits =
2552
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT);
2553
+ value = Get(1, Key(0));
2554
+ ASSERT_EQ(prev_cache_filter_hits + 1,
2555
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT));
2556
+
2557
+ // Now that we know the filter blocks exist in the last level files, see if
2558
+ // filter caching is skipped for this optimization
2559
+ options.optimize_filters_for_hits = true;
2560
+ options.statistics = CreateDBStatistics();
2561
+ bbto.block_cache.reset();
2562
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2563
+
2564
+ ReopenWithColumnFamilies({"default", "mypikachu"}, options);
2565
+
2566
+ value = Get(1, Key(0));
2567
+ ASSERT_EQ(0, TestGetTickerCount(options, BLOCK_CACHE_FILTER_MISS));
2568
+ ASSERT_EQ(0, TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT));
2569
+ ASSERT_EQ(2 /* index and data block */,
2570
+ TestGetTickerCount(options, BLOCK_CACHE_ADD));
2571
+
2572
+ // Check filter block ignored for files preloaded during DB::Open()
2573
+ options.max_open_files = -1;
2574
+ options.statistics = CreateDBStatistics();
2575
+ bbto.block_cache.reset();
2576
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2577
+
2578
+ ReopenWithColumnFamilies({"default", "mypikachu"}, options);
2579
+
2580
+ uint64_t prev_cache_filter_misses =
2581
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_MISS);
2582
+ prev_cache_filter_hits = TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT);
2583
+ Get(1, Key(0));
2584
+ ASSERT_EQ(prev_cache_filter_misses,
2585
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_MISS));
2586
+ ASSERT_EQ(prev_cache_filter_hits,
2587
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT));
2588
+
2589
+ // Check filter block ignored for file trivially-moved to bottom level
2590
+ bbto.block_cache.reset();
2591
+ options.max_open_files = 100; // setting > -1 makes it not preload all files
2592
+ options.statistics = CreateDBStatistics();
2593
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2594
+
2595
+ ReopenWithColumnFamilies({"default", "mypikachu"}, options);
2596
+
2597
+ ASSERT_OK(Put(1, Key(numkeys + 1), "val"));
2598
+ ASSERT_OK(Flush(1));
2599
+
2600
+ int32_t trivial_move = 0;
2601
+ int32_t non_trivial_move = 0;
2602
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2603
+ "DBImpl::BackgroundCompaction:TrivialMove",
2604
+ [&](void* /*arg*/) { trivial_move++; });
2605
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2606
+ "DBImpl::BackgroundCompaction:NonTrivial",
2607
+ [&](void* /*arg*/) { non_trivial_move++; });
2608
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2609
+
2610
+ CompactRangeOptions compact_options;
2611
+ compact_options.bottommost_level_compaction =
2612
+ BottommostLevelCompaction::kSkip;
2613
+ compact_options.change_level = true;
2614
+ compact_options.target_level = 7;
2615
+ ASSERT_OK(db_->CompactRange(compact_options, handles_[1], nullptr, nullptr));
2616
+
2617
+ ASSERT_EQ(trivial_move, 1);
2618
+ ASSERT_EQ(non_trivial_move, 0);
2619
+
2620
+ prev_cache_filter_hits = TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT);
2621
+ prev_cache_filter_misses =
2622
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_MISS);
2623
+ value = Get(1, Key(numkeys + 1));
2624
+ ASSERT_EQ(prev_cache_filter_hits,
2625
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT));
2626
+ ASSERT_EQ(prev_cache_filter_misses,
2627
+ TestGetTickerCount(options, BLOCK_CACHE_FILTER_MISS));
2628
+
2629
+ // Check filter block not cached for iterator
2630
+ bbto.block_cache.reset();
2631
+ options.statistics = CreateDBStatistics();
2632
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2633
+
2634
+ ReopenWithColumnFamilies({"default", "mypikachu"}, options);
2635
+
2636
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions(), handles_[1]));
2637
+ iter->SeekToFirst();
2638
+ ASSERT_EQ(0, TestGetTickerCount(options, BLOCK_CACHE_FILTER_MISS));
2639
+ ASSERT_EQ(0, TestGetTickerCount(options, BLOCK_CACHE_FILTER_HIT));
2640
+ ASSERT_EQ(2 /* index and data block */,
2641
+ TestGetTickerCount(options, BLOCK_CACHE_ADD));
2642
+ get_perf_context()->Reset();
2643
+ }
2644
+
2645
+ int CountIter(std::unique_ptr<Iterator>& iter, const Slice& key) {
2646
+ int count = 0;
2647
+ for (iter->Seek(key); iter->Valid(); iter->Next()) {
2648
+ count++;
2649
+ // Access key & value as if we were using them
2650
+ (void)iter->key();
2651
+ (void)iter->value();
2652
+ }
2653
+ EXPECT_OK(iter->status());
2654
+ return count;
2655
+ }
2656
+
2657
+ // use iterate_upper_bound to hint compatiability of existing bloom filters.
2658
+ // The BF is considered compatible if 1) upper bound and seek key transform
2659
+ // into the same string, or 2) the transformed seek key is of the same length
2660
+ // as the upper bound and two keys are adjacent according to the comparator.
2661
+ TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
2662
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
2663
+ Options options;
2664
+ options.create_if_missing = true;
2665
+ options.env = CurrentOptions().env;
2666
+ options.prefix_extractor.reset(NewCappedPrefixTransform(4));
2667
+ options.disable_auto_compactions = true;
2668
+ options.statistics = CreateDBStatistics();
2669
+ // Enable prefix bloom for SST files
2670
+ BlockBasedTableOptions table_options;
2671
+ table_options.cache_index_and_filter_blocks = true;
2672
+ table_options.filter_policy = Create(10, bfp_impl);
2673
+ table_options.index_shortening = BlockBasedTableOptions::
2674
+ IndexShorteningMode::kShortenSeparatorsAndSuccessor;
2675
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2676
+ DestroyAndReopen(options);
2677
+
2678
+ ASSERT_OK(Put("abcdxxx0", "val1"));
2679
+ ASSERT_OK(Put("abcdxxx1", "val2"));
2680
+ ASSERT_OK(Put("abcdxxx2", "val3"));
2681
+ ASSERT_OK(Put("abcdxxx3", "val4"));
2682
+ ASSERT_OK(dbfull()->Flush(FlushOptions()));
2683
+ {
2684
+ // prefix_extractor has not changed, BF will always be read
2685
+ Slice upper_bound("abce");
2686
+ ReadOptions read_options;
2687
+ read_options.prefix_same_as_start = true;
2688
+ read_options.iterate_upper_bound = &upper_bound;
2689
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2690
+ ASSERT_EQ(CountIter(iter, "abcd0000"), 4);
2691
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2692
+ 1);
2693
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2694
+ ASSERT_EQ(TestGetTickerCount(
2695
+ options, NON_LAST_LEVEL_SEEK_DATA_USEFUL_FILTER_MATCH),
2696
+ 1);
2697
+ }
2698
+ {
2699
+ Slice upper_bound("abcdzzzz");
2700
+ ReadOptions read_options;
2701
+ read_options.prefix_same_as_start = true;
2702
+ read_options.iterate_upper_bound = &upper_bound;
2703
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2704
+ ASSERT_EQ(CountIter(iter, "abcd0000"), 4);
2705
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2706
+ 2);
2707
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2708
+ }
2709
+ ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:5"}}));
2710
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2711
+ "rocksdb.FixedPrefix.5");
2712
+ {
2713
+ // BF changed, [abcdxx00, abce) is a valid bound, will trigger BF read
2714
+ Slice upper_bound("abce");
2715
+ ReadOptions read_options;
2716
+ read_options.prefix_same_as_start = true;
2717
+ read_options.iterate_upper_bound = &upper_bound;
2718
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2719
+ ASSERT_EQ(CountIter(iter, "abcdxx00"), 4);
2720
+ // should check bloom filter since upper bound meets requirement
2721
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2722
+ 3);
2723
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2724
+ }
2725
+ {
2726
+ // [abcdxx01, abcey) is not valid bound since upper bound is too long for
2727
+ // the BF in SST (capped:4)
2728
+ Slice upper_bound("abcey");
2729
+ ReadOptions read_options;
2730
+ read_options.prefix_same_as_start = true;
2731
+ read_options.iterate_upper_bound = &upper_bound;
2732
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2733
+ ASSERT_EQ(CountIter(iter, "abcdxx01"), 4);
2734
+ // should skip bloom filter since upper bound is too long
2735
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2736
+ 3);
2737
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2738
+ }
2739
+ {
2740
+ // [abcdxx02, abcdy) is a valid bound since the prefix is the same
2741
+ Slice upper_bound("abcdy");
2742
+ ReadOptions read_options;
2743
+ read_options.prefix_same_as_start = true;
2744
+ read_options.iterate_upper_bound = &upper_bound;
2745
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2746
+ ASSERT_EQ(CountIter(iter, "abcdxx02"), 4);
2747
+ // should check bloom filter since upper bound matches transformed seek
2748
+ // key
2749
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2750
+ 4);
2751
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2752
+ }
2753
+ {
2754
+ // [aaaaaaaa, abce) is not a valid bound since 1) they don't share the
2755
+ // same prefix, 2) the prefixes are not consecutive
2756
+ Slice upper_bound("abce");
2757
+ ReadOptions read_options;
2758
+ read_options.prefix_same_as_start = true;
2759
+ read_options.iterate_upper_bound = &upper_bound;
2760
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2761
+ ASSERT_EQ(CountIter(iter, "aaaaaaaa"), 0);
2762
+ // should skip bloom filter since mismatch is found
2763
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2764
+ 4);
2765
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2766
+ }
2767
+ ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:3"}}));
2768
+ {
2769
+ // [abc, abd) is not a valid bound since the upper bound is too short
2770
+ // for BF (capped:4)
2771
+ Slice upper_bound("abd");
2772
+ ReadOptions read_options;
2773
+ read_options.prefix_same_as_start = true;
2774
+ read_options.iterate_upper_bound = &upper_bound;
2775
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2776
+ ASSERT_EQ(CountIter(iter, "abc"), 4);
2777
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2778
+ 4);
2779
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2780
+ }
2781
+ // Same with re-open
2782
+ options.prefix_extractor.reset(NewFixedPrefixTransform(3));
2783
+ Reopen(options);
2784
+ {
2785
+ Slice upper_bound("abd");
2786
+ ReadOptions read_options;
2787
+ read_options.prefix_same_as_start = true;
2788
+ read_options.iterate_upper_bound = &upper_bound;
2789
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2790
+ ASSERT_EQ(CountIter(iter, "abc"), 4);
2791
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2792
+ 4);
2793
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2794
+ }
2795
+ // Set back to capped:4 and verify BF is always read
2796
+ options.prefix_extractor.reset(NewCappedPrefixTransform(4));
2797
+ Reopen(options);
2798
+ {
2799
+ Slice upper_bound("abd");
2800
+ ReadOptions read_options;
2801
+ read_options.prefix_same_as_start = true;
2802
+ read_options.iterate_upper_bound = &upper_bound;
2803
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2804
+ ASSERT_EQ(CountIter(iter, "abc"), 0);
2805
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2806
+ 4);
2807
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 1);
2808
+ }
2809
+ // Same if there's a problem initally loading prefix transform
2810
+ SyncPoint::GetInstance()->SetCallBack(
2811
+ "BlockBasedTable::Open::ForceNullTablePrefixExtractor",
2812
+ [&](void* arg) { *static_cast<bool*>(arg) = true; });
2813
+ SyncPoint::GetInstance()->EnableProcessing();
2814
+ Reopen(options);
2815
+ {
2816
+ Slice upper_bound("abd");
2817
+ ReadOptions read_options;
2818
+ read_options.prefix_same_as_start = true;
2819
+ read_options.iterate_upper_bound = &upper_bound;
2820
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2821
+ ASSERT_EQ(CountIter(iter, "abc"), 0);
2822
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH),
2823
+ 4);
2824
+ ASSERT_EQ(TestGetTickerCount(options, NON_LAST_LEVEL_SEEK_FILTERED), 2);
2825
+ }
2826
+ SyncPoint::GetInstance()->DisableProcessing();
2827
+ }
2828
+ }
2829
+
2830
+ // Create multiple SST files each with a different prefix_extractor config,
2831
+ // verify iterators can read all SST files using the latest config.
2832
+ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
2833
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
2834
+ Options options;
2835
+ options.env = CurrentOptions().env;
2836
+ options.create_if_missing = true;
2837
+ options.prefix_extractor.reset(NewFixedPrefixTransform(1));
2838
+ options.disable_auto_compactions = true;
2839
+ options.statistics = CreateDBStatistics();
2840
+ // Enable prefix bloom for SST files
2841
+ BlockBasedTableOptions table_options;
2842
+ table_options.filter_policy = Create(10, bfp_impl);
2843
+ table_options.cache_index_and_filter_blocks = true;
2844
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2845
+ DestroyAndReopen(options);
2846
+
2847
+ Slice upper_bound("foz90000");
2848
+ ReadOptions read_options;
2849
+ read_options.prefix_same_as_start = true;
2850
+
2851
+ // first SST with fixed:1 BF
2852
+ ASSERT_OK(Put("foo2", "bar2"));
2853
+ ASSERT_OK(Put("foo", "bar"));
2854
+ ASSERT_OK(Put("foq1", "bar1"));
2855
+ ASSERT_OK(Put("fpa", "0"));
2856
+ dbfull()->Flush(FlushOptions());
2857
+ std::unique_ptr<Iterator> iter_old(db_->NewIterator(read_options));
2858
+ ASSERT_EQ(CountIter(iter_old, "foo"), 4);
2859
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2860
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 1);
2861
+
2862
+ ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
2863
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2864
+ "rocksdb.CappedPrefix.3");
2865
+ read_options.iterate_upper_bound = &upper_bound;
2866
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
2867
+ ASSERT_EQ(CountIter(iter, "foo"), 2);
2868
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2869
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 1);
2870
+ ASSERT_EQ(CountIter(iter, "gpk"), 0);
2871
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2872
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 0);
2873
+
2874
+ // second SST with capped:3 BF
2875
+ ASSERT_OK(Put("foo3", "bar3"));
2876
+ ASSERT_OK(Put("foo4", "bar4"));
2877
+ ASSERT_OK(Put("foq5", "bar5"));
2878
+ ASSERT_OK(Put("fpb", "1"));
2879
+ ASSERT_OK(dbfull()->Flush(FlushOptions()));
2880
+ {
2881
+ // BF is cappped:3 now
2882
+ std::unique_ptr<Iterator> iter_tmp(db_->NewIterator(read_options));
2883
+ ASSERT_EQ(CountIter(iter_tmp, "foo"), 4);
2884
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2885
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 2);
2886
+ ASSERT_EQ(CountIter(iter_tmp, "gpk"), 0);
2887
+ // both counters are incremented because BF is "not changed" for 1 of the
2888
+ // 2 SST files, so filter is checked once and found no match.
2889
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 1);
2890
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 0);
2891
+ }
2892
+
2893
+ ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:2"}}));
2894
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2895
+ "rocksdb.FixedPrefix.2");
2896
+ // third SST with fixed:2 BF
2897
+ ASSERT_OK(Put("foo6", "bar6"));
2898
+ ASSERT_OK(Put("foo7", "bar7"));
2899
+ ASSERT_OK(Put("foq8", "bar8"));
2900
+ ASSERT_OK(Put("fpc", "2"));
2901
+ ASSERT_OK(dbfull()->Flush(FlushOptions()));
2902
+ {
2903
+ // BF is fixed:2 now
2904
+ std::unique_ptr<Iterator> iter_tmp(db_->NewIterator(read_options));
2905
+ ASSERT_EQ(CountIter(iter_tmp, "foo"), 9);
2906
+ // the first and last BF are checked
2907
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2908
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 2);
2909
+ ASSERT_EQ(CountIter(iter_tmp, "gpk"), 0);
2910
+ // only last BF is checked and not found
2911
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 1);
2912
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 0);
2913
+ }
2914
+
2915
+ // iter_old can only see the first SST
2916
+ ASSERT_EQ(CountIter(iter_old, "foo"), 4);
2917
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2918
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 1);
2919
+ // same with iter, but different prefix extractor
2920
+ ASSERT_EQ(CountIter(iter, "foo"), 2);
2921
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2922
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 1);
2923
+
2924
+ {
2925
+ // keys in all three SSTs are visible to iterator
2926
+ // The range of [foo, foz90000] is compatible with (fixed:1) and (fixed:2)
2927
+ std::unique_ptr<Iterator> iter_all(db_->NewIterator(read_options));
2928
+ ASSERT_EQ(CountIter(iter_all, "foo"), 9);
2929
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2930
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 2);
2931
+ ASSERT_EQ(CountIter(iter_all, "gpk"), 0);
2932
+ // FIXME? isn't seek key out of SST range?
2933
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 1);
2934
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 0);
2935
+ }
2936
+ ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
2937
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
2938
+ "rocksdb.CappedPrefix.3");
2939
+ {
2940
+ std::unique_ptr<Iterator> iter_all(db_->NewIterator(read_options));
2941
+ ASSERT_EQ(CountIter(iter_all, "foo"), 6);
2942
+ // all three SST are checked because the current options has the same as
2943
+ // the remaining SST (capped:3)
2944
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
2945
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 3);
2946
+ ASSERT_EQ(CountIter(iter_all, "gpk"), 0);
2947
+ // FIXME? isn't seek key out of SST range?
2948
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 1);
2949
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 0);
2950
+ }
2951
+ // TODO(Zhongyi): Maybe also need to add Get calls to test point look up?
2952
+ }
2953
+ }
2954
+
2955
+ // Create a new column family in a running DB, change prefix_extractor
2956
+ // dynamically, verify the iterator created on the new column family behaves
2957
+ // as expected
2958
+ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
2959
+ int iteration = 0;
2960
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
2961
+ Options options = CurrentOptions();
2962
+ options.create_if_missing = true;
2963
+ options.prefix_extractor.reset(NewFixedPrefixTransform(1));
2964
+ options.disable_auto_compactions = true;
2965
+ options.statistics = CreateDBStatistics();
2966
+ // Enable prefix bloom for SST files
2967
+ BlockBasedTableOptions table_options;
2968
+ table_options.cache_index_and_filter_blocks = true;
2969
+ table_options.filter_policy = Create(10, bfp_impl);
2970
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2971
+ CreateAndReopenWithCF({"pikachu" + std::to_string(iteration)}, options);
2972
+ ReadOptions read_options;
2973
+ read_options.prefix_same_as_start = true;
2974
+ // create a new CF and set prefix_extractor dynamically
2975
+ options.prefix_extractor.reset(NewCappedPrefixTransform(3));
2976
+ CreateColumnFamilies({"ramen_dojo_" + std::to_string(iteration)}, options);
2977
+ ASSERT_EQ(dbfull()->GetOptions(handles_[2]).prefix_extractor->AsString(),
2978
+ "rocksdb.CappedPrefix.3");
2979
+ ASSERT_OK(Put(2, "foo3", "bar3"));
2980
+ ASSERT_OK(Put(2, "foo4", "bar4"));
2981
+ ASSERT_OK(Put(2, "foo5", "bar5"));
2982
+ ASSERT_OK(Put(2, "foq6", "bar6"));
2983
+ ASSERT_OK(Put(2, "fpq7", "bar7"));
2984
+ dbfull()->Flush(FlushOptions());
2985
+ {
2986
+ std::unique_ptr<Iterator> iter(
2987
+ db_->NewIterator(read_options, handles_[2]));
2988
+ ASSERT_EQ(CountIter(iter, "foo"), 3);
2989
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_CHECKED), 0);
2990
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
2991
+ }
2992
+ ASSERT_OK(
2993
+ dbfull()->SetOptions(handles_[2], {{"prefix_extractor", "fixed:2"}}));
2994
+ ASSERT_EQ(dbfull()->GetOptions(handles_[2]).prefix_extractor->AsString(),
2995
+ "rocksdb.FixedPrefix.2");
2996
+ {
2997
+ std::unique_ptr<Iterator> iter(
2998
+ db_->NewIterator(read_options, handles_[2]));
2999
+ ASSERT_EQ(CountIter(iter, "foo"), 4);
3000
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_CHECKED), 0);
3001
+ ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
3002
+ }
3003
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[2]));
3004
+ ASSERT_OK(dbfull()->DestroyColumnFamilyHandle(handles_[2]));
3005
+ handles_[2] = nullptr;
3006
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[1]));
3007
+ ASSERT_OK(dbfull()->DestroyColumnFamilyHandle(handles_[1]));
3008
+ handles_[1] = nullptr;
3009
+ iteration++;
3010
+ }
3011
+ }
3012
+
3013
+ // Verify it's possible to change prefix_extractor at runtime and iterators
3014
+ // behaves as expected
3015
+ TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
3016
+ for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
3017
+ Options options;
3018
+ options.env = CurrentOptions().env;
3019
+ options.create_if_missing = true;
3020
+ options.prefix_extractor.reset(NewFixedPrefixTransform(1));
3021
+ options.disable_auto_compactions = true;
3022
+ options.statistics = CreateDBStatistics();
3023
+ // Enable prefix bloom for SST files
3024
+ BlockBasedTableOptions table_options;
3025
+ table_options.cache_index_and_filter_blocks = true;
3026
+ table_options.filter_policy = Create(10, bfp_impl);
3027
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
3028
+ DestroyAndReopen(options);
3029
+
3030
+ ASSERT_OK(Put("foo2", "bar2"));
3031
+ ASSERT_OK(Put("foo", "bar"));
3032
+ ASSERT_OK(Put("foo1", "bar1"));
3033
+ ASSERT_OK(Put("fpa", "0"));
3034
+ dbfull()->Flush(FlushOptions());
3035
+ ASSERT_OK(Put("foo3", "bar3"));
3036
+ ASSERT_OK(Put("foo4", "bar4"));
3037
+ ASSERT_OK(Put("foo5", "bar5"));
3038
+ ASSERT_OK(Put("fpb", "1"));
3039
+ dbfull()->Flush(FlushOptions());
3040
+ ASSERT_OK(Put("foo6", "bar6"));
3041
+ ASSERT_OK(Put("foo7", "bar7"));
3042
+ ASSERT_OK(Put("foo8", "bar8"));
3043
+ ASSERT_OK(Put("fpc", "2"));
3044
+ dbfull()->Flush(FlushOptions());
3045
+
3046
+ ReadOptions read_options;
3047
+ read_options.prefix_same_as_start = true;
3048
+ {
3049
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3050
+ ASSERT_EQ(CountIter(iter, "foo"), 12);
3051
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
3052
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 3);
3053
+ }
3054
+ std::unique_ptr<Iterator> iter_old(db_->NewIterator(read_options));
3055
+ ASSERT_EQ(CountIter(iter_old, "foo"), 12);
3056
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
3057
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 3);
3058
+
3059
+ ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
3060
+ ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
3061
+ "rocksdb.CappedPrefix.3");
3062
+ {
3063
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3064
+ // "fp*" should be skipped
3065
+ ASSERT_EQ(CountIter(iter, "foo"), 9);
3066
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
3067
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 0);
3068
+ }
3069
+
3070
+ // iterator created before should not be affected and see all keys
3071
+ ASSERT_EQ(CountIter(iter_old, "foo"), 12);
3072
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 0);
3073
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 3);
3074
+ ASSERT_EQ(CountIter(iter_old, "abc"), 0);
3075
+ // FIXME? isn't seek key out of SST range?
3076
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTERED), 3);
3077
+ EXPECT_EQ(PopTicker(options, NON_LAST_LEVEL_SEEK_FILTER_MATCH), 0);
3078
+ }
3079
+ }
3080
+
3081
+ TEST_F(DBBloomFilterTest, SeekForPrevWithPartitionedFilters) {
3082
+ Options options = CurrentOptions();
3083
+ constexpr size_t kNumKeys = 10000;
3084
+ static_assert(kNumKeys <= 10000, "kNumKeys have to be <= 10000");
3085
+ options.memtable_factory.reset(
3086
+ test::NewSpecialSkipListFactory(kNumKeys + 10));
3087
+ options.create_if_missing = true;
3088
+ constexpr size_t kPrefixLength = 4;
3089
+ options.prefix_extractor.reset(NewFixedPrefixTransform(kPrefixLength));
3090
+ options.compression = kNoCompression;
3091
+ BlockBasedTableOptions bbto;
3092
+ bbto.filter_policy.reset(NewBloomFilterPolicy(50));
3093
+ bbto.index_shortening =
3094
+ BlockBasedTableOptions::IndexShorteningMode::kNoShortening;
3095
+ bbto.block_size = 128;
3096
+ bbto.metadata_block_size = 128;
3097
+ bbto.partition_filters = true;
3098
+ bbto.index_type = BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
3099
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
3100
+ DestroyAndReopen(options);
3101
+
3102
+ const std::string value(64, '\0');
3103
+
3104
+ WriteOptions write_opts;
3105
+ write_opts.disableWAL = true;
3106
+ for (size_t i = 0; i < kNumKeys; ++i) {
3107
+ std::ostringstream oss;
3108
+ oss << std::setfill('0') << std::setw(4) << std::fixed << i;
3109
+ ASSERT_OK(db_->Put(write_opts, oss.str(), value));
3110
+ }
3111
+ ASSERT_OK(Flush());
3112
+
3113
+ ReadOptions read_opts;
3114
+ // Use legacy, implicit prefix seek
3115
+ read_opts.total_order_seek = false;
3116
+ read_opts.auto_prefix_mode = false;
3117
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
3118
+ for (size_t i = 0; i < kNumKeys; ++i) {
3119
+ // Seek with a key after each one added but with same prefix. One will
3120
+ // surely cross a partition boundary.
3121
+ std::ostringstream oss;
3122
+ oss << std::setfill('0') << std::setw(4) << std::fixed << i << "a";
3123
+ it->SeekForPrev(oss.str());
3124
+ ASSERT_OK(it->status());
3125
+ ASSERT_TRUE(it->Valid());
3126
+ }
3127
+ it.reset();
3128
+ }
3129
+
3130
+ namespace {
3131
+ class BackwardBytewiseComparator : public Comparator {
3132
+ public:
3133
+ const char* Name() const override { return "BackwardBytewiseComparator"; }
3134
+
3135
+ int Compare(const Slice& a, const Slice& b) const override {
3136
+ int min_size_neg = -static_cast<int>(std::min(a.size(), b.size()));
3137
+ const char* a_end = a.data() + a.size();
3138
+ const char* b_end = b.data() + b.size();
3139
+ for (int i = -1; i >= min_size_neg; --i) {
3140
+ if (a_end[i] != b_end[i]) {
3141
+ if (static_cast<unsigned char>(a_end[i]) <
3142
+ static_cast<unsigned char>(b_end[i])) {
3143
+ return -1;
3144
+ } else {
3145
+ return 1;
3146
+ }
3147
+ }
3148
+ }
3149
+ return static_cast<int>(a.size()) - static_cast<int>(b.size());
3150
+ }
3151
+
3152
+ void FindShortestSeparator(std::string* /*start*/,
3153
+ const Slice& /*limit*/) const override {}
3154
+
3155
+ void FindShortSuccessor(std::string* /*key*/) const override {}
3156
+ };
3157
+
3158
+ const BackwardBytewiseComparator kBackwardBytewiseComparator{};
3159
+
3160
+ class FixedSuffix4Transform : public SliceTransform {
3161
+ const char* Name() const override { return "FixedSuffixTransform"; }
3162
+
3163
+ Slice Transform(const Slice& src) const override {
3164
+ return Slice(src.data() + src.size() - 4, 4);
3165
+ }
3166
+
3167
+ bool InDomain(const Slice& src) const override { return src.size() >= 4; }
3168
+ };
3169
+
3170
+ std::pair<uint64_t, uint64_t> GetBloomStat(const Options& options, bool sst) {
3171
+ if (sst) {
3172
+ return {options.statistics->getAndResetTickerCount(
3173
+ NON_LAST_LEVEL_SEEK_FILTER_MATCH),
3174
+ options.statistics->getAndResetTickerCount(
3175
+ NON_LAST_LEVEL_SEEK_FILTERED)};
3176
+ } else {
3177
+ auto hit = std::exchange(get_perf_context()->bloom_memtable_hit_count, 0);
3178
+ auto miss = std::exchange(get_perf_context()->bloom_memtable_miss_count, 0);
3179
+ return {hit, miss};
3180
+ }
3181
+ }
3182
+
3183
+ std::pair<uint64_t, uint64_t> HitAndMiss(uint64_t hits, uint64_t misses) {
3184
+ return {hits, misses};
3185
+ }
3186
+ } // anonymous namespace
3187
+
3188
+ // This uses a prefix_extractor + comparator combination that violates
3189
+ // one of the old obsolete, unnecessary axioms of prefix extraction:
3190
+ // * key.starts_with(prefix(key))
3191
+ // This axiom is not really needed, and we validate that here.
3192
+ TEST_F(DBBloomFilterTest, WeirdPrefixExtractorWithFilter1) {
3193
+ BlockBasedTableOptions bbto;
3194
+ bbto.filter_policy.reset(ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10));
3195
+ bbto.whole_key_filtering = false;
3196
+
3197
+ Options options = CurrentOptions();
3198
+ options.comparator = &kBackwardBytewiseComparator;
3199
+ options.prefix_extractor = std::make_shared<FixedSuffix4Transform>();
3200
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
3201
+ options.memtable_prefix_bloom_size_ratio = 0.1;
3202
+ options.statistics = CreateDBStatistics();
3203
+
3204
+ DestroyAndReopen(options);
3205
+
3206
+ ASSERT_OK(Put("321aaaa", "val1"));
3207
+ ASSERT_OK(Put("112aaaa", "val2"));
3208
+ ASSERT_OK(Put("009aaaa", "val3"));
3209
+ ASSERT_OK(Put("baa", "val4")); // out of domain
3210
+ ASSERT_OK(Put("321abaa", "val5"));
3211
+ ASSERT_OK(Put("zzz", "val6")); // out of domain
3212
+
3213
+ for (auto flushed : {false, true}) {
3214
+ SCOPED_TRACE("flushed=" + std::to_string(flushed));
3215
+ if (flushed) {
3216
+ ASSERT_OK(Flush());
3217
+ }
3218
+ ReadOptions read_options;
3219
+ if (flushed) { // TODO: support auto_prefix_mode in memtable?
3220
+ read_options.auto_prefix_mode = true;
3221
+ }
3222
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3223
+ {
3224
+ Slice ub("999aaaa");
3225
+ read_options.iterate_upper_bound = &ub;
3226
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3227
+ EXPECT_EQ(CountIter(iter, "aaaa"), 3);
3228
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3229
+ }
3230
+ {
3231
+ Slice ub("999abaa");
3232
+ read_options.iterate_upper_bound = &ub;
3233
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3234
+ EXPECT_EQ(CountIter(iter, "abaa"), 1);
3235
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3236
+ }
3237
+ {
3238
+ Slice ub("999acaa");
3239
+ read_options.iterate_upper_bound = &ub;
3240
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3241
+ EXPECT_EQ(CountIter(iter, "acaa"), 0);
3242
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 1));
3243
+ }
3244
+ {
3245
+ Slice ub("zzzz");
3246
+ read_options.iterate_upper_bound = &ub;
3247
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3248
+ EXPECT_EQ(CountIter(iter, "baa"), 3);
3249
+ if (flushed) { // TODO: fix memtable case
3250
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3251
+ }
3252
+ }
3253
+ }
3254
+ }
3255
+
3256
+ // This uses a prefix_extractor + comparator combination that violates
3257
+ // one of the old obsolete, unnecessary axioms of prefix extraction:
3258
+ // * Compare(prefix(key), key) <= 0
3259
+ // This axiom is not really needed, and we validate that here.
3260
+ TEST_F(DBBloomFilterTest, WeirdPrefixExtractorWithFilter2) {
3261
+ BlockBasedTableOptions bbto;
3262
+ bbto.filter_policy.reset(ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10));
3263
+ bbto.whole_key_filtering = false;
3264
+
3265
+ Options options = CurrentOptions();
3266
+ options.comparator = ReverseBytewiseComparator();
3267
+ options.prefix_extractor.reset(NewFixedPrefixTransform(4));
3268
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
3269
+ options.memtable_prefix_bloom_size_ratio = 0.1;
3270
+ options.statistics = CreateDBStatistics();
3271
+
3272
+ DestroyAndReopen(options);
3273
+
3274
+ ASSERT_OK(Put("aaaa123", "val1"));
3275
+ ASSERT_OK(Put("aaaa211", "val2"));
3276
+ ASSERT_OK(Put("aaaa900", "val3"));
3277
+ ASSERT_OK(Put("aab", "val4")); // out of domain
3278
+ ASSERT_OK(Put("aaba123", "val5"));
3279
+ ASSERT_OK(Put("qqqq123", "val7"));
3280
+ ASSERT_OK(Put("qqqq", "val8"));
3281
+ ASSERT_OK(Put("zzz", "val8")); // out of domain
3282
+
3283
+ for (auto flushed : {false, true}) {
3284
+ SCOPED_TRACE("flushed=" + std::to_string(flushed));
3285
+ if (flushed) {
3286
+ ASSERT_OK(Flush());
3287
+ }
3288
+ ReadOptions read_options;
3289
+ if (flushed) { // TODO: support auto_prefix_mode in memtable?
3290
+ read_options.auto_prefix_mode = true;
3291
+ } else {
3292
+ // TODO: why needed?
3293
+ get_perf_context()->bloom_memtable_hit_count = 0;
3294
+ get_perf_context()->bloom_memtable_miss_count = 0;
3295
+ }
3296
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3297
+ {
3298
+ Slice ub("aaaa000");
3299
+ read_options.iterate_upper_bound = &ub;
3300
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3301
+ EXPECT_EQ(CountIter(iter, "aaaa999"), 3);
3302
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3303
+ }
3304
+ {
3305
+ // Note: prefix does work as upper bound
3306
+ Slice ub("aaaa");
3307
+ read_options.iterate_upper_bound = &ub;
3308
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3309
+ EXPECT_EQ(CountIter(iter, "aaaa999"), 3);
3310
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3311
+ }
3312
+ {
3313
+ // Note: prefix does not work here as seek key
3314
+ Slice ub("aaaa500");
3315
+ read_options.iterate_upper_bound = &ub;
3316
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3317
+ EXPECT_EQ(CountIter(iter, "aaaa"), 0);
3318
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3319
+ }
3320
+ {
3321
+ Slice ub("aaba000");
3322
+ read_options.iterate_upper_bound = &ub;
3323
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3324
+ EXPECT_EQ(CountIter(iter, "aaba999"), 1);
3325
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3326
+ }
3327
+ {
3328
+ Slice ub("aaca000");
3329
+ read_options.iterate_upper_bound = &ub;
3330
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3331
+ EXPECT_EQ(CountIter(iter, "aaca999"), 0);
3332
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 1));
3333
+ }
3334
+ {
3335
+ Slice ub("aaaz");
3336
+ read_options.iterate_upper_bound = &ub;
3337
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3338
+ EXPECT_EQ(CountIter(iter, "zzz"), 5);
3339
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3340
+ }
3341
+ {
3342
+ // Note: prefix does work here as seek key, but only finds key equal
3343
+ // to prefix (others with same prefix are less)
3344
+ read_options.auto_prefix_mode = false;
3345
+ read_options.iterate_upper_bound = nullptr;
3346
+ read_options.prefix_same_as_start = true;
3347
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3348
+ EXPECT_EQ(CountIter(iter, "qqqq"), 1);
3349
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3350
+ }
3351
+ }
3352
+ }
3353
+
3354
+ namespace {
3355
+ // A weird comparator that in combination with NonIdempotentFixed4Transform
3356
+ // breaks an old axiom of prefix filtering.
3357
+ class WeirdComparator : public Comparator {
3358
+ public:
3359
+ const char* Name() const override { return "WeirdComparator"; }
3360
+
3361
+ int Compare(const Slice& a, const Slice& b) const override {
3362
+ bool a_in = a.size() >= 5;
3363
+ bool b_in = b.size() >= 5;
3364
+ if (a_in != b_in) {
3365
+ // Order keys after prefixes
3366
+ return a_in - b_in;
3367
+ }
3368
+ if (a_in) {
3369
+ return BytewiseComparator()->Compare(a, b);
3370
+ } else {
3371
+ // Different ordering on the prefixes
3372
+ return ReverseBytewiseComparator()->Compare(a, b);
3373
+ }
3374
+ }
3375
+
3376
+ void FindShortestSeparator(std::string* /*start*/,
3377
+ const Slice& /*limit*/) const override {}
3378
+
3379
+ void FindShortSuccessor(std::string* /*key*/) const override {}
3380
+ };
3381
+ const WeirdComparator kWeirdComparator{};
3382
+
3383
+ // Non-idempotentent because prefix is always 4 bytes, but this is
3384
+ // out-of-domain for keys to be assigned prefixes (>= 5 bytes)
3385
+ class NonIdempotentFixed4Transform : public SliceTransform {
3386
+ const char* Name() const override { return "NonIdempotentFixed4Transform"; }
3387
+
3388
+ Slice Transform(const Slice& src) const override {
3389
+ return Slice(src.data(), 4);
3390
+ }
3391
+
3392
+ bool InDomain(const Slice& src) const override { return src.size() >= 5; }
3393
+ };
3394
+ } // anonymous namespace
3395
+
3396
+ // This uses a prefix_extractor + comparator combination that violates
3397
+ // two of the old obsolete, unnecessary axioms of prefix extraction:
3398
+ // * prefix(prefix(key)) == prefix(key)
3399
+ // * If Compare(k1, k2) <= 0, then Compare(prefix(k1), prefix(k2)) <= 0
3400
+ // This axiom is not really needed, and we validate that here.
3401
+ TEST_F(DBBloomFilterTest, WeirdPrefixExtractorWithFilter3) {
3402
+ BlockBasedTableOptions bbto;
3403
+ bbto.filter_policy.reset(ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10));
3404
+ bbto.whole_key_filtering = false;
3405
+
3406
+ Options options = CurrentOptions();
3407
+ options.prefix_extractor = std::make_shared<NonIdempotentFixed4Transform>();
3408
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
3409
+ options.memtable_prefix_bloom_size_ratio = 0.1;
3410
+ options.statistics = CreateDBStatistics();
3411
+
3412
+ for (auto weird_comparator : {false, true}) {
3413
+ if (weird_comparator) {
3414
+ options.comparator = &kWeirdComparator;
3415
+ }
3416
+ DestroyAndReopen(options);
3417
+
3418
+ ASSERT_OK(Put("aaaa123", "val1"));
3419
+ ASSERT_OK(Put("aaaa211", "val2"));
3420
+ ASSERT_OK(Put("aaaa900", "val3"));
3421
+ ASSERT_OK(Put("aab", "val4")); // out of domain
3422
+ ASSERT_OK(Put("aaba123", "val5"));
3423
+ ASSERT_OK(Put("qqqq123", "val7"));
3424
+ ASSERT_OK(Put("qqqq", "val8")); // out of domain
3425
+ ASSERT_OK(Put("zzzz", "val8")); // out of domain
3426
+
3427
+ for (auto flushed : {false, true}) {
3428
+ SCOPED_TRACE("flushed=" + std::to_string(flushed));
3429
+ if (flushed) {
3430
+ ASSERT_OK(Flush());
3431
+ }
3432
+ ReadOptions read_options;
3433
+ if (flushed) { // TODO: support auto_prefix_mode in memtable?
3434
+ read_options.auto_prefix_mode = true;
3435
+ } else {
3436
+ // TODO: why needed?
3437
+ get_perf_context()->bloom_memtable_hit_count = 0;
3438
+ get_perf_context()->bloom_memtable_miss_count = 0;
3439
+ }
3440
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3441
+ {
3442
+ Slice ub("aaaa999");
3443
+ read_options.iterate_upper_bound = &ub;
3444
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3445
+ EXPECT_EQ(CountIter(iter, "aaaa000"), 3);
3446
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3447
+ }
3448
+ {
3449
+ // Note: prefix as seek key is not bloom-optimized
3450
+ // Note: the count works with weird_comparator because "aaaa" is
3451
+ // ordered as the last of the prefixes
3452
+ Slice ub("aaaa999");
3453
+ read_options.iterate_upper_bound = &ub;
3454
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3455
+ EXPECT_EQ(CountIter(iter, "aaaa"), 3);
3456
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3457
+ }
3458
+ {
3459
+ Slice ub("aaba9");
3460
+ read_options.iterate_upper_bound = &ub;
3461
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3462
+ EXPECT_EQ(CountIter(iter, "aaba0"), 1);
3463
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3464
+ }
3465
+ {
3466
+ Slice ub("aaca9");
3467
+ read_options.iterate_upper_bound = &ub;
3468
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3469
+ EXPECT_EQ(CountIter(iter, "aaca0"), 0);
3470
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 1));
3471
+ }
3472
+ {
3473
+ Slice ub("qqqq9");
3474
+ read_options.iterate_upper_bound = &ub;
3475
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3476
+ EXPECT_EQ(CountIter(iter, "qqqq0"), 1);
3477
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(1, 0));
3478
+ }
3479
+ {
3480
+ // Note: prefix as seek key is not bloom-optimized
3481
+ Slice ub("qqqq9");
3482
+ read_options.iterate_upper_bound = &ub;
3483
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3484
+ EXPECT_EQ(CountIter(iter, "qqqq"), weird_comparator ? 7 : 2);
3485
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3486
+ }
3487
+ {
3488
+ // Note: prefix as seek key is not bloom-optimized
3489
+ Slice ub("zzzz9");
3490
+ read_options.iterate_upper_bound = &ub;
3491
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3492
+ EXPECT_EQ(CountIter(iter, "zzzz"), weird_comparator ? 8 : 1);
3493
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3494
+ }
3495
+ {
3496
+ Slice ub("zzzz9");
3497
+ read_options.iterate_upper_bound = &ub;
3498
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
3499
+ EXPECT_EQ(CountIter(iter, "aab"), weird_comparator ? 6 : 5);
3500
+ EXPECT_EQ(GetBloomStat(options, flushed), HitAndMiss(0, 0));
3501
+ }
3502
+ }
3503
+ }
3504
+ }
3505
+
3506
+
3507
+ } // namespace ROCKSDB_NAMESPACE
3508
+
3509
+ int main(int argc, char** argv) {
3510
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
3511
+ ::testing::InitGoogleTest(&argc, argv);
3512
+ return RUN_ALL_TESTS();
3513
+ }