@nxtedition/rocksdb 5.2.21 → 5.2.28
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.
- package/binding.cc +510 -967
- package/binding.gyp +78 -72
- package/chained-batch.js +1 -2
- package/deps/rocksdb/build_version.cc +70 -4
- package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
- package/deps/rocksdb/rocksdb/Makefile +459 -469
- package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
- package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
- package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
- package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
- package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
- package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
- package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
- package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
- package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
- package/deps/rocksdb/rocksdb/db/builder.h +16 -37
- package/deps/rocksdb/rocksdb/db/c.cc +413 -208
- package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
- package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
- package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
- package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
- package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
- package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
- package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
- package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
- package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
- package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
- package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
- package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
- package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
- package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
- package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
- package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
- package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
- package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
- package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
- package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
- package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
- package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
- package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
- package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
- package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
- package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
- package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
- package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
- package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
- package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
- package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
- package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
- package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
- package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
- package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
- package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
- package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
- package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
- package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
- package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
- package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
- package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
- package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
- package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
- package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
- package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
- package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
- package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
- package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
- package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
- package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
- package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
- package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
- package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
- package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
- package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
- package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
- package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
- package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
- package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
- package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
- package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
- package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
- package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
- package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
- package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
- package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
- package/deps/rocksdb/rocksdb/env/env.cc +632 -42
- package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
- package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
- package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
- package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
- package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
- package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
- package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
- package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
- package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
- package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
- package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
- package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
- package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
- package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
- package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
- package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
- package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
- package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
- package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
- package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
- package/deps/rocksdb/rocksdb/file/filename.h +13 -8
- package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
- package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
- package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
- package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
- package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
- package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
- package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
- package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
- package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
- package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
- package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
- package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
- package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
- package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
- package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
- package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
- package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
- package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
- package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
- package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
- package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
- package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
- package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
- package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
- package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
- package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
- package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
- package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
- package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
- package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
- package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
- package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
- package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
- package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
- package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
- package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
- package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
- package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
- package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
- package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
- package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
- package/deps/rocksdb/rocksdb/options/options.cc +49 -17
- package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
- package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
- package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
- package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
- package/deps/rocksdb/rocksdb/port/lang.h +52 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
- package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
- package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
- package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
- package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
- package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
- package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
- package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
- package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
- package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
- package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
- package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
- package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
- package/deps/rocksdb/rocksdb/python.mk +9 -0
- package/deps/rocksdb/rocksdb/src.mk +82 -34
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
- package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
- package/deps/rocksdb/rocksdb/table/format.cc +258 -104
- package/deps/rocksdb/rocksdb/table/format.h +120 -109
- package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
- package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
- package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
- package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
- package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
- package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
- package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
- package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
- package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
- package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
- package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
- package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
- package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
- package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
- package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
- package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
- package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
- package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
- package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
- package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
- package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
- package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
- package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
- package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
- package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
- package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
- package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
- package/deps/rocksdb/rocksdb/util/channel.h +2 -0
- package/deps/rocksdb/rocksdb/util/coding.h +1 -33
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
- package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
- package/deps/rocksdb/rocksdb/util/compression.h +212 -7
- package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
- package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
- package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
- package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
- package/deps/rocksdb/rocksdb/util/defer.h +30 -1
- package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
- package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
- package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
- package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
- package/deps/rocksdb/rocksdb/util/hash.h +31 -1
- package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
- package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
- package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
- package/deps/rocksdb/rocksdb/util/heap.h +6 -1
- package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
- package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
- package/deps/rocksdb/rocksdb/util/math.h +74 -7
- package/deps/rocksdb/rocksdb/util/math128.h +13 -1
- package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
- package/deps/rocksdb/rocksdb/util/random.cc +9 -0
- package/deps/rocksdb/rocksdb/util/random.h +6 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
- package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
- package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
- package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
- package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
- package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
- package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
- package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
- package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
- package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
- package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
- package/deps/rocksdb/rocksdb/util/status.cc +32 -29
- package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
- package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
- package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
- package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
- package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
- package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
- package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
- package/deps/rocksdb/rocksdb/util/timer.h +55 -46
- package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
- package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
- package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
- package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
- package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
- package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
- package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
- package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
- package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
- package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
- package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
- package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
- package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
- package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
- package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
- package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
- package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
- package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
- package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
- package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
- package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
- package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
- package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
- package/deps/rocksdb/rocksdb.gyp +425 -446
- package/index.js +5 -87
- package/package-lock.json +23687 -0
- package/package.json +8 -9
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/README.md +0 -32
- package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
- package/deps/rocksdb/rocksdb/hdfs/README +0 -23
- package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
- package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
- package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
- package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
- package/deps/rocksdb/rocksdb/port/README +0 -10
- package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
- package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
- package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
- package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
- package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
- package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
- package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
- package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
- package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
- package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
- package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
- package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
- package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
- package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
- package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
- package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
- package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
- package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
- package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
- package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
- package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
- package/deps/snappy/snappy-1.1.7/README.md +0 -149
- package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
|
@@ -7,16 +7,44 @@
|
|
|
7
7
|
// Use of this source code is governed by a BSD-style license that can be
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
|
|
10
|
+
#include <cstring>
|
|
11
|
+
#include <iomanip>
|
|
12
|
+
#include <sstream>
|
|
13
|
+
#include <string>
|
|
14
|
+
|
|
15
|
+
#include "cache/cache_entry_roles.h"
|
|
16
|
+
#include "cache/cache_reservation_manager.h"
|
|
10
17
|
#include "db/db_test_util.h"
|
|
11
18
|
#include "options/options_helper.h"
|
|
12
19
|
#include "port/stack_trace.h"
|
|
20
|
+
#include "rocksdb/advanced_options.h"
|
|
21
|
+
#include "rocksdb/convenience.h"
|
|
22
|
+
#include "rocksdb/filter_policy.h"
|
|
13
23
|
#include "rocksdb/perf_context.h"
|
|
24
|
+
#include "rocksdb/statistics.h"
|
|
25
|
+
#include "rocksdb/table.h"
|
|
26
|
+
#include "table/block_based/block_based_table_reader.h"
|
|
14
27
|
#include "table/block_based/filter_policy_internal.h"
|
|
28
|
+
#include "table/format.h"
|
|
29
|
+
#include "test_util/testutil.h"
|
|
30
|
+
#include "util/string_util.h"
|
|
15
31
|
|
|
16
32
|
namespace ROCKSDB_NAMESPACE {
|
|
17
33
|
|
|
18
34
|
namespace {
|
|
19
|
-
|
|
35
|
+
std::shared_ptr<const FilterPolicy> Create(double bits_per_key,
|
|
36
|
+
const std::string& name) {
|
|
37
|
+
return BloomLikeFilterPolicy::Create(name, bits_per_key);
|
|
38
|
+
}
|
|
39
|
+
const std::string kLegacyBloom = test::LegacyBloomFilterPolicy::kClassName();
|
|
40
|
+
const std::string kDeprecatedBlock =
|
|
41
|
+
DeprecatedBlockBasedBloomFilterPolicy::kClassName();
|
|
42
|
+
const std::string kFastLocalBloom =
|
|
43
|
+
test::FastLocalBloomFilterPolicy::kClassName();
|
|
44
|
+
const std::string kStandard128Ribbon =
|
|
45
|
+
test::Standard128RibbonFilterPolicy::kClassName();
|
|
46
|
+
const std::string kAutoBloom = BloomFilterPolicy::kClassName();
|
|
47
|
+
const std::string kAutoRibbon = RibbonFilterPolicy::kClassName();
|
|
20
48
|
} // namespace
|
|
21
49
|
|
|
22
50
|
// DB tests related to bloom filter.
|
|
@@ -24,21 +52,22 @@ using BFP = BloomFilterPolicy;
|
|
|
24
52
|
class DBBloomFilterTest : public DBTestBase {
|
|
25
53
|
public:
|
|
26
54
|
DBBloomFilterTest()
|
|
27
|
-
: DBTestBase("
|
|
55
|
+
: DBTestBase("db_bloom_filter_test", /*env_do_fsync=*/true) {}
|
|
28
56
|
};
|
|
29
57
|
|
|
30
|
-
class DBBloomFilterTestWithParam
|
|
31
|
-
|
|
32
|
-
|
|
58
|
+
class DBBloomFilterTestWithParam
|
|
59
|
+
: public DBTestBase,
|
|
60
|
+
public testing::WithParamInterface<
|
|
61
|
+
std::tuple<std::string, bool, uint32_t>> {
|
|
33
62
|
// public testing::WithParamInterface<bool> {
|
|
34
63
|
protected:
|
|
35
|
-
|
|
64
|
+
std::string bfp_impl_;
|
|
36
65
|
bool partition_filters_;
|
|
37
66
|
uint32_t format_version_;
|
|
38
67
|
|
|
39
68
|
public:
|
|
40
69
|
DBBloomFilterTestWithParam()
|
|
41
|
-
: DBTestBase("
|
|
70
|
+
: DBTestBase("db_bloom_filter_tests", /*env_do_fsync=*/true) {}
|
|
42
71
|
|
|
43
72
|
~DBBloomFilterTestWithParam() override {}
|
|
44
73
|
|
|
@@ -79,7 +108,7 @@ TEST_P(DBBloomFilterTestDefFormatVersion, KeyMayExist) {
|
|
|
79
108
|
ReadOptions ropts;
|
|
80
109
|
std::string value;
|
|
81
110
|
anon::OptionsOverride options_override;
|
|
82
|
-
options_override.filter_policy
|
|
111
|
+
options_override.filter_policy = Create(20, bfp_impl_);
|
|
83
112
|
options_override.partition_filters = partition_filters_;
|
|
84
113
|
options_override.metadata_block_size = 32;
|
|
85
114
|
Options options = CurrentOptions(options_override);
|
|
@@ -209,11 +238,23 @@ TEST_F(DBBloomFilterTest, GetFilterByPrefixBloomCustomPrefixExtractor) {
|
|
|
209
238
|
(*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
|
|
210
239
|
|
|
211
240
|
ro.total_order_seek = true;
|
|
212
|
-
|
|
213
|
-
ASSERT_EQ(
|
|
241
|
+
// NOTE: total_order_seek no longer affects Get()
|
|
242
|
+
ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
|
|
243
|
+
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
|
|
214
244
|
ASSERT_EQ(
|
|
215
|
-
|
|
245
|
+
3,
|
|
246
|
+
(*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
|
|
247
|
+
|
|
248
|
+
// No bloom on extractor changed
|
|
249
|
+
#ifndef ROCKSDB_LITE
|
|
250
|
+
ASSERT_OK(db_->SetOptions({{"prefix_extractor", "capped:10"}}));
|
|
251
|
+
ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
|
|
252
|
+
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
|
|
253
|
+
ASSERT_EQ(
|
|
254
|
+
3,
|
|
216
255
|
(*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
|
|
256
|
+
#endif // ROCKSDB_LITE
|
|
257
|
+
|
|
217
258
|
get_perf_context()->Reset();
|
|
218
259
|
}
|
|
219
260
|
}
|
|
@@ -260,11 +301,23 @@ TEST_F(DBBloomFilterTest, GetFilterByPrefixBloom) {
|
|
|
260
301
|
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 2);
|
|
261
302
|
|
|
262
303
|
ro.total_order_seek = true;
|
|
263
|
-
|
|
264
|
-
ASSERT_EQ(
|
|
304
|
+
// NOTE: total_order_seek no longer affects Get()
|
|
305
|
+
ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
|
|
306
|
+
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
|
|
265
307
|
ASSERT_EQ(
|
|
266
|
-
|
|
308
|
+
3,
|
|
267
309
|
(*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
|
|
310
|
+
|
|
311
|
+
// No bloom on extractor changed
|
|
312
|
+
#ifndef ROCKSDB_LITE
|
|
313
|
+
ASSERT_OK(db_->SetOptions({{"prefix_extractor", "capped:10"}}));
|
|
314
|
+
ASSERT_EQ("NOT_FOUND", Get("foobarbar"));
|
|
315
|
+
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 3);
|
|
316
|
+
ASSERT_EQ(
|
|
317
|
+
3,
|
|
318
|
+
(*(get_perf_context()->level_to_perf_context))[0].bloom_filter_useful);
|
|
319
|
+
#endif // ROCKSDB_LITE
|
|
320
|
+
|
|
268
321
|
get_perf_context()->Reset();
|
|
269
322
|
}
|
|
270
323
|
}
|
|
@@ -442,7 +495,7 @@ TEST_P(DBBloomFilterTestWithParam, BloomFilter) {
|
|
|
442
495
|
// trigger reset of table_factory
|
|
443
496
|
BlockBasedTableOptions table_options;
|
|
444
497
|
table_options.no_block_cache = true;
|
|
445
|
-
table_options.filter_policy
|
|
498
|
+
table_options.filter_policy = Create(10, bfp_impl_);
|
|
446
499
|
table_options.partition_filters = partition_filters_;
|
|
447
500
|
if (partition_filters_) {
|
|
448
501
|
table_options.index_type =
|
|
@@ -503,36 +556,217 @@ TEST_P(DBBloomFilterTestWithParam, BloomFilter) {
|
|
|
503
556
|
ASSERT_LE(reads, 3 * N / 100);
|
|
504
557
|
}
|
|
505
558
|
|
|
559
|
+
#ifndef ROCKSDB_LITE
|
|
560
|
+
// Sanity check some table properties
|
|
561
|
+
std::map<std::string, std::string> props;
|
|
562
|
+
ASSERT_TRUE(db_->GetMapProperty(
|
|
563
|
+
handles_[1], DB::Properties::kAggregatedTableProperties, &props));
|
|
564
|
+
uint64_t nkeys = N + N / 100;
|
|
565
|
+
uint64_t filter_size = ParseUint64(props["filter_size"]);
|
|
566
|
+
EXPECT_LE(filter_size,
|
|
567
|
+
(partition_filters_ ? 12 : 11) * nkeys / /*bits / byte*/ 8);
|
|
568
|
+
if (bfp_impl_ == kAutoRibbon) {
|
|
569
|
+
// Sometimes using Ribbon filter which is more space-efficient
|
|
570
|
+
EXPECT_GE(filter_size, 7 * nkeys / /*bits / byte*/ 8);
|
|
571
|
+
} else {
|
|
572
|
+
// Always Bloom
|
|
573
|
+
EXPECT_GE(filter_size, 10 * nkeys / /*bits / byte*/ 8);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
uint64_t num_filter_entries = ParseUint64(props["num_filter_entries"]);
|
|
577
|
+
EXPECT_EQ(num_filter_entries, nkeys);
|
|
578
|
+
#endif // ROCKSDB_LITE
|
|
579
|
+
|
|
506
580
|
env_->delay_sstable_sync_.store(false, std::memory_order_release);
|
|
507
581
|
Close();
|
|
508
582
|
} while (ChangeCompactOptions());
|
|
509
583
|
}
|
|
510
584
|
|
|
511
|
-
|
|
585
|
+
namespace {
|
|
586
|
+
|
|
587
|
+
class AlwaysTrueBitsBuilder : public FilterBitsBuilder {
|
|
588
|
+
public:
|
|
589
|
+
void AddKey(const Slice&) override {}
|
|
590
|
+
size_t EstimateEntriesAdded() override { return 0U; }
|
|
591
|
+
Slice Finish(std::unique_ptr<const char[]>* /* buf */) override {
|
|
592
|
+
// Interpreted as "always true" filter (0 probes over 1 byte of
|
|
593
|
+
// payload, 5 bytes metadata)
|
|
594
|
+
return Slice("\0\0\0\0\0\0", 6);
|
|
595
|
+
}
|
|
596
|
+
using FilterBitsBuilder::Finish;
|
|
597
|
+
size_t ApproximateNumEntries(size_t) override { return SIZE_MAX; }
|
|
598
|
+
};
|
|
599
|
+
|
|
600
|
+
class AlwaysTrueFilterPolicy : public ReadOnlyBuiltinFilterPolicy {
|
|
601
|
+
public:
|
|
602
|
+
explicit AlwaysTrueFilterPolicy(bool skip) : skip_(skip) {}
|
|
603
|
+
|
|
604
|
+
FilterBitsBuilder* GetBuilderWithContext(
|
|
605
|
+
const FilterBuildingContext&) const override {
|
|
606
|
+
if (skip_) {
|
|
607
|
+
return nullptr;
|
|
608
|
+
} else {
|
|
609
|
+
return new AlwaysTrueBitsBuilder();
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
private:
|
|
614
|
+
bool skip_;
|
|
615
|
+
};
|
|
616
|
+
|
|
617
|
+
} // namespace
|
|
618
|
+
|
|
619
|
+
TEST_P(DBBloomFilterTestWithParam, SkipFilterOnEssentiallyZeroBpk) {
|
|
620
|
+
constexpr int maxKey = 10;
|
|
621
|
+
auto PutFn = [&]() {
|
|
622
|
+
int i;
|
|
623
|
+
// Put
|
|
624
|
+
for (i = 0; i < maxKey; i++) {
|
|
625
|
+
ASSERT_OK(Put(Key(i), Key(i)));
|
|
626
|
+
}
|
|
627
|
+
Flush();
|
|
628
|
+
};
|
|
629
|
+
auto GetFn = [&]() {
|
|
630
|
+
int i;
|
|
631
|
+
// Get OK
|
|
632
|
+
for (i = 0; i < maxKey; i++) {
|
|
633
|
+
ASSERT_EQ(Key(i), Get(Key(i)));
|
|
634
|
+
}
|
|
635
|
+
// Get NotFound
|
|
636
|
+
for (; i < maxKey * 2; i++) {
|
|
637
|
+
ASSERT_EQ(Get(Key(i)), "NOT_FOUND");
|
|
638
|
+
}
|
|
639
|
+
};
|
|
640
|
+
auto PutAndGetFn = [&]() {
|
|
641
|
+
PutFn();
|
|
642
|
+
GetFn();
|
|
643
|
+
};
|
|
644
|
+
#ifndef ROCKSDB_LITE
|
|
645
|
+
std::map<std::string, std::string> props;
|
|
646
|
+
const auto& kAggTableProps = DB::Properties::kAggregatedTableProperties;
|
|
647
|
+
#endif // ROCKSDB_LITE
|
|
648
|
+
|
|
649
|
+
Options options = CurrentOptions();
|
|
650
|
+
options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
|
|
651
|
+
BlockBasedTableOptions table_options;
|
|
652
|
+
table_options.partition_filters = partition_filters_;
|
|
653
|
+
if (partition_filters_) {
|
|
654
|
+
table_options.index_type =
|
|
655
|
+
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
656
|
+
}
|
|
657
|
+
table_options.format_version = format_version_;
|
|
658
|
+
|
|
659
|
+
// Test 1: bits per key < 0.5 means skip filters -> no filter
|
|
660
|
+
// constructed or read.
|
|
661
|
+
table_options.filter_policy = Create(0.4, bfp_impl_);
|
|
662
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
663
|
+
DestroyAndReopen(options);
|
|
664
|
+
PutAndGetFn();
|
|
665
|
+
|
|
666
|
+
// Verify no filter access nor contruction
|
|
667
|
+
EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
|
|
668
|
+
EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
|
|
669
|
+
|
|
670
|
+
#ifndef ROCKSDB_LITE
|
|
671
|
+
props.clear();
|
|
672
|
+
ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
|
|
673
|
+
EXPECT_EQ(props["filter_size"], "0");
|
|
674
|
+
#endif // ROCKSDB_LITE
|
|
675
|
+
|
|
676
|
+
// Test 2: use custom API to skip filters -> no filter constructed
|
|
677
|
+
// or read.
|
|
678
|
+
table_options.filter_policy.reset(
|
|
679
|
+
new AlwaysTrueFilterPolicy(/* skip */ true));
|
|
680
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
681
|
+
DestroyAndReopen(options);
|
|
682
|
+
PutAndGetFn();
|
|
683
|
+
|
|
684
|
+
// Verify no filter access nor construction
|
|
685
|
+
EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
|
|
686
|
+
EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
|
|
687
|
+
|
|
688
|
+
#ifndef ROCKSDB_LITE
|
|
689
|
+
props.clear();
|
|
690
|
+
ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
|
|
691
|
+
EXPECT_EQ(props["filter_size"], "0");
|
|
692
|
+
#endif // ROCKSDB_LITE
|
|
693
|
+
|
|
694
|
+
// Control test: using an actual filter with 100% FP rate -> the filter
|
|
695
|
+
// is constructed and checked on read.
|
|
696
|
+
table_options.filter_policy.reset(
|
|
697
|
+
new AlwaysTrueFilterPolicy(/* skip */ false));
|
|
698
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
699
|
+
DestroyAndReopen(options);
|
|
700
|
+
PutAndGetFn();
|
|
701
|
+
|
|
702
|
+
// Verify filter is accessed (and constructed)
|
|
703
|
+
EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE),
|
|
704
|
+
maxKey * 2);
|
|
705
|
+
EXPECT_EQ(
|
|
706
|
+
TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE),
|
|
707
|
+
maxKey);
|
|
708
|
+
#ifndef ROCKSDB_LITE
|
|
709
|
+
props.clear();
|
|
710
|
+
ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
|
|
711
|
+
EXPECT_NE(props["filter_size"], "0");
|
|
712
|
+
#endif // ROCKSDB_LITE
|
|
713
|
+
|
|
714
|
+
// Test 3 (options test): Able to read existing filters with longstanding
|
|
715
|
+
// generated options file entry `filter_policy=rocksdb.BuiltinBloomFilter`
|
|
716
|
+
ASSERT_OK(FilterPolicy::CreateFromString(ConfigOptions(),
|
|
717
|
+
"rocksdb.BuiltinBloomFilter",
|
|
718
|
+
&table_options.filter_policy));
|
|
719
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
720
|
+
Reopen(options);
|
|
721
|
+
GetFn();
|
|
722
|
+
|
|
723
|
+
// Verify filter is accessed
|
|
724
|
+
EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE),
|
|
725
|
+
maxKey * 2);
|
|
726
|
+
EXPECT_EQ(
|
|
727
|
+
TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE),
|
|
728
|
+
maxKey);
|
|
729
|
+
|
|
730
|
+
// But new filters are not generated (configuration details unknown)
|
|
731
|
+
DestroyAndReopen(options);
|
|
732
|
+
PutAndGetFn();
|
|
733
|
+
|
|
734
|
+
// Verify no filter access nor construction
|
|
735
|
+
EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE), 0);
|
|
736
|
+
EXPECT_EQ(TestGetTickerCount(options, BLOOM_FILTER_FULL_TRUE_POSITIVE), 0);
|
|
737
|
+
|
|
738
|
+
#ifndef ROCKSDB_LITE
|
|
739
|
+
props.clear();
|
|
740
|
+
ASSERT_TRUE(db_->GetMapProperty(kAggTableProps, &props));
|
|
741
|
+
EXPECT_EQ(props["filter_size"], "0");
|
|
742
|
+
#endif // ROCKSDB_LITE
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
#if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
|
|
512
746
|
INSTANTIATE_TEST_CASE_P(
|
|
513
747
|
FormatDef, DBBloomFilterTestDefFormatVersion,
|
|
514
748
|
::testing::Values(
|
|
515
|
-
std::make_tuple(
|
|
516
|
-
|
|
517
|
-
std::make_tuple(
|
|
518
|
-
std::make_tuple(
|
|
749
|
+
std::make_tuple(kDeprecatedBlock, false, test::kDefaultFormatVersion),
|
|
750
|
+
std::make_tuple(kAutoBloom, true, test::kDefaultFormatVersion),
|
|
751
|
+
std::make_tuple(kAutoBloom, false, test::kDefaultFormatVersion),
|
|
752
|
+
std::make_tuple(kAutoRibbon, false, test::kDefaultFormatVersion)));
|
|
519
753
|
|
|
520
754
|
INSTANTIATE_TEST_CASE_P(
|
|
521
755
|
FormatDef, DBBloomFilterTestWithParam,
|
|
522
756
|
::testing::Values(
|
|
523
|
-
std::make_tuple(
|
|
524
|
-
|
|
525
|
-
std::make_tuple(
|
|
526
|
-
std::make_tuple(
|
|
757
|
+
std::make_tuple(kDeprecatedBlock, false, test::kDefaultFormatVersion),
|
|
758
|
+
std::make_tuple(kAutoBloom, true, test::kDefaultFormatVersion),
|
|
759
|
+
std::make_tuple(kAutoBloom, false, test::kDefaultFormatVersion),
|
|
760
|
+
std::make_tuple(kAutoRibbon, false, test::kDefaultFormatVersion)));
|
|
527
761
|
|
|
528
762
|
INSTANTIATE_TEST_CASE_P(
|
|
529
763
|
FormatLatest, DBBloomFilterTestWithParam,
|
|
530
764
|
::testing::Values(
|
|
531
|
-
std::make_tuple(
|
|
532
|
-
|
|
533
|
-
std::make_tuple(
|
|
534
|
-
std::make_tuple(
|
|
535
|
-
#endif // ROCKSDB_VALGRIND_RUN
|
|
765
|
+
std::make_tuple(kDeprecatedBlock, false, kLatestFormatVersion),
|
|
766
|
+
std::make_tuple(kAutoBloom, true, kLatestFormatVersion),
|
|
767
|
+
std::make_tuple(kAutoBloom, false, kLatestFormatVersion),
|
|
768
|
+
std::make_tuple(kAutoRibbon, false, kLatestFormatVersion)));
|
|
769
|
+
#endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
|
|
536
770
|
|
|
537
771
|
TEST_F(DBBloomFilterTest, BloomFilterRate) {
|
|
538
772
|
while (ChangeFilterOptions()) {
|
|
@@ -567,163 +801,848 @@ TEST_F(DBBloomFilterTest, BloomFilterRate) {
|
|
|
567
801
|
}
|
|
568
802
|
}
|
|
569
803
|
|
|
804
|
+
namespace {
|
|
805
|
+
struct CompatibilityConfig {
|
|
806
|
+
std::shared_ptr<const FilterPolicy> policy;
|
|
807
|
+
bool partitioned;
|
|
808
|
+
uint32_t format_version;
|
|
809
|
+
|
|
810
|
+
void SetInTableOptions(BlockBasedTableOptions* table_options) {
|
|
811
|
+
table_options->filter_policy = policy;
|
|
812
|
+
table_options->partition_filters = partitioned;
|
|
813
|
+
if (partitioned) {
|
|
814
|
+
table_options->index_type =
|
|
815
|
+
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
816
|
+
} else {
|
|
817
|
+
table_options->index_type =
|
|
818
|
+
BlockBasedTableOptions::IndexType::kBinarySearch;
|
|
819
|
+
}
|
|
820
|
+
table_options->format_version = format_version;
|
|
821
|
+
}
|
|
822
|
+
};
|
|
823
|
+
// High bits per key -> almost no FPs
|
|
824
|
+
std::shared_ptr<const FilterPolicy> kCompatibilityBloomPolicy{
|
|
825
|
+
NewBloomFilterPolicy(20)};
|
|
826
|
+
// bloom_before_level=-1 -> always use Ribbon
|
|
827
|
+
std::shared_ptr<const FilterPolicy> kCompatibilityRibbonPolicy{
|
|
828
|
+
NewRibbonFilterPolicy(20, -1)};
|
|
829
|
+
|
|
830
|
+
std::vector<CompatibilityConfig> kCompatibilityConfigs = {
|
|
831
|
+
{Create(20, kDeprecatedBlock), false,
|
|
832
|
+
BlockBasedTableOptions().format_version},
|
|
833
|
+
{kCompatibilityBloomPolicy, false, BlockBasedTableOptions().format_version},
|
|
834
|
+
{kCompatibilityBloomPolicy, true, BlockBasedTableOptions().format_version},
|
|
835
|
+
{kCompatibilityBloomPolicy, false, /* legacy Bloom */ 4U},
|
|
836
|
+
{kCompatibilityRibbonPolicy, false,
|
|
837
|
+
BlockBasedTableOptions().format_version},
|
|
838
|
+
{kCompatibilityRibbonPolicy, true, BlockBasedTableOptions().format_version},
|
|
839
|
+
};
|
|
840
|
+
} // namespace
|
|
841
|
+
|
|
570
842
|
TEST_F(DBBloomFilterTest, BloomFilterCompatibility) {
|
|
571
843
|
Options options = CurrentOptions();
|
|
572
844
|
options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
options.
|
|
845
|
+
options.level0_file_num_compaction_trigger =
|
|
846
|
+
static_cast<int>(kCompatibilityConfigs.size()) + 1;
|
|
847
|
+
options.max_open_files = -1;
|
|
576
848
|
|
|
577
|
-
|
|
578
|
-
CreateAndReopenWithCF({"pikachu"}, options);
|
|
849
|
+
Close();
|
|
579
850
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
851
|
+
// Create one file for each kind of filter. Each file covers a distinct key
|
|
852
|
+
// range.
|
|
853
|
+
for (size_t i = 0; i < kCompatibilityConfigs.size(); ++i) {
|
|
854
|
+
BlockBasedTableOptions table_options;
|
|
855
|
+
kCompatibilityConfigs[i].SetInTableOptions(&table_options);
|
|
856
|
+
ASSERT_TRUE(table_options.filter_policy != nullptr);
|
|
857
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
858
|
+
Reopen(options);
|
|
859
|
+
|
|
860
|
+
std::string prefix = ToString(i) + "_";
|
|
861
|
+
ASSERT_OK(Put(prefix + "A", "val"));
|
|
862
|
+
ASSERT_OK(Put(prefix + "Z", "val"));
|
|
863
|
+
ASSERT_OK(Flush());
|
|
583
864
|
}
|
|
584
|
-
ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
|
|
585
|
-
Flush(1);
|
|
586
865
|
|
|
587
|
-
//
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
866
|
+
// Test filter is used between each pair of {reader,writer} configurations,
|
|
867
|
+
// because any built-in FilterPolicy should be able to read filters from any
|
|
868
|
+
// other built-in FilterPolicy
|
|
869
|
+
for (size_t i = 0; i < kCompatibilityConfigs.size(); ++i) {
|
|
870
|
+
BlockBasedTableOptions table_options;
|
|
871
|
+
kCompatibilityConfigs[i].SetInTableOptions(&table_options);
|
|
872
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
873
|
+
Reopen(options);
|
|
874
|
+
for (size_t j = 0; j < kCompatibilityConfigs.size(); ++j) {
|
|
875
|
+
std::string prefix = ToString(j) + "_";
|
|
876
|
+
ASSERT_EQ("val", Get(prefix + "A")); // Filter positive
|
|
877
|
+
ASSERT_EQ("val", Get(prefix + "Z")); // Filter positive
|
|
878
|
+
// Filter negative, with high probability
|
|
879
|
+
ASSERT_EQ("NOT_FOUND", Get(prefix + "Q"));
|
|
880
|
+
// FULL_POSITIVE does not include block-based filter case (j == 0)
|
|
881
|
+
EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_FULL_POSITIVE),
|
|
882
|
+
j == 0 ? 0 : 2);
|
|
883
|
+
EXPECT_EQ(TestGetAndResetTickerCount(options, BLOOM_FILTER_USEFUL), 1);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
}
|
|
591
887
|
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
888
|
+
/*
|
|
889
|
+
* A cache wrapper that tracks peaks and increments of filter
|
|
890
|
+
* construction cache reservation.
|
|
891
|
+
* p0
|
|
892
|
+
* / \ p1
|
|
893
|
+
* / \ /\
|
|
894
|
+
* / \/ \
|
|
895
|
+
* a / b \
|
|
896
|
+
* peaks = {p0, p1}
|
|
897
|
+
* increments = {p1-a, p2-b}
|
|
898
|
+
*/
|
|
899
|
+
class FilterConstructResPeakTrackingCache : public CacheWrapper {
|
|
900
|
+
public:
|
|
901
|
+
explicit FilterConstructResPeakTrackingCache(std::shared_ptr<Cache> target)
|
|
902
|
+
: CacheWrapper(std::move(target)),
|
|
903
|
+
cur_cache_res_(0),
|
|
904
|
+
cache_res_peak_(0),
|
|
905
|
+
cache_res_increment_(0),
|
|
906
|
+
last_peak_tracked_(false),
|
|
907
|
+
cache_res_increments_sum_(0) {}
|
|
908
|
+
|
|
909
|
+
using Cache::Insert;
|
|
910
|
+
Status Insert(const Slice& key, void* value, size_t charge,
|
|
911
|
+
void (*deleter)(const Slice& key, void* value),
|
|
912
|
+
Handle** handle = nullptr,
|
|
913
|
+
Priority priority = Priority::LOW) override {
|
|
914
|
+
Status s = target_->Insert(key, value, charge, deleter, handle, priority);
|
|
915
|
+
if (deleter == kNoopDeleterForFilterConstruction) {
|
|
916
|
+
if (last_peak_tracked_) {
|
|
917
|
+
cache_res_peak_ = 0;
|
|
918
|
+
cache_res_increment_ = 0;
|
|
919
|
+
last_peak_tracked_ = false;
|
|
920
|
+
}
|
|
921
|
+
cur_cache_res_ += charge;
|
|
922
|
+
cache_res_peak_ = std::max(cache_res_peak_, cur_cache_res_);
|
|
923
|
+
cache_res_increment_ += charge;
|
|
924
|
+
}
|
|
925
|
+
return s;
|
|
595
926
|
}
|
|
596
|
-
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
|
|
597
927
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
928
|
+
using Cache::Release;
|
|
929
|
+
bool Release(Handle* handle, bool erase_if_last_ref = false) override {
|
|
930
|
+
auto deleter = GetDeleter(handle);
|
|
931
|
+
if (deleter == kNoopDeleterForFilterConstruction) {
|
|
932
|
+
if (!last_peak_tracked_) {
|
|
933
|
+
cache_res_peaks_.push_back(cache_res_peak_);
|
|
934
|
+
cache_res_increments_sum_ += cache_res_increment_;
|
|
935
|
+
last_peak_tracked_ = true;
|
|
936
|
+
}
|
|
937
|
+
cur_cache_res_ -= GetCharge(handle);
|
|
938
|
+
}
|
|
939
|
+
bool is_successful = target_->Release(handle, erase_if_last_ref);
|
|
940
|
+
return is_successful;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
std::deque<std::size_t> GetReservedCachePeaks() { return cache_res_peaks_; }
|
|
605
944
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
ASSERT_EQ(Key(i), Get(1, Key(i)));
|
|
945
|
+
std::size_t GetReservedCacheIncrementSum() {
|
|
946
|
+
return cache_res_increments_sum_;
|
|
609
947
|
}
|
|
610
|
-
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
|
|
611
|
-
}
|
|
612
948
|
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
949
|
+
private:
|
|
950
|
+
static const Cache::DeleterFn kNoopDeleterForFilterConstruction;
|
|
951
|
+
|
|
952
|
+
std::size_t cur_cache_res_;
|
|
953
|
+
std::size_t cache_res_peak_;
|
|
954
|
+
std::size_t cache_res_increment_;
|
|
955
|
+
bool last_peak_tracked_;
|
|
956
|
+
std::deque<std::size_t> cache_res_peaks_;
|
|
957
|
+
std::size_t cache_res_increments_sum_;
|
|
958
|
+
};
|
|
959
|
+
|
|
960
|
+
const Cache::DeleterFn
|
|
961
|
+
FilterConstructResPeakTrackingCache::kNoopDeleterForFilterConstruction =
|
|
962
|
+
CacheReservationManagerImpl<
|
|
963
|
+
CacheEntryRole::kFilterConstruction>::TEST_GetNoopDeleterForRole();
|
|
964
|
+
|
|
965
|
+
// To align with the type of hash entry being reserved in implementation.
|
|
966
|
+
using FilterConstructionReserveMemoryHash = uint64_t;
|
|
967
|
+
|
|
968
|
+
class DBFilterConstructionReserveMemoryTestWithParam
|
|
969
|
+
: public DBTestBase,
|
|
970
|
+
public testing::WithParamInterface<
|
|
971
|
+
std::tuple<bool, std::string, bool, bool>> {
|
|
972
|
+
public:
|
|
973
|
+
DBFilterConstructionReserveMemoryTestWithParam()
|
|
974
|
+
: DBTestBase("db_bloom_filter_tests",
|
|
975
|
+
/*env_do_fsync=*/true),
|
|
976
|
+
num_key_(0),
|
|
977
|
+
reserve_table_builder_memory_(std::get<0>(GetParam())),
|
|
978
|
+
policy_(std::get<1>(GetParam())),
|
|
979
|
+
partition_filters_(std::get<2>(GetParam())),
|
|
980
|
+
detect_filter_construct_corruption_(std::get<3>(GetParam())) {
|
|
981
|
+
if (!reserve_table_builder_memory_ || policy_ == kDeprecatedBlock ||
|
|
982
|
+
policy_ == kLegacyBloom) {
|
|
983
|
+
// For these cases, we only interested in whether filter construction
|
|
984
|
+
// cache resevation happens instead of its accuracy. Therefore we don't
|
|
985
|
+
// need many keys.
|
|
986
|
+
num_key_ = 5;
|
|
987
|
+
} else if (partition_filters_) {
|
|
988
|
+
// For PartitionFilter case, since we set
|
|
989
|
+
// table_options.metadata_block_size big enough such that each partition
|
|
990
|
+
// trigger at least 1 dummy entry reservation each for hash entries and
|
|
991
|
+
// final filter, we need a large number of keys to ensure we have at least
|
|
992
|
+
// two partitions.
|
|
993
|
+
num_key_ = 18 *
|
|
994
|
+
CacheReservationManagerImpl<
|
|
995
|
+
CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
|
|
996
|
+
sizeof(FilterConstructionReserveMemoryHash);
|
|
997
|
+
} else if (policy_ == kFastLocalBloom) {
|
|
998
|
+
// For Bloom Filter + FullFilter case, since we design the num_key_ to
|
|
999
|
+
// make hash entry cache reservation be a multiple of dummy entries, the
|
|
1000
|
+
// correct behavior of charging final filter on top of it will trigger at
|
|
1001
|
+
// least another dummy entry insertion. Therefore we can assert that
|
|
1002
|
+
// behavior and we don't need a large number of keys to verify we
|
|
1003
|
+
// indeed charge the final filter for cache reservation, even though final
|
|
1004
|
+
// filter is a lot smaller than hash entries.
|
|
1005
|
+
num_key_ = 1 *
|
|
1006
|
+
CacheReservationManagerImpl<
|
|
1007
|
+
CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
|
|
1008
|
+
sizeof(FilterConstructionReserveMemoryHash);
|
|
1009
|
+
} else {
|
|
1010
|
+
// For Ribbon Filter + FullFilter case, we need a large enough number of
|
|
1011
|
+
// keys so that charging final filter after releasing the hash entries
|
|
1012
|
+
// reservation will trigger at least another dummy entry (or equivalently
|
|
1013
|
+
// to saying, causing another peak in cache reservation) as banding
|
|
1014
|
+
// reservation might not be a multiple of dummy entry.
|
|
1015
|
+
num_key_ = 12 *
|
|
1016
|
+
CacheReservationManagerImpl<
|
|
1017
|
+
CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
|
|
1018
|
+
sizeof(FilterConstructionReserveMemoryHash);
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
BlockBasedTableOptions GetBlockBasedTableOptions() {
|
|
617
1023
|
BlockBasedTableOptions table_options;
|
|
618
|
-
|
|
619
|
-
|
|
1024
|
+
|
|
1025
|
+
// We set cache capacity big enough to prevent cache full for convenience in
|
|
1026
|
+
// calculation.
|
|
1027
|
+
constexpr std::size_t kCacheCapacity = 100 * 1024 * 1024;
|
|
1028
|
+
|
|
1029
|
+
table_options.reserve_table_builder_memory = reserve_table_builder_memory_;
|
|
1030
|
+
table_options.filter_policy = Create(10, policy_);
|
|
1031
|
+
table_options.partition_filters = partition_filters_;
|
|
1032
|
+
if (table_options.partition_filters) {
|
|
620
1033
|
table_options.index_type =
|
|
621
1034
|
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1035
|
+
// We set table_options.metadata_block_size big enough so that each
|
|
1036
|
+
// partition trigger at least 1 dummy entry insertion each for hash
|
|
1037
|
+
// entries and final filter.
|
|
1038
|
+
table_options.metadata_block_size = 409000;
|
|
622
1039
|
}
|
|
623
|
-
table_options.
|
|
624
|
-
|
|
625
|
-
|
|
1040
|
+
table_options.detect_filter_construct_corruption =
|
|
1041
|
+
detect_filter_construct_corruption_;
|
|
1042
|
+
|
|
1043
|
+
LRUCacheOptions lo;
|
|
1044
|
+
lo.capacity = kCacheCapacity;
|
|
1045
|
+
lo.num_shard_bits = 0; // 2^0 shard
|
|
1046
|
+
lo.strict_capacity_limit = true;
|
|
1047
|
+
cache_ = std::make_shared<FilterConstructResPeakTrackingCache>(
|
|
1048
|
+
(NewLRUCache(lo)));
|
|
1049
|
+
table_options.block_cache = cache_;
|
|
1050
|
+
|
|
1051
|
+
return table_options;
|
|
1052
|
+
}
|
|
626
1053
|
|
|
627
|
-
|
|
628
|
-
CreateAndReopenWithCF({"pikachu"}, options);
|
|
1054
|
+
std::size_t GetNumKey() { return num_key_; }
|
|
629
1055
|
|
|
630
|
-
|
|
631
|
-
for (int i = 0; i < maxKey; i++) {
|
|
632
|
-
ASSERT_OK(Put(1, Key(i), Key(i)));
|
|
633
|
-
}
|
|
634
|
-
ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
|
|
635
|
-
Flush(1);
|
|
1056
|
+
bool ReserveTableBuilderMemory() { return reserve_table_builder_memory_; }
|
|
636
1057
|
|
|
637
|
-
|
|
638
|
-
table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));
|
|
639
|
-
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
640
|
-
ReopenWithColumnFamilies({"default", "pikachu"}, options);
|
|
1058
|
+
std::string GetFilterPolicy() { return policy_; }
|
|
641
1059
|
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
1060
|
+
bool PartitionFilters() { return partition_filters_; }
|
|
1061
|
+
|
|
1062
|
+
std::shared_ptr<FilterConstructResPeakTrackingCache>
|
|
1063
|
+
GetFilterConstructResPeakTrackingCache() {
|
|
1064
|
+
return cache_;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
private:
|
|
1068
|
+
std::size_t num_key_;
|
|
1069
|
+
bool reserve_table_builder_memory_;
|
|
1070
|
+
std::string policy_;
|
|
1071
|
+
bool partition_filters_;
|
|
1072
|
+
std::shared_ptr<FilterConstructResPeakTrackingCache> cache_;
|
|
1073
|
+
bool detect_filter_construct_corruption_;
|
|
1074
|
+
};
|
|
1075
|
+
|
|
1076
|
+
INSTANTIATE_TEST_CASE_P(
|
|
1077
|
+
DBFilterConstructionReserveMemoryTestWithParam,
|
|
1078
|
+
DBFilterConstructionReserveMemoryTestWithParam,
|
|
1079
|
+
::testing::Values(std::make_tuple(false, kFastLocalBloom, false, false),
|
|
1080
|
+
|
|
1081
|
+
std::make_tuple(true, kFastLocalBloom, false, false),
|
|
1082
|
+
std::make_tuple(true, kFastLocalBloom, false, true),
|
|
1083
|
+
std::make_tuple(true, kFastLocalBloom, true, false),
|
|
1084
|
+
std::make_tuple(true, kFastLocalBloom, true, true),
|
|
1085
|
+
|
|
1086
|
+
std::make_tuple(true, kStandard128Ribbon, false, false),
|
|
1087
|
+
std::make_tuple(true, kStandard128Ribbon, false, true),
|
|
1088
|
+
std::make_tuple(true, kStandard128Ribbon, true, false),
|
|
1089
|
+
std::make_tuple(true, kStandard128Ribbon, true, true),
|
|
1090
|
+
|
|
1091
|
+
std::make_tuple(true, kDeprecatedBlock, false, false),
|
|
1092
|
+
std::make_tuple(true, kLegacyBloom, false, false)));
|
|
1093
|
+
|
|
1094
|
+
// TODO: Speed up this test, and reduce disk space usage (~700MB)
|
|
1095
|
+
// The current test inserts many keys (on the scale of dummy entry size)
|
|
1096
|
+
// in order to make small memory user (e.g, final filter, partitioned hash
|
|
1097
|
+
// entries/filter/banding) , which is proportional to the number of
|
|
1098
|
+
// keys, big enough so that its cache reservation triggers dummy entry insertion
|
|
1099
|
+
// and becomes observable in the test.
|
|
1100
|
+
//
|
|
1101
|
+
// However, inserting that many keys slows down this test and leaves future
|
|
1102
|
+
// developers an opportunity to speed it up.
|
|
1103
|
+
//
|
|
1104
|
+
// Possible approaches & challenges:
|
|
1105
|
+
// 1. Use sync point during cache reservation of filter construction
|
|
1106
|
+
//
|
|
1107
|
+
// Benefit: It does not rely on triggering dummy entry insertion
|
|
1108
|
+
// but the sync point to verify small memory user is charged correctly.
|
|
1109
|
+
//
|
|
1110
|
+
// Challenge: this approach is intrusive.
|
|
1111
|
+
//
|
|
1112
|
+
// 2. Make dummy entry size configurable and set it small in the test
|
|
1113
|
+
//
|
|
1114
|
+
// Benefit: It increases the precision of cache reservation and therefore
|
|
1115
|
+
// small memory usage can still trigger insertion of dummy entry.
|
|
1116
|
+
//
|
|
1117
|
+
// Challenge: change CacheReservationManager related APIs and a hack
|
|
1118
|
+
// might be needed to control the size of dummmy entry of
|
|
1119
|
+
// CacheReservationManager used in filter construction for testing
|
|
1120
|
+
// since CacheReservationManager is not exposed at the high level.
|
|
1121
|
+
//
|
|
1122
|
+
TEST_P(DBFilterConstructionReserveMemoryTestWithParam, ReserveMemory) {
|
|
1123
|
+
Options options = CurrentOptions();
|
|
1124
|
+
// We set write_buffer_size big enough so that in the case where there is
|
|
1125
|
+
// filter construction cache reservation, flush won't be triggered before we
|
|
1126
|
+
// manually trigger it for clean testing
|
|
1127
|
+
options.write_buffer_size = 640 << 20;
|
|
1128
|
+
BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
|
|
1129
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1130
|
+
std::shared_ptr<FilterConstructResPeakTrackingCache> cache =
|
|
1131
|
+
GetFilterConstructResPeakTrackingCache();
|
|
1132
|
+
options.create_if_missing = true;
|
|
1133
|
+
// Disable auto compaction to prevent its unexpected side effect
|
|
1134
|
+
// to the number of keys per partition designed by us in the test
|
|
1135
|
+
options.disable_auto_compactions = true;
|
|
1136
|
+
DestroyAndReopen(options);
|
|
1137
|
+
int num_key = static_cast<int>(GetNumKey());
|
|
1138
|
+
for (int i = 0; i < num_key; i++) {
|
|
1139
|
+
ASSERT_OK(Put(Key(i), Key(i)));
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
ASSERT_EQ(cache->GetReservedCacheIncrementSum(), 0)
|
|
1143
|
+
<< "Flush was triggered too early in the test case with filter "
|
|
1144
|
+
"construction cache reservation - please make sure no flush triggered "
|
|
1145
|
+
"during the key insertions above";
|
|
1146
|
+
|
|
1147
|
+
ASSERT_OK(Flush());
|
|
1148
|
+
|
|
1149
|
+
bool reserve_table_builder_memory = ReserveTableBuilderMemory();
|
|
1150
|
+
std::string policy = GetFilterPolicy();
|
|
1151
|
+
bool partition_filters = PartitionFilters();
|
|
1152
|
+
bool detect_filter_construct_corruption =
|
|
1153
|
+
table_options.detect_filter_construct_corruption;
|
|
1154
|
+
|
|
1155
|
+
std::deque<std::size_t> filter_construction_cache_res_peaks =
|
|
1156
|
+
cache->GetReservedCachePeaks();
|
|
1157
|
+
std::size_t filter_construction_cache_res_increments_sum =
|
|
1158
|
+
cache->GetReservedCacheIncrementSum();
|
|
1159
|
+
|
|
1160
|
+
if (!reserve_table_builder_memory) {
|
|
1161
|
+
EXPECT_EQ(filter_construction_cache_res_peaks.size(), 0);
|
|
1162
|
+
return;
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
if (policy == kDeprecatedBlock || policy == kLegacyBloom) {
|
|
1166
|
+
EXPECT_EQ(filter_construction_cache_res_peaks.size(), 0)
|
|
1167
|
+
<< "There shouldn't be filter construction cache reservation as this "
|
|
1168
|
+
"feature does not support kDeprecatedBlock "
|
|
1169
|
+
"nor kLegacyBloom";
|
|
1170
|
+
return;
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
const std::size_t kDummyEntrySize = CacheReservationManagerImpl<
|
|
1174
|
+
CacheEntryRole::kFilterConstruction>::GetDummyEntrySize();
|
|
1175
|
+
|
|
1176
|
+
const std::size_t predicted_hash_entries_cache_res =
|
|
1177
|
+
num_key * sizeof(FilterConstructionReserveMemoryHash);
|
|
1178
|
+
ASSERT_EQ(predicted_hash_entries_cache_res % kDummyEntrySize, 0)
|
|
1179
|
+
<< "It's by this test's design that predicted_hash_entries_cache_res is "
|
|
1180
|
+
"a multipe of dummy entry";
|
|
1181
|
+
|
|
1182
|
+
const std::size_t predicted_hash_entries_cache_res_dummy_entry_num =
|
|
1183
|
+
predicted_hash_entries_cache_res / kDummyEntrySize;
|
|
1184
|
+
const std::size_t predicted_final_filter_cache_res =
|
|
1185
|
+
static_cast<std::size_t>(
|
|
1186
|
+
std::ceil(1.0 * predicted_hash_entries_cache_res_dummy_entry_num / 6 *
|
|
1187
|
+
(policy == kStandard128Ribbon ? 0.7 : 1))) *
|
|
1188
|
+
kDummyEntrySize;
|
|
1189
|
+
const std::size_t predicted_banding_cache_res =
|
|
1190
|
+
static_cast<std::size_t>(
|
|
1191
|
+
std::ceil(predicted_hash_entries_cache_res_dummy_entry_num * 2.5)) *
|
|
1192
|
+
kDummyEntrySize;
|
|
1193
|
+
|
|
1194
|
+
if (policy == kFastLocalBloom) {
|
|
1195
|
+
/* kFastLocalBloom + FullFilter
|
|
1196
|
+
* p0
|
|
1197
|
+
* / \
|
|
1198
|
+
* b / \
|
|
1199
|
+
* / \
|
|
1200
|
+
* / \
|
|
1201
|
+
* 0/ \
|
|
1202
|
+
* hash entries = b - 0, final filter = p0 - b
|
|
1203
|
+
* p0 = hash entries + final filter
|
|
1204
|
+
*
|
|
1205
|
+
* The test is designed in a way such that the reservation for b is a
|
|
1206
|
+
* multiple of dummy entries so that reservation for (p0 - b)
|
|
1207
|
+
* will trigger at least another dummy entry insertion.
|
|
1208
|
+
*
|
|
1209
|
+
* kFastLocalBloom + FullFilter +
|
|
1210
|
+
* detect_filter_construct_corruption
|
|
1211
|
+
* The peak p0 stays the same as
|
|
1212
|
+
* (kFastLocalBloom + FullFilter) but just lasts
|
|
1213
|
+
* longer since we release hash entries reservation later.
|
|
1214
|
+
*
|
|
1215
|
+
* kFastLocalBloom + PartitionedFilter
|
|
1216
|
+
* p1
|
|
1217
|
+
* / \
|
|
1218
|
+
* p0 b'/ \
|
|
1219
|
+
* / \ / \
|
|
1220
|
+
* b / \ / \
|
|
1221
|
+
* / \ / \
|
|
1222
|
+
* / a \
|
|
1223
|
+
* 0/ \
|
|
1224
|
+
* partitioned hash entries1 = b - 0, partitioned hash entries1 = b' - a
|
|
1225
|
+
* parittioned final filter1 = p0 - b, parittioned final filter2 = p1 - b'
|
|
1226
|
+
*
|
|
1227
|
+
* (increment p0 - 0) + (increment p1 - a)
|
|
1228
|
+
* = partitioned hash entries1 + partitioned hash entries2
|
|
1229
|
+
* + parittioned final filter1 + parittioned final filter2
|
|
1230
|
+
* = hash entries + final filter
|
|
1231
|
+
*
|
|
1232
|
+
* kFastLocalBloom + PartitionedFilter +
|
|
1233
|
+
* detect_filter_construct_corruption
|
|
1234
|
+
* The peak p0, p1 stay the same as
|
|
1235
|
+
* (kFastLocalBloom + PartitionedFilter) but just
|
|
1236
|
+
* last longer since we release hash entries reservation later.
|
|
1237
|
+
*
|
|
1238
|
+
*/
|
|
1239
|
+
if (!partition_filters) {
|
|
1240
|
+
EXPECT_EQ(filter_construction_cache_res_peaks.size(), 1)
|
|
1241
|
+
<< "Filter construction cache reservation should have only 1 peak in "
|
|
1242
|
+
"case: kFastLocalBloom + FullFilter";
|
|
1243
|
+
std::size_t filter_construction_cache_res_peak =
|
|
1244
|
+
filter_construction_cache_res_peaks[0];
|
|
1245
|
+
EXPECT_GT(filter_construction_cache_res_peak,
|
|
1246
|
+
predicted_hash_entries_cache_res)
|
|
1247
|
+
<< "The testing number of hash entries is designed to make hash "
|
|
1248
|
+
"entries cache reservation be multiples of dummy entries"
|
|
1249
|
+
" so the correct behavior of charging final filter on top of it"
|
|
1250
|
+
" should've triggered at least another dummy entry insertion";
|
|
1251
|
+
|
|
1252
|
+
std::size_t predicted_filter_construction_cache_res_peak =
|
|
1253
|
+
predicted_hash_entries_cache_res + predicted_final_filter_cache_res;
|
|
1254
|
+
EXPECT_GE(filter_construction_cache_res_peak,
|
|
1255
|
+
predicted_filter_construction_cache_res_peak * 0.9);
|
|
1256
|
+
EXPECT_LE(filter_construction_cache_res_peak,
|
|
1257
|
+
predicted_filter_construction_cache_res_peak * 1.1);
|
|
1258
|
+
return;
|
|
1259
|
+
} else {
|
|
1260
|
+
EXPECT_GE(filter_construction_cache_res_peaks.size(), 2)
|
|
1261
|
+
<< "Filter construction cache reservation should have multiple peaks "
|
|
1262
|
+
"in case: kFastLocalBloom + "
|
|
1263
|
+
"PartitionedFilter";
|
|
1264
|
+
std::size_t predicted_filter_construction_cache_res_increments_sum =
|
|
1265
|
+
predicted_hash_entries_cache_res + predicted_final_filter_cache_res;
|
|
1266
|
+
EXPECT_GE(filter_construction_cache_res_increments_sum,
|
|
1267
|
+
predicted_filter_construction_cache_res_increments_sum * 0.9);
|
|
1268
|
+
EXPECT_LE(filter_construction_cache_res_increments_sum,
|
|
1269
|
+
predicted_filter_construction_cache_res_increments_sum * 1.1);
|
|
1270
|
+
return;
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
if (policy == kStandard128Ribbon) {
|
|
1275
|
+
/* kStandard128Ribbon + FullFilter
|
|
1276
|
+
* p0
|
|
1277
|
+
* / \ p1
|
|
1278
|
+
* / \/\
|
|
1279
|
+
* b / b' \
|
|
1280
|
+
* / \
|
|
1281
|
+
* 0/ \
|
|
1282
|
+
* hash entries = b - 0, banding = p0 - b, final filter = p1 - b'
|
|
1283
|
+
* p0 = hash entries + banding
|
|
1284
|
+
*
|
|
1285
|
+
* The test is designed in a way such that the reservation for (p1 - b')
|
|
1286
|
+
* will trigger at least another dummy entry insertion
|
|
1287
|
+
* (or equivelantly to saying, creating another peak).
|
|
1288
|
+
*
|
|
1289
|
+
* kStandard128Ribbon + FullFilter +
|
|
1290
|
+
* detect_filter_construct_corruption
|
|
1291
|
+
*
|
|
1292
|
+
* new p0
|
|
1293
|
+
* / \
|
|
1294
|
+
* / \
|
|
1295
|
+
* pre p0 \
|
|
1296
|
+
* / \
|
|
1297
|
+
* / \
|
|
1298
|
+
* b / \
|
|
1299
|
+
* / \
|
|
1300
|
+
* 0/ \
|
|
1301
|
+
* hash entries = b - 0, banding = pre p0 - b,
|
|
1302
|
+
* final filter = new p0 - pre p0
|
|
1303
|
+
* new p0 = hash entries + banding + final filter
|
|
1304
|
+
*
|
|
1305
|
+
* The previous p0 will no longer be a peak since under
|
|
1306
|
+
* detect_filter_construct_corruption == true, we do not release hash
|
|
1307
|
+
* entries reserveration (like p0 - b' previously) until after final filter
|
|
1308
|
+
* creation and post-verification
|
|
1309
|
+
*
|
|
1310
|
+
* kStandard128Ribbon + PartitionedFilter
|
|
1311
|
+
* p3
|
|
1312
|
+
* p0 /\ p4
|
|
1313
|
+
* / \ p1 / \ /\
|
|
1314
|
+
* / \/\ b''/ a' \
|
|
1315
|
+
* b / b' \ / \
|
|
1316
|
+
* / \ / \
|
|
1317
|
+
* 0/ a \
|
|
1318
|
+
* partitioned hash entries1 = b - 0, partitioned hash entries2 = b'' - a
|
|
1319
|
+
* partitioned banding1 = p0 - b, partitioned banding2 = p3 - b''
|
|
1320
|
+
* parittioned final filter1 = p1 - b',parittioned final filter2 = p4 - a'
|
|
1321
|
+
*
|
|
1322
|
+
* (increment p0 - 0) + (increment p1 - b')
|
|
1323
|
+
* + (increment p3 - a) + (increment p4 - a')
|
|
1324
|
+
* = partitioned hash entries1 + partitioned hash entries2
|
|
1325
|
+
* + parittioned banding1 + parittioned banding2
|
|
1326
|
+
* + parittioned final filter1 + parittioned final filter2
|
|
1327
|
+
* = hash entries + banding + final filter
|
|
1328
|
+
*
|
|
1329
|
+
* kStandard128Ribbon + PartitionedFilter +
|
|
1330
|
+
* detect_filter_construct_corruption
|
|
1331
|
+
*
|
|
1332
|
+
* new p3
|
|
1333
|
+
* / \
|
|
1334
|
+
* pre p3 \
|
|
1335
|
+
* new p0 / \
|
|
1336
|
+
* / \ / \
|
|
1337
|
+
* pre p0 \ / \
|
|
1338
|
+
* / \ b'/ \
|
|
1339
|
+
* / \ / \
|
|
1340
|
+
* b / \ / \
|
|
1341
|
+
* / \a \
|
|
1342
|
+
* 0/ \
|
|
1343
|
+
* partitioned hash entries1 = b - 0, partitioned hash entries2 = b' - a
|
|
1344
|
+
* partitioned banding1 = pre p0 - b, partitioned banding2 = pre p3 - b'
|
|
1345
|
+
* parittioned final filter1 = new p0 - pre p0,
|
|
1346
|
+
* parittioned final filter2 = new p3 - pre p3
|
|
1347
|
+
*
|
|
1348
|
+
* The previous p0 and p3 will no longer be a peak since under
|
|
1349
|
+
* detect_filter_construct_corruption == true, we do not release hash
|
|
1350
|
+
* entries reserveration (like p0 - b', p3 - a' previously) until after
|
|
1351
|
+
* parittioned final filter creation and post-verification
|
|
1352
|
+
*
|
|
1353
|
+
* However, increments sum stay the same as shown below:
|
|
1354
|
+
* (increment new p0 - 0) + (increment new p3 - a)
|
|
1355
|
+
* = partitioned hash entries1 + partitioned hash entries2
|
|
1356
|
+
* + parittioned banding1 + parittioned banding2
|
|
1357
|
+
* + parittioned final filter1 + parittioned final filter2
|
|
1358
|
+
* = hash entries + banding + final filter
|
|
1359
|
+
*
|
|
1360
|
+
*/
|
|
1361
|
+
if (!partition_filters) {
|
|
1362
|
+
ASSERT_GE(
|
|
1363
|
+
std::floor(
|
|
1364
|
+
1.0 * predicted_final_filter_cache_res /
|
|
1365
|
+
CacheReservationManagerImpl<
|
|
1366
|
+
CacheEntryRole::kFilterConstruction>::GetDummyEntrySize()),
|
|
1367
|
+
1)
|
|
1368
|
+
<< "Final filter cache reservation too small for this test - please "
|
|
1369
|
+
"increase the number of keys";
|
|
1370
|
+
if (!detect_filter_construct_corruption) {
|
|
1371
|
+
EXPECT_EQ(filter_construction_cache_res_peaks.size(), 2)
|
|
1372
|
+
<< "Filter construction cache reservation should have 2 peaks in "
|
|
1373
|
+
"case: kStandard128Ribbon + "
|
|
1374
|
+
"FullFilter. "
|
|
1375
|
+
"The second peak is resulted from charging the final filter "
|
|
1376
|
+
"after "
|
|
1377
|
+
"decreasing the hash entry reservation since the testing final "
|
|
1378
|
+
"filter reservation is designed to be at least 1 dummy entry "
|
|
1379
|
+
"size";
|
|
1380
|
+
|
|
1381
|
+
std::size_t filter_construction_cache_res_peak =
|
|
1382
|
+
filter_construction_cache_res_peaks[0];
|
|
1383
|
+
std::size_t predicted_filter_construction_cache_res_peak =
|
|
1384
|
+
predicted_hash_entries_cache_res + predicted_banding_cache_res;
|
|
1385
|
+
EXPECT_GE(filter_construction_cache_res_peak,
|
|
1386
|
+
predicted_filter_construction_cache_res_peak * 0.9);
|
|
1387
|
+
EXPECT_LE(filter_construction_cache_res_peak,
|
|
1388
|
+
predicted_filter_construction_cache_res_peak * 1.1);
|
|
1389
|
+
} else {
|
|
1390
|
+
EXPECT_EQ(filter_construction_cache_res_peaks.size(), 1)
|
|
1391
|
+
<< "Filter construction cache reservation should have 1 peaks in "
|
|
1392
|
+
"case: kStandard128Ribbon + FullFilter "
|
|
1393
|
+
"+ detect_filter_construct_corruption. "
|
|
1394
|
+
"The previous second peak now disappears since we don't "
|
|
1395
|
+
"decrease the hash entry reservation"
|
|
1396
|
+
"until after final filter reservation and post-verification";
|
|
1397
|
+
|
|
1398
|
+
std::size_t filter_construction_cache_res_peak =
|
|
1399
|
+
filter_construction_cache_res_peaks[0];
|
|
1400
|
+
std::size_t predicted_filter_construction_cache_res_peak =
|
|
1401
|
+
predicted_hash_entries_cache_res + predicted_banding_cache_res +
|
|
1402
|
+
predicted_final_filter_cache_res;
|
|
1403
|
+
EXPECT_GE(filter_construction_cache_res_peak,
|
|
1404
|
+
predicted_filter_construction_cache_res_peak * 0.9);
|
|
1405
|
+
EXPECT_LE(filter_construction_cache_res_peak,
|
|
1406
|
+
predicted_filter_construction_cache_res_peak * 1.1);
|
|
1407
|
+
}
|
|
1408
|
+
return;
|
|
1409
|
+
} else {
|
|
1410
|
+
if (!detect_filter_construct_corruption) {
|
|
1411
|
+
EXPECT_GE(filter_construction_cache_res_peaks.size(), 3)
|
|
1412
|
+
<< "Filter construction cache reservation should have more than 3 "
|
|
1413
|
+
"peaks "
|
|
1414
|
+
"in case: kStandard128Ribbon + "
|
|
1415
|
+
"PartitionedFilter";
|
|
1416
|
+
} else {
|
|
1417
|
+
EXPECT_GE(filter_construction_cache_res_peaks.size(), 2)
|
|
1418
|
+
<< "Filter construction cache reservation should have more than 2 "
|
|
1419
|
+
"peaks "
|
|
1420
|
+
"in case: kStandard128Ribbon + "
|
|
1421
|
+
"PartitionedFilter + detect_filter_construct_corruption";
|
|
1422
|
+
}
|
|
1423
|
+
std::size_t predicted_filter_construction_cache_res_increments_sum =
|
|
1424
|
+
predicted_hash_entries_cache_res + predicted_banding_cache_res +
|
|
1425
|
+
predicted_final_filter_cache_res;
|
|
1426
|
+
EXPECT_GE(filter_construction_cache_res_increments_sum,
|
|
1427
|
+
predicted_filter_construction_cache_res_increments_sum * 0.9);
|
|
1428
|
+
EXPECT_LE(filter_construction_cache_res_increments_sum,
|
|
1429
|
+
predicted_filter_construction_cache_res_increments_sum * 1.1);
|
|
1430
|
+
return;
|
|
645
1431
|
}
|
|
646
|
-
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
|
|
647
1432
|
}
|
|
648
1433
|
}
|
|
649
1434
|
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
1435
|
+
class DBFilterConstructionCorruptionTestWithParam
|
|
1436
|
+
: public DBTestBase,
|
|
1437
|
+
public testing::WithParamInterface<
|
|
1438
|
+
std::tuple<bool /* detect_filter_construct_corruption */, std::string,
|
|
1439
|
+
bool /* partition_filters */>> {
|
|
653
1440
|
public:
|
|
654
|
-
|
|
655
|
-
:
|
|
1441
|
+
DBFilterConstructionCorruptionTestWithParam()
|
|
1442
|
+
: DBTestBase("db_bloom_filter_tests",
|
|
1443
|
+
/*env_do_fsync=*/true) {}
|
|
656
1444
|
|
|
657
|
-
|
|
1445
|
+
BlockBasedTableOptions GetBlockBasedTableOptions() {
|
|
1446
|
+
BlockBasedTableOptions table_options;
|
|
1447
|
+
table_options.detect_filter_construct_corruption = std::get<0>(GetParam());
|
|
1448
|
+
table_options.filter_policy = Create(10, std::get<1>(GetParam()));
|
|
1449
|
+
table_options.partition_filters = std::get<2>(GetParam());
|
|
1450
|
+
if (table_options.partition_filters) {
|
|
1451
|
+
table_options.index_type =
|
|
1452
|
+
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1453
|
+
// We set table_options.metadata_block_size small enough so we can
|
|
1454
|
+
// trigger filter partitioning with GetNumKey() amount of keys
|
|
1455
|
+
table_options.metadata_block_size = 10;
|
|
1456
|
+
}
|
|
658
1457
|
|
|
659
|
-
|
|
660
|
-
return "TestingWrappedBlockBasedFilterPolicy";
|
|
1458
|
+
return table_options;
|
|
661
1459
|
}
|
|
662
1460
|
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
1461
|
+
// Return an appropriate amount of keys for testing
|
|
1462
|
+
// to generate a long filter (i.e, size >= 8 + kMetadataLen)
|
|
1463
|
+
std::size_t GetNumKey() { return 5000; }
|
|
1464
|
+
};
|
|
1465
|
+
|
|
1466
|
+
INSTANTIATE_TEST_CASE_P(
|
|
1467
|
+
DBFilterConstructionCorruptionTestWithParam,
|
|
1468
|
+
DBFilterConstructionCorruptionTestWithParam,
|
|
1469
|
+
::testing::Values(std::make_tuple(false, kFastLocalBloom, false),
|
|
1470
|
+
std::make_tuple(true, kFastLocalBloom, false),
|
|
1471
|
+
std::make_tuple(true, kFastLocalBloom, true),
|
|
1472
|
+
std::make_tuple(true, kStandard128Ribbon, false),
|
|
1473
|
+
std::make_tuple(true, kStandard128Ribbon, true)));
|
|
1474
|
+
|
|
1475
|
+
TEST_P(DBFilterConstructionCorruptionTestWithParam, DetectCorruption) {
|
|
1476
|
+
Options options = CurrentOptions();
|
|
1477
|
+
BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
|
|
1478
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1479
|
+
options.create_if_missing = true;
|
|
1480
|
+
options.disable_auto_compactions = true;
|
|
1481
|
+
|
|
1482
|
+
DestroyAndReopen(options);
|
|
1483
|
+
int num_key = static_cast<int>(GetNumKey());
|
|
1484
|
+
Status s;
|
|
1485
|
+
|
|
1486
|
+
// Case 1: No corruption in filter construction
|
|
1487
|
+
for (int i = 0; i < num_key; i++) {
|
|
1488
|
+
ASSERT_OK(Put(Key(i), Key(i)));
|
|
671
1489
|
}
|
|
1490
|
+
s = Flush();
|
|
1491
|
+
EXPECT_TRUE(s.ok());
|
|
672
1492
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
return filter_->KeyMayMatch(convertKey(key), filter);
|
|
1493
|
+
// Case 2: Corruption of hash entries in filter construction
|
|
1494
|
+
for (int i = 0; i < num_key; i++) {
|
|
1495
|
+
ASSERT_OK(Put(Key(i), Key(i)));
|
|
677
1496
|
}
|
|
678
1497
|
|
|
679
|
-
|
|
1498
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1499
|
+
"XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
|
|
1500
|
+
std::deque<uint64_t>* hash_entries_to_corrupt =
|
|
1501
|
+
(std::deque<uint64_t>*)arg;
|
|
1502
|
+
assert(!hash_entries_to_corrupt->empty());
|
|
1503
|
+
*(hash_entries_to_corrupt->begin()) =
|
|
1504
|
+
*(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
|
|
1505
|
+
});
|
|
1506
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1507
|
+
|
|
1508
|
+
s = Flush();
|
|
1509
|
+
|
|
1510
|
+
if (table_options.detect_filter_construct_corruption) {
|
|
1511
|
+
EXPECT_TRUE(s.IsCorruption());
|
|
1512
|
+
EXPECT_TRUE(
|
|
1513
|
+
s.ToString().find("Filter's hash entries checksum mismatched") !=
|
|
1514
|
+
std::string::npos);
|
|
1515
|
+
} else {
|
|
1516
|
+
EXPECT_TRUE(s.ok());
|
|
1517
|
+
}
|
|
680
1518
|
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
1519
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1520
|
+
SyncPoint::GetInstance()->ClearCallBack(
|
|
1521
|
+
"XXPH3FilterBitsBuilder::Finish::"
|
|
1522
|
+
"TamperHashEntries");
|
|
684
1523
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
1524
|
+
// Case 3: Corruption of filter content in filter construction
|
|
1525
|
+
DestroyAndReopen(options);
|
|
1526
|
+
|
|
1527
|
+
for (int i = 0; i < num_key; i++) {
|
|
1528
|
+
ASSERT_OK(Put(Key(i), Key(i)));
|
|
688
1529
|
}
|
|
689
|
-
};
|
|
690
|
-
} // namespace
|
|
691
1530
|
|
|
692
|
-
|
|
1531
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1532
|
+
"XXPH3FilterBitsBuilder::Finish::TamperFilter", [&](void* arg) {
|
|
1533
|
+
std::pair<std::unique_ptr<char[]>*, std::size_t>* TEST_arg_pair =
|
|
1534
|
+
(std::pair<std::unique_ptr<char[]>*, std::size_t>*)arg;
|
|
1535
|
+
std::size_t filter_size = TEST_arg_pair->second;
|
|
1536
|
+
// 5 is the kMetadataLen and
|
|
1537
|
+
assert(filter_size >= 8 + 5);
|
|
1538
|
+
std::unique_ptr<char[]>* filter_content_to_corrupt =
|
|
1539
|
+
TEST_arg_pair->first;
|
|
1540
|
+
std::memset(filter_content_to_corrupt->get(), '\0', 8);
|
|
1541
|
+
});
|
|
1542
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1543
|
+
|
|
1544
|
+
s = Flush();
|
|
1545
|
+
|
|
1546
|
+
if (table_options.detect_filter_construct_corruption) {
|
|
1547
|
+
EXPECT_TRUE(s.IsCorruption());
|
|
1548
|
+
EXPECT_TRUE(s.ToString().find("Corrupted filter content") !=
|
|
1549
|
+
std::string::npos);
|
|
1550
|
+
} else {
|
|
1551
|
+
EXPECT_TRUE(s.ok());
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1555
|
+
SyncPoint::GetInstance()->ClearCallBack(
|
|
1556
|
+
"XXPH3FilterBitsBuilder::Finish::"
|
|
1557
|
+
"TamperFilter");
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
// RocksDB lite does not support dynamic options
|
|
1561
|
+
#ifndef ROCKSDB_LITE
|
|
1562
|
+
TEST_P(DBFilterConstructionCorruptionTestWithParam,
|
|
1563
|
+
DynamicallyTurnOnAndOffDetectConstructCorruption) {
|
|
693
1564
|
Options options = CurrentOptions();
|
|
694
|
-
|
|
1565
|
+
BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
|
|
1566
|
+
// We intend to turn on
|
|
1567
|
+
// table_options.detect_filter_construct_corruption dynamically
|
|
1568
|
+
// therefore we override this test parmater's value
|
|
1569
|
+
table_options.detect_filter_construct_corruption = false;
|
|
695
1570
|
|
|
696
|
-
BlockBasedTableOptions table_options;
|
|
697
|
-
TestingWrappedBlockBasedFilterPolicy* policy =
|
|
698
|
-
new TestingWrappedBlockBasedFilterPolicy(10);
|
|
699
|
-
table_options.filter_policy.reset(policy);
|
|
700
1571
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1572
|
+
options.create_if_missing = true;
|
|
701
1573
|
|
|
702
|
-
|
|
1574
|
+
int num_key = static_cast<int>(GetNumKey());
|
|
1575
|
+
Status s;
|
|
703
1576
|
|
|
704
|
-
|
|
705
|
-
for (int i = 0; i < maxKey; i++) {
|
|
706
|
-
ASSERT_OK(Put(1, Key(i), Key(i)));
|
|
707
|
-
}
|
|
708
|
-
// Add a large key to make the file contain wide range
|
|
709
|
-
ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
|
|
710
|
-
ASSERT_EQ(0U, policy->GetCounter());
|
|
711
|
-
Flush(1);
|
|
1577
|
+
DestroyAndReopen(options);
|
|
712
1578
|
|
|
713
|
-
//
|
|
714
|
-
for (int i = 0; i <
|
|
715
|
-
|
|
1579
|
+
// Case 1: !table_options.detect_filter_construct_corruption
|
|
1580
|
+
for (int i = 0; i < num_key; i++) {
|
|
1581
|
+
ASSERT_OK(Put(Key(i), Key(i)));
|
|
716
1582
|
}
|
|
717
|
-
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_USEFUL), 0);
|
|
718
|
-
ASSERT_EQ(1U * maxKey, policy->GetCounter());
|
|
719
1583
|
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
1584
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1585
|
+
"XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
|
|
1586
|
+
std::deque<uint64_t>* hash_entries_to_corrupt =
|
|
1587
|
+
(std::deque<uint64_t>*)arg;
|
|
1588
|
+
assert(!hash_entries_to_corrupt->empty());
|
|
1589
|
+
*(hash_entries_to_corrupt->begin()) =
|
|
1590
|
+
*(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
|
|
1591
|
+
});
|
|
1592
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1593
|
+
|
|
1594
|
+
s = Flush();
|
|
1595
|
+
|
|
1596
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1597
|
+
SyncPoint::GetInstance()->ClearCallBack(
|
|
1598
|
+
"XXPH3FilterBitsBuilder::Finish::"
|
|
1599
|
+
"TamperHashEntries");
|
|
1600
|
+
|
|
1601
|
+
ASSERT_FALSE(table_options.detect_filter_construct_corruption);
|
|
1602
|
+
EXPECT_TRUE(s.ok());
|
|
1603
|
+
|
|
1604
|
+
// Case 2: dynamically turn on
|
|
1605
|
+
// table_options.detect_filter_construct_corruption
|
|
1606
|
+
ASSERT_OK(db_->SetOptions({{"block_based_table_factory",
|
|
1607
|
+
"{detect_filter_construct_corruption=true;}"}}));
|
|
1608
|
+
|
|
1609
|
+
for (int i = 0; i < num_key; i++) {
|
|
1610
|
+
ASSERT_OK(Put(Key(i), Key(i)));
|
|
723
1611
|
}
|
|
724
|
-
|
|
725
|
-
|
|
1612
|
+
|
|
1613
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1614
|
+
"XXPH3FilterBitsBuilder::Finish::TamperHashEntries", [&](void* arg) {
|
|
1615
|
+
std::deque<uint64_t>* hash_entries_to_corrupt =
|
|
1616
|
+
(std::deque<uint64_t>*)arg;
|
|
1617
|
+
assert(!hash_entries_to_corrupt->empty());
|
|
1618
|
+
*(hash_entries_to_corrupt->begin()) =
|
|
1619
|
+
*(hash_entries_to_corrupt->begin()) ^ uint64_t { 1 };
|
|
1620
|
+
});
|
|
1621
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1622
|
+
|
|
1623
|
+
s = Flush();
|
|
1624
|
+
|
|
1625
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1626
|
+
SyncPoint::GetInstance()->ClearCallBack(
|
|
1627
|
+
"XXPH3FilterBitsBuilder::Finish::"
|
|
1628
|
+
"TamperHashEntries");
|
|
1629
|
+
|
|
1630
|
+
auto updated_table_options =
|
|
1631
|
+
db_->GetOptions().table_factory->GetOptions<BlockBasedTableOptions>();
|
|
1632
|
+
EXPECT_TRUE(updated_table_options->detect_filter_construct_corruption);
|
|
1633
|
+
EXPECT_TRUE(s.IsCorruption());
|
|
1634
|
+
EXPECT_TRUE(s.ToString().find("Filter's hash entries checksum mismatched") !=
|
|
1635
|
+
std::string::npos);
|
|
1636
|
+
|
|
1637
|
+
// Case 3: dynamically turn off
|
|
1638
|
+
// table_options.detect_filter_construct_corruption
|
|
1639
|
+
ASSERT_OK(db_->SetOptions({{"block_based_table_factory",
|
|
1640
|
+
"{detect_filter_construct_corruption=false;}"}}));
|
|
1641
|
+
updated_table_options =
|
|
1642
|
+
db_->GetOptions().table_factory->GetOptions<BlockBasedTableOptions>();
|
|
1643
|
+
EXPECT_FALSE(updated_table_options->detect_filter_construct_corruption);
|
|
726
1644
|
}
|
|
1645
|
+
#endif // ROCKSDB_LITE
|
|
727
1646
|
|
|
728
1647
|
namespace {
|
|
729
1648
|
// NOTE: This class is referenced by HISTORY.md as a model for a wrapper
|
|
@@ -736,9 +1655,15 @@ class LevelAndStyleCustomFilterPolicy : public FilterPolicy {
|
|
|
736
1655
|
policy_l0_other_(NewBloomFilterPolicy(bpk_l0_other)),
|
|
737
1656
|
policy_otherwise_(NewBloomFilterPolicy(bpk_otherwise)) {}
|
|
738
1657
|
|
|
1658
|
+
const char* Name() const override {
|
|
1659
|
+
return "LevelAndStyleCustomFilterPolicy";
|
|
1660
|
+
}
|
|
1661
|
+
|
|
739
1662
|
// OK to use built-in policy name because we are deferring to a
|
|
740
1663
|
// built-in builder. We aren't changing the serialized format.
|
|
741
|
-
const char*
|
|
1664
|
+
const char* CompatibilityName() const override {
|
|
1665
|
+
return policy_fifo_->CompatibilityName();
|
|
1666
|
+
}
|
|
742
1667
|
|
|
743
1668
|
FilterBitsBuilder* GetBuilderWithContext(
|
|
744
1669
|
const FilterBuildingContext& context) const override {
|
|
@@ -757,20 +1682,20 @@ class LevelAndStyleCustomFilterPolicy : public FilterPolicy {
|
|
|
757
1682
|
return policy_fifo_->GetFilterBitsReader(contents);
|
|
758
1683
|
}
|
|
759
1684
|
|
|
760
|
-
// Defer just in case configuration uses block-based filter
|
|
761
|
-
void CreateFilter(const Slice* keys, int n, std::string* dst) const override {
|
|
762
|
-
policy_otherwise_->CreateFilter(keys, n, dst);
|
|
763
|
-
}
|
|
764
|
-
bool KeyMayMatch(const Slice& key, const Slice& filter) const override {
|
|
765
|
-
return policy_otherwise_->KeyMayMatch(key, filter);
|
|
766
|
-
}
|
|
767
|
-
|
|
768
1685
|
private:
|
|
769
1686
|
const std::unique_ptr<const FilterPolicy> policy_fifo_;
|
|
770
1687
|
const std::unique_ptr<const FilterPolicy> policy_l0_other_;
|
|
771
1688
|
const std::unique_ptr<const FilterPolicy> policy_otherwise_;
|
|
772
1689
|
};
|
|
773
1690
|
|
|
1691
|
+
static std::map<TableFileCreationReason, std::string>
|
|
1692
|
+
table_file_creation_reason_to_string{
|
|
1693
|
+
{TableFileCreationReason::kCompaction, "kCompaction"},
|
|
1694
|
+
{TableFileCreationReason::kFlush, "kFlush"},
|
|
1695
|
+
{TableFileCreationReason::kMisc, "kMisc"},
|
|
1696
|
+
{TableFileCreationReason::kRecovery, "kRecovery"},
|
|
1697
|
+
};
|
|
1698
|
+
|
|
774
1699
|
class TestingContextCustomFilterPolicy
|
|
775
1700
|
: public LevelAndStyleCustomFilterPolicy {
|
|
776
1701
|
public:
|
|
@@ -783,11 +1708,17 @@ class TestingContextCustomFilterPolicy
|
|
|
783
1708
|
const FilterBuildingContext& context) const override {
|
|
784
1709
|
test_report_ += "cf=";
|
|
785
1710
|
test_report_ += context.column_family_name;
|
|
786
|
-
test_report_ += ",
|
|
1711
|
+
test_report_ += ",s=";
|
|
787
1712
|
test_report_ +=
|
|
788
1713
|
OptionsHelper::compaction_style_to_string[context.compaction_style];
|
|
789
|
-
test_report_ += ",
|
|
790
|
-
test_report_ +=
|
|
1714
|
+
test_report_ += ",n=";
|
|
1715
|
+
test_report_ += ROCKSDB_NAMESPACE::ToString(context.num_levels);
|
|
1716
|
+
test_report_ += ",l=";
|
|
1717
|
+
test_report_ += ROCKSDB_NAMESPACE::ToString(context.level_at_creation);
|
|
1718
|
+
test_report_ += ",b=";
|
|
1719
|
+
test_report_ += ROCKSDB_NAMESPACE::ToString(int{context.is_bottommost});
|
|
1720
|
+
test_report_ += ",r=";
|
|
1721
|
+
test_report_ += table_file_creation_reason_to_string[context.reason];
|
|
791
1722
|
test_report_ += "\n";
|
|
792
1723
|
|
|
793
1724
|
return LevelAndStyleCustomFilterPolicy::GetBuilderWithContext(context);
|
|
@@ -805,18 +1736,21 @@ class TestingContextCustomFilterPolicy
|
|
|
805
1736
|
} // namespace
|
|
806
1737
|
|
|
807
1738
|
TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
|
|
1739
|
+
auto policy = std::make_shared<TestingContextCustomFilterPolicy>(15, 8, 5);
|
|
1740
|
+
Options options;
|
|
808
1741
|
for (bool fifo : {true, false}) {
|
|
809
|
-
|
|
1742
|
+
options = CurrentOptions();
|
|
1743
|
+
options.max_open_files = fifo ? -1 : options.max_open_files;
|
|
810
1744
|
options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
|
|
811
1745
|
options.compaction_style =
|
|
812
1746
|
fifo ? kCompactionStyleFIFO : kCompactionStyleLevel;
|
|
813
1747
|
|
|
814
1748
|
BlockBasedTableOptions table_options;
|
|
815
|
-
auto policy = std::make_shared<TestingContextCustomFilterPolicy>(15, 8, 5);
|
|
816
1749
|
table_options.filter_policy = policy;
|
|
817
1750
|
table_options.format_version = 5;
|
|
818
1751
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
819
1752
|
|
|
1753
|
+
TryReopen(options);
|
|
820
1754
|
CreateAndReopenWithCF({fifo ? "abe" : "bob"}, options);
|
|
821
1755
|
|
|
822
1756
|
const int maxKey = 10000;
|
|
@@ -827,16 +1761,16 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
|
|
|
827
1761
|
ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
|
|
828
1762
|
Flush(1);
|
|
829
1763
|
EXPECT_EQ(policy->DumpTestReport(),
|
|
830
|
-
fifo ? "cf=abe,
|
|
831
|
-
: "cf=bob,
|
|
1764
|
+
fifo ? "cf=abe,s=kCompactionStyleFIFO,n=1,l=0,b=0,r=kFlush\n"
|
|
1765
|
+
: "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
|
|
832
1766
|
|
|
833
1767
|
for (int i = maxKey / 2; i < maxKey; i++) {
|
|
834
1768
|
ASSERT_OK(Put(1, Key(i), Key(i)));
|
|
835
1769
|
}
|
|
836
1770
|
Flush(1);
|
|
837
1771
|
EXPECT_EQ(policy->DumpTestReport(),
|
|
838
|
-
fifo ? "cf=abe,
|
|
839
|
-
: "cf=bob,
|
|
1772
|
+
fifo ? "cf=abe,s=kCompactionStyleFIFO,n=1,l=0,b=0,r=kFlush\n"
|
|
1773
|
+
: "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
|
|
840
1774
|
|
|
841
1775
|
// Check that they can be found
|
|
842
1776
|
for (int i = 0; i < maxKey; i++) {
|
|
@@ -864,7 +1798,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
|
|
|
864
1798
|
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), handles_[1], nullptr,
|
|
865
1799
|
nullptr));
|
|
866
1800
|
EXPECT_EQ(policy->DumpTestReport(),
|
|
867
|
-
"cf=bob,
|
|
1801
|
+
"cf=bob,s=kCompactionStyleLevel,n=7,l=1,b=1,r=kCompaction\n");
|
|
868
1802
|
|
|
869
1803
|
// Check that we now have one filter, about 9.2% FP rate (5 bits per key)
|
|
870
1804
|
for (int i = 0; i < maxKey; i++) {
|
|
@@ -876,6 +1810,20 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
|
|
|
876
1810
|
EXPECT_GE(useful_count, maxKey * 0.90);
|
|
877
1811
|
EXPECT_LE(useful_count, maxKey * 0.91);
|
|
878
1812
|
}
|
|
1813
|
+
} else {
|
|
1814
|
+
#ifndef ROCKSDB_LITE
|
|
1815
|
+
// Also try external SST file
|
|
1816
|
+
{
|
|
1817
|
+
std::string file_path = dbname_ + "/external.sst";
|
|
1818
|
+
SstFileWriter sst_file_writer(EnvOptions(), options, handles_[1]);
|
|
1819
|
+
ASSERT_OK(sst_file_writer.Open(file_path));
|
|
1820
|
+
ASSERT_OK(sst_file_writer.Put("key", "value"));
|
|
1821
|
+
ASSERT_OK(sst_file_writer.Finish());
|
|
1822
|
+
}
|
|
1823
|
+
// Note: kCompactionStyleLevel is default, ignored if num_levels == -1
|
|
1824
|
+
EXPECT_EQ(policy->DumpTestReport(),
|
|
1825
|
+
"cf=abe,s=kCompactionStyleLevel,n=-1,l=-1,b=0,r=kMisc\n");
|
|
1826
|
+
#endif
|
|
879
1827
|
}
|
|
880
1828
|
|
|
881
1829
|
// Destroy
|
|
@@ -1016,6 +1964,63 @@ TEST_F(DBBloomFilterTest, MemtableWholeKeyBloomFilter) {
|
|
|
1016
1964
|
ASSERT_EQ(1, get_perf_context()->bloom_memtable_hit_count);
|
|
1017
1965
|
}
|
|
1018
1966
|
|
|
1967
|
+
TEST_F(DBBloomFilterTest, MemtableWholeKeyBloomFilterMultiGet) {
|
|
1968
|
+
Options options = CurrentOptions();
|
|
1969
|
+
options.memtable_prefix_bloom_size_ratio = 0.015;
|
|
1970
|
+
options.memtable_whole_key_filtering = true;
|
|
1971
|
+
Reopen(options);
|
|
1972
|
+
std::string key1("AA");
|
|
1973
|
+
std::string key2("BB");
|
|
1974
|
+
std::string key3("CC");
|
|
1975
|
+
std::string key4("DD");
|
|
1976
|
+
std::string key_not("EE");
|
|
1977
|
+
std::string value1("Value1");
|
|
1978
|
+
std::string value2("Value2");
|
|
1979
|
+
std::string value3("Value3");
|
|
1980
|
+
std::string value4("Value4");
|
|
1981
|
+
|
|
1982
|
+
ASSERT_OK(Put(key1, value1, WriteOptions()));
|
|
1983
|
+
ASSERT_OK(Put(key2, value2, WriteOptions()));
|
|
1984
|
+
ASSERT_OK(Flush());
|
|
1985
|
+
ASSERT_OK(Put(key3, value3, WriteOptions()));
|
|
1986
|
+
const Snapshot* snapshot = db_->GetSnapshot();
|
|
1987
|
+
ASSERT_OK(Put(key4, value4, WriteOptions()));
|
|
1988
|
+
|
|
1989
|
+
// Delete key2 and key3
|
|
1990
|
+
ASSERT_OK(
|
|
1991
|
+
db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "BA", "CZ"));
|
|
1992
|
+
|
|
1993
|
+
// Read without snapshot
|
|
1994
|
+
auto results = MultiGet({key_not, key1, key2, key3, key4});
|
|
1995
|
+
ASSERT_EQ(results[0], "NOT_FOUND");
|
|
1996
|
+
ASSERT_EQ(results[1], value1);
|
|
1997
|
+
ASSERT_EQ(results[2], "NOT_FOUND");
|
|
1998
|
+
ASSERT_EQ(results[3], "NOT_FOUND");
|
|
1999
|
+
ASSERT_EQ(results[4], value4);
|
|
2000
|
+
|
|
2001
|
+
// Also check Get
|
|
2002
|
+
ASSERT_EQ(Get(key1), value1);
|
|
2003
|
+
ASSERT_EQ(Get(key2), "NOT_FOUND");
|
|
2004
|
+
ASSERT_EQ(Get(key3), "NOT_FOUND");
|
|
2005
|
+
ASSERT_EQ(Get(key4), value4);
|
|
2006
|
+
|
|
2007
|
+
// Read with snapshot
|
|
2008
|
+
results = MultiGet({key_not, key1, key2, key3, key4}, snapshot);
|
|
2009
|
+
ASSERT_EQ(results[0], "NOT_FOUND");
|
|
2010
|
+
ASSERT_EQ(results[1], value1);
|
|
2011
|
+
ASSERT_EQ(results[2], value2);
|
|
2012
|
+
ASSERT_EQ(results[3], value3);
|
|
2013
|
+
ASSERT_EQ(results[4], "NOT_FOUND");
|
|
2014
|
+
|
|
2015
|
+
// Also check Get
|
|
2016
|
+
ASSERT_EQ(Get(key1, snapshot), value1);
|
|
2017
|
+
ASSERT_EQ(Get(key2, snapshot), value2);
|
|
2018
|
+
ASSERT_EQ(Get(key3, snapshot), value3);
|
|
2019
|
+
ASSERT_EQ(Get(key4, snapshot), "NOT_FOUND");
|
|
2020
|
+
|
|
2021
|
+
db_->ReleaseSnapshot(snapshot);
|
|
2022
|
+
}
|
|
2023
|
+
|
|
1019
2024
|
TEST_F(DBBloomFilterTest, MemtablePrefixBloomOutOfDomain) {
|
|
1020
2025
|
constexpr size_t kPrefixSize = 8;
|
|
1021
2026
|
const std::string kKey = "key";
|
|
@@ -1044,7 +2049,7 @@ class DBBloomFilterTestVaryPrefixAndFormatVer
|
|
|
1044
2049
|
|
|
1045
2050
|
public:
|
|
1046
2051
|
DBBloomFilterTestVaryPrefixAndFormatVer()
|
|
1047
|
-
: DBTestBase("
|
|
2052
|
+
: DBTestBase("db_bloom_filter_tests", /*env_do_fsync=*/true) {}
|
|
1048
2053
|
|
|
1049
2054
|
~DBBloomFilterTestVaryPrefixAndFormatVer() override {}
|
|
1050
2055
|
|
|
@@ -1246,16 +2251,12 @@ INSTANTIATE_TEST_CASE_P(DBBloomFilterTestVaryPrefixAndFormatVer,
|
|
|
1246
2251
|
|
|
1247
2252
|
#ifndef ROCKSDB_LITE
|
|
1248
2253
|
namespace {
|
|
1249
|
-
|
|
1250
|
-
// Extends BFP::Mode with option to use Plain table
|
|
1251
|
-
using PseudoMode = int;
|
|
1252
|
-
static constexpr PseudoMode kPlainTable = -1;
|
|
1253
|
-
} // namespace BFP2
|
|
2254
|
+
static const std::string kPlainTable = "test_PlainTableBloom";
|
|
1254
2255
|
} // namespace
|
|
1255
2256
|
|
|
1256
2257
|
class BloomStatsTestWithParam
|
|
1257
2258
|
: public DBBloomFilterTest,
|
|
1258
|
-
public testing::WithParamInterface<std::tuple<
|
|
2259
|
+
public testing::WithParamInterface<std::tuple<std::string, bool>> {
|
|
1259
2260
|
public:
|
|
1260
2261
|
BloomStatsTestWithParam() {
|
|
1261
2262
|
bfp_impl_ = std::get<0>(GetParam());
|
|
@@ -1266,21 +2267,19 @@ class BloomStatsTestWithParam
|
|
|
1266
2267
|
ROCKSDB_NAMESPACE::NewFixedPrefixTransform(4));
|
|
1267
2268
|
options_.memtable_prefix_bloom_size_ratio =
|
|
1268
2269
|
8.0 * 1024.0 / static_cast<double>(options_.write_buffer_size);
|
|
1269
|
-
if (bfp_impl_ ==
|
|
2270
|
+
if (bfp_impl_ == kPlainTable) {
|
|
1270
2271
|
assert(!partition_filters_); // not supported in plain table
|
|
1271
2272
|
PlainTableOptions table_options;
|
|
1272
2273
|
options_.table_factory.reset(NewPlainTableFactory(table_options));
|
|
1273
2274
|
} else {
|
|
1274
2275
|
BlockBasedTableOptions table_options;
|
|
1275
|
-
table_options.hash_index_allow_collision = false;
|
|
1276
2276
|
if (partition_filters_) {
|
|
1277
|
-
assert(bfp_impl_ !=
|
|
2277
|
+
assert(bfp_impl_ != kDeprecatedBlock);
|
|
1278
2278
|
table_options.partition_filters = partition_filters_;
|
|
1279
2279
|
table_options.index_type =
|
|
1280
2280
|
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1281
2281
|
}
|
|
1282
|
-
table_options.filter_policy
|
|
1283
|
-
new BFP(10, static_cast<BFP::Mode>(bfp_impl_)));
|
|
2282
|
+
table_options.filter_policy = Create(10, bfp_impl_);
|
|
1284
2283
|
options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1285
2284
|
}
|
|
1286
2285
|
options_.env = env_;
|
|
@@ -1298,7 +2297,7 @@ class BloomStatsTestWithParam
|
|
|
1298
2297
|
static void SetUpTestCase() {}
|
|
1299
2298
|
static void TearDownTestCase() {}
|
|
1300
2299
|
|
|
1301
|
-
|
|
2300
|
+
std::string bfp_impl_;
|
|
1302
2301
|
bool partition_filters_;
|
|
1303
2302
|
Options options_;
|
|
1304
2303
|
};
|
|
@@ -1402,7 +2401,7 @@ TEST_P(BloomStatsTestWithParam, BloomStatsTestWithIter) {
|
|
|
1402
2401
|
ASSERT_EQ(value3, iter->value().ToString());
|
|
1403
2402
|
// The seek doesn't check block-based bloom filter because last index key
|
|
1404
2403
|
// starts with the same prefix we're seeking to.
|
|
1405
|
-
uint64_t expected_hits = bfp_impl_ ==
|
|
2404
|
+
uint64_t expected_hits = bfp_impl_ == kDeprecatedBlock ? 1 : 2;
|
|
1406
2405
|
ASSERT_EQ(expected_hits, get_perf_context()->bloom_sst_hit_count);
|
|
1407
2406
|
|
|
1408
2407
|
iter->Seek(key2);
|
|
@@ -1414,12 +2413,12 @@ TEST_P(BloomStatsTestWithParam, BloomStatsTestWithIter) {
|
|
|
1414
2413
|
|
|
1415
2414
|
INSTANTIATE_TEST_CASE_P(
|
|
1416
2415
|
BloomStatsTestWithParam, BloomStatsTestWithParam,
|
|
1417
|
-
::testing::Values(std::make_tuple(
|
|
1418
|
-
std::make_tuple(
|
|
1419
|
-
std::make_tuple(
|
|
1420
|
-
std::make_tuple(
|
|
1421
|
-
std::make_tuple(
|
|
1422
|
-
std::make_tuple(
|
|
2416
|
+
::testing::Values(std::make_tuple(kDeprecatedBlock, false),
|
|
2417
|
+
std::make_tuple(kLegacyBloom, false),
|
|
2418
|
+
std::make_tuple(kLegacyBloom, true),
|
|
2419
|
+
std::make_tuple(kFastLocalBloom, false),
|
|
2420
|
+
std::make_tuple(kFastLocalBloom, true),
|
|
2421
|
+
std::make_tuple(kPlainTable, false)));
|
|
1423
2422
|
|
|
1424
2423
|
namespace {
|
|
1425
2424
|
void PrefixScanInit(DBBloomFilterTest* dbtest) {
|
|
@@ -1727,8 +2726,8 @@ int CountIter(std::unique_ptr<Iterator>& iter, const Slice& key) {
|
|
|
1727
2726
|
// into the same string, or 2) the transformed seek key is of the same length
|
|
1728
2727
|
// as the upper bound and two keys are adjacent according to the comparator.
|
|
1729
2728
|
TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
|
|
1730
|
-
for (auto bfp_impl :
|
|
1731
|
-
int using_full_builder = bfp_impl !=
|
|
2729
|
+
for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
|
|
2730
|
+
int using_full_builder = bfp_impl != kDeprecatedBlock;
|
|
1732
2731
|
Options options;
|
|
1733
2732
|
options.create_if_missing = true;
|
|
1734
2733
|
options.env = CurrentOptions().env;
|
|
@@ -1738,7 +2737,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
|
|
|
1738
2737
|
// Enable prefix bloom for SST files
|
|
1739
2738
|
BlockBasedTableOptions table_options;
|
|
1740
2739
|
table_options.cache_index_and_filter_blocks = true;
|
|
1741
|
-
table_options.filter_policy
|
|
2740
|
+
table_options.filter_policy = Create(10, bfp_impl);
|
|
1742
2741
|
table_options.index_shortening = BlockBasedTableOptions::
|
|
1743
2742
|
IndexShorteningMode::kShortenSeparatorsAndSuccessor;
|
|
1744
2743
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
@@ -1769,8 +2768,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
|
|
|
1769
2768
|
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
|
|
1770
2769
|
}
|
|
1771
2770
|
ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:5"}}));
|
|
1772
|
-
ASSERT_EQ(
|
|
1773
|
-
|
|
2771
|
+
ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
|
|
2772
|
+
"rocksdb.FixedPrefix.5");
|
|
1774
2773
|
{
|
|
1775
2774
|
// BF changed, [abcdxx00, abce) is a valid bound, will trigger BF read
|
|
1776
2775
|
Slice upper_bound("abce");
|
|
@@ -1859,8 +2858,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterUpperBound) {
|
|
|
1859
2858
|
// Create multiple SST files each with a different prefix_extractor config,
|
|
1860
2859
|
// verify iterators can read all SST files using the latest config.
|
|
1861
2860
|
TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
|
|
1862
|
-
for (auto bfp_impl :
|
|
1863
|
-
int using_full_builder = bfp_impl !=
|
|
2861
|
+
for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
|
|
2862
|
+
int using_full_builder = bfp_impl != kDeprecatedBlock;
|
|
1864
2863
|
Options options;
|
|
1865
2864
|
options.env = CurrentOptions().env;
|
|
1866
2865
|
options.create_if_missing = true;
|
|
@@ -1869,7 +2868,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
|
|
|
1869
2868
|
options.statistics = CreateDBStatistics();
|
|
1870
2869
|
// Enable prefix bloom for SST files
|
|
1871
2870
|
BlockBasedTableOptions table_options;
|
|
1872
|
-
table_options.filter_policy
|
|
2871
|
+
table_options.filter_policy = Create(10, bfp_impl);
|
|
1873
2872
|
table_options.cache_index_and_filter_blocks = true;
|
|
1874
2873
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1875
2874
|
DestroyAndReopen(options);
|
|
@@ -1889,8 +2888,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
|
|
|
1889
2888
|
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_CHECKED), 1);
|
|
1890
2889
|
|
|
1891
2890
|
ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
|
|
1892
|
-
ASSERT_EQ(
|
|
1893
|
-
|
|
2891
|
+
ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
|
|
2892
|
+
"rocksdb.CappedPrefix.3");
|
|
1894
2893
|
read_options.iterate_upper_bound = &upper_bound;
|
|
1895
2894
|
std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
|
|
1896
2895
|
ASSERT_EQ(CountIter(iter, "foo"), 2);
|
|
@@ -1923,8 +2922,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
|
|
|
1923
2922
|
}
|
|
1924
2923
|
|
|
1925
2924
|
ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:2"}}));
|
|
1926
|
-
ASSERT_EQ(
|
|
1927
|
-
|
|
2925
|
+
ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
|
|
2926
|
+
"rocksdb.FixedPrefix.2");
|
|
1928
2927
|
// third SST with fixed:2 BF
|
|
1929
2928
|
ASSERT_OK(Put("foo6", "bar6"));
|
|
1930
2929
|
ASSERT_OK(Put("foo7", "bar7"));
|
|
@@ -1971,8 +2970,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
|
|
|
1971
2970
|
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 3);
|
|
1972
2971
|
}
|
|
1973
2972
|
ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
|
|
1974
|
-
ASSERT_EQ(
|
|
1975
|
-
|
|
2973
|
+
ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
|
|
2974
|
+
"rocksdb.CappedPrefix.3");
|
|
1976
2975
|
{
|
|
1977
2976
|
std::unique_ptr<Iterator> iter_all(db_->NewIterator(read_options));
|
|
1978
2977
|
ASSERT_EQ(CountIter(iter_all, "foo"), 6);
|
|
@@ -1995,7 +2994,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterMultipleSST) {
|
|
|
1995
2994
|
// as expected
|
|
1996
2995
|
TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
|
|
1997
2996
|
int iteration = 0;
|
|
1998
|
-
for (auto bfp_impl :
|
|
2997
|
+
for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
|
|
1999
2998
|
Options options = CurrentOptions();
|
|
2000
2999
|
options.create_if_missing = true;
|
|
2001
3000
|
options.prefix_extractor.reset(NewFixedPrefixTransform(1));
|
|
@@ -2004,7 +3003,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
|
|
|
2004
3003
|
// Enable prefix bloom for SST files
|
|
2005
3004
|
BlockBasedTableOptions table_options;
|
|
2006
3005
|
table_options.cache_index_and_filter_blocks = true;
|
|
2007
|
-
table_options.filter_policy
|
|
3006
|
+
table_options.filter_policy = Create(10, bfp_impl);
|
|
2008
3007
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
2009
3008
|
CreateAndReopenWithCF({"pikachu" + std::to_string(iteration)}, options);
|
|
2010
3009
|
ReadOptions read_options;
|
|
@@ -2012,9 +3011,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
|
|
|
2012
3011
|
// create a new CF and set prefix_extractor dynamically
|
|
2013
3012
|
options.prefix_extractor.reset(NewCappedPrefixTransform(3));
|
|
2014
3013
|
CreateColumnFamilies({"ramen_dojo_" + std::to_string(iteration)}, options);
|
|
2015
|
-
ASSERT_EQ(
|
|
2016
|
-
|
|
2017
|
-
"rocksdb.CappedPrefix.3"));
|
|
3014
|
+
ASSERT_EQ(dbfull()->GetOptions(handles_[2]).prefix_extractor->AsString(),
|
|
3015
|
+
"rocksdb.CappedPrefix.3");
|
|
2018
3016
|
ASSERT_OK(Put(2, "foo3", "bar3"));
|
|
2019
3017
|
ASSERT_OK(Put(2, "foo4", "bar4"));
|
|
2020
3018
|
ASSERT_OK(Put(2, "foo5", "bar5"));
|
|
@@ -2030,9 +3028,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
|
|
|
2030
3028
|
}
|
|
2031
3029
|
ASSERT_OK(
|
|
2032
3030
|
dbfull()->SetOptions(handles_[2], {{"prefix_extractor", "fixed:2"}}));
|
|
2033
|
-
ASSERT_EQ(
|
|
2034
|
-
|
|
2035
|
-
"rocksdb.FixedPrefix.2"));
|
|
3031
|
+
ASSERT_EQ(dbfull()->GetOptions(handles_[2]).prefix_extractor->AsString(),
|
|
3032
|
+
"rocksdb.FixedPrefix.2");
|
|
2036
3033
|
{
|
|
2037
3034
|
std::unique_ptr<Iterator> iter(
|
|
2038
3035
|
db_->NewIterator(read_options, handles_[2]));
|
|
@@ -2053,7 +3050,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterNewColumnFamily) {
|
|
|
2053
3050
|
// Verify it's possible to change prefix_extractor at runtime and iterators
|
|
2054
3051
|
// behaves as expected
|
|
2055
3052
|
TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
|
|
2056
|
-
for (auto bfp_impl :
|
|
3053
|
+
for (const auto& bfp_impl : BloomLikeFilterPolicy::GetAllFixedImpls()) {
|
|
2057
3054
|
Options options;
|
|
2058
3055
|
options.env = CurrentOptions().env;
|
|
2059
3056
|
options.create_if_missing = true;
|
|
@@ -2063,7 +3060,7 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
|
|
|
2063
3060
|
// Enable prefix bloom for SST files
|
|
2064
3061
|
BlockBasedTableOptions table_options;
|
|
2065
3062
|
table_options.cache_index_and_filter_blocks = true;
|
|
2066
|
-
table_options.filter_policy
|
|
3063
|
+
table_options.filter_policy = Create(10, bfp_impl);
|
|
2067
3064
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
2068
3065
|
DestroyAndReopen(options);
|
|
2069
3066
|
|
|
@@ -2097,8 +3094,8 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
|
|
|
2097
3094
|
ASSERT_EQ(TestGetTickerCount(options, BLOOM_FILTER_PREFIX_USEFUL), 0);
|
|
2098
3095
|
|
|
2099
3096
|
ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "capped:3"}}));
|
|
2100
|
-
ASSERT_EQ(
|
|
2101
|
-
|
|
3097
|
+
ASSERT_EQ(dbfull()->GetOptions().prefix_extractor->AsString(),
|
|
3098
|
+
"rocksdb.CappedPrefix.3");
|
|
2102
3099
|
{
|
|
2103
3100
|
std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
|
|
2104
3101
|
// "fp*" should be skipped
|
|
@@ -2117,6 +3114,55 @@ TEST_F(DBBloomFilterTest, DynamicBloomFilterOptions) {
|
|
|
2117
3114
|
}
|
|
2118
3115
|
}
|
|
2119
3116
|
|
|
3117
|
+
TEST_F(DBBloomFilterTest, SeekForPrevWithPartitionedFilters) {
|
|
3118
|
+
Options options = CurrentOptions();
|
|
3119
|
+
constexpr size_t kNumKeys = 10000;
|
|
3120
|
+
static_assert(kNumKeys <= 10000, "kNumKeys have to be <= 10000");
|
|
3121
|
+
options.memtable_factory.reset(
|
|
3122
|
+
test::NewSpecialSkipListFactory(kNumKeys + 10));
|
|
3123
|
+
options.create_if_missing = true;
|
|
3124
|
+
constexpr size_t kPrefixLength = 4;
|
|
3125
|
+
options.prefix_extractor.reset(NewFixedPrefixTransform(kPrefixLength));
|
|
3126
|
+
options.compression = kNoCompression;
|
|
3127
|
+
BlockBasedTableOptions bbto;
|
|
3128
|
+
bbto.filter_policy.reset(NewBloomFilterPolicy(50));
|
|
3129
|
+
bbto.index_shortening =
|
|
3130
|
+
BlockBasedTableOptions::IndexShorteningMode::kNoShortening;
|
|
3131
|
+
bbto.block_size = 128;
|
|
3132
|
+
bbto.metadata_block_size = 128;
|
|
3133
|
+
bbto.partition_filters = true;
|
|
3134
|
+
bbto.index_type = BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
3135
|
+
options.table_factory.reset(NewBlockBasedTableFactory(bbto));
|
|
3136
|
+
DestroyAndReopen(options);
|
|
3137
|
+
|
|
3138
|
+
const std::string value(64, '\0');
|
|
3139
|
+
|
|
3140
|
+
WriteOptions write_opts;
|
|
3141
|
+
write_opts.disableWAL = true;
|
|
3142
|
+
for (size_t i = 0; i < kNumKeys; ++i) {
|
|
3143
|
+
std::ostringstream oss;
|
|
3144
|
+
oss << std::setfill('0') << std::setw(4) << std::fixed << i;
|
|
3145
|
+
ASSERT_OK(db_->Put(write_opts, oss.str(), value));
|
|
3146
|
+
}
|
|
3147
|
+
ASSERT_OK(Flush());
|
|
3148
|
+
|
|
3149
|
+
ReadOptions read_opts;
|
|
3150
|
+
// Use legacy, implicit prefix seek
|
|
3151
|
+
read_opts.total_order_seek = false;
|
|
3152
|
+
read_opts.auto_prefix_mode = false;
|
|
3153
|
+
std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
|
|
3154
|
+
for (size_t i = 0; i < kNumKeys; ++i) {
|
|
3155
|
+
// Seek with a key after each one added but with same prefix. One will
|
|
3156
|
+
// surely cross a partition boundary.
|
|
3157
|
+
std::ostringstream oss;
|
|
3158
|
+
oss << std::setfill('0') << std::setw(4) << std::fixed << i << "a";
|
|
3159
|
+
it->SeekForPrev(oss.str());
|
|
3160
|
+
ASSERT_OK(it->status());
|
|
3161
|
+
ASSERT_TRUE(it->Valid());
|
|
3162
|
+
}
|
|
3163
|
+
it.reset();
|
|
3164
|
+
}
|
|
3165
|
+
|
|
2120
3166
|
#endif // ROCKSDB_LITE
|
|
2121
3167
|
|
|
2122
3168
|
} // namespace ROCKSDB_NAMESPACE
|