@nxtedition/rocksdb 8.2.0 → 8.2.2
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 +3 -3
- package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -52
- package/deps/rocksdb/rocksdb/Makefile +10 -5
- package/deps/rocksdb/rocksdb/TARGETS +8 -345
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +92 -0
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +32 -32
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +12 -9
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +6 -43
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +3 -13
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +8 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +21 -47
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -8
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +1 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +44 -7
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +13 -14
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +17 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +40 -21
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +41 -42
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +5 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +5 -3
- package/deps/rocksdb/rocksdb/db/builder.cc +7 -6
- package/deps/rocksdb/rocksdb/db/builder.h +2 -2
- package/deps/rocksdb/rocksdb/db/c.cc +76 -5
- package/deps/rocksdb/rocksdb/db/c_test.c +141 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +32 -0
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +8 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +12 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +21 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +3 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +77 -50
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +4 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +55 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +142 -56
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +21 -20
- package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +260 -220
- package/deps/rocksdb/rocksdb/db/db_clip_test.cc +142 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +333 -27
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +7 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +189 -27
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +23 -10
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +134 -90
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +124 -16
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +10 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +7 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +15 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +7 -8
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +54 -3
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +116 -1
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +9 -8
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +142 -63
- package/deps/rocksdb/rocksdb/db/db_test.cc +28 -7
- package/deps/rocksdb/rocksdb/db/db_test2.cc +71 -131
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +18 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +6 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +25 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +88 -0
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +67 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +5 -0
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/experimental.cc +4 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +15 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +21 -14
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +14 -7
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +31 -8
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +21 -19
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +42 -12
- package/deps/rocksdb/rocksdb/db/internal_stats.h +1 -0
- package/deps/rocksdb/rocksdb/db/kv_checksum.h +92 -6
- package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/log_format.h +8 -4
- package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -51
- package/deps/rocksdb/rocksdb/db/log_reader.h +16 -0
- package/deps/rocksdb/rocksdb/db/log_test.cc +125 -4
- package/deps/rocksdb/rocksdb/db/log_writer.cc +32 -2
- package/deps/rocksdb/rocksdb/db/log_writer.h +16 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +17 -46
- package/deps/rocksdb/rocksdb/db/memtable.h +1 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +8 -4
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -1
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/repair.cc +38 -11
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/table_cache.cc +68 -51
- package/deps/rocksdb/rocksdb/db/table_cache.h +20 -10
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -1
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +6 -3
- package/deps/rocksdb/rocksdb/db/version_builder.cc +9 -5
- package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +140 -120
- package/deps/rocksdb/rocksdb/db/version_edit.cc +14 -0
- package/deps/rocksdb/rocksdb/db/version_edit.h +12 -4
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +21 -13
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +26 -16
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +9 -9
- package/deps/rocksdb/rocksdb/db/version_set.cc +292 -96
- package/deps/rocksdb/rocksdb/db/version_set.h +53 -28
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -0
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +62 -22
- package/deps/rocksdb/rocksdb/db/version_util.h +5 -4
- package/deps/rocksdb/rocksdb/db/write_batch.cc +3 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +119 -27
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +123 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +7 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +34 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +43 -33
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +29 -17
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +85 -50
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +96 -54
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.cc +122 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +206 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +9 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +9 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +322 -92
- package/deps/rocksdb/rocksdb/env/env_posix.cc +12 -8
- package/deps/rocksdb/rocksdb/env/env_test.cc +31 -0
- package/deps/rocksdb/rocksdb/env/mock_env.cc +1 -1
- package/deps/rocksdb/rocksdb/env/unique_id_gen.h +14 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +5 -1
- package/deps/rocksdb/rocksdb/file/file_util.cc +3 -3
- package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +89 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +22 -7
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -2
- package/deps/rocksdb/rocksdb/file/readahead_raf.cc +1 -1
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +154 -74
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +27 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +107 -28
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +19 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +137 -152
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +61 -26
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +30 -26
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +33 -16
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +87 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +9 -2
- package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -0
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +78 -42
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +14 -9
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +4 -9
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +19 -11
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +211 -555
- package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +36 -2
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +17 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +10 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +19 -18
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +10 -2
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +35 -2
- package/deps/rocksdb/rocksdb/options/cf_options.h +5 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +1 -1
- package/deps/rocksdb/rocksdb/options/options.cc +12 -53
- package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -0
- package/deps/rocksdb/rocksdb/options/options_parser.cc +11 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +32 -4
- package/deps/rocksdb/rocksdb/options/options_test.cc +89 -5
- package/deps/rocksdb/rocksdb/port/lang.h +27 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +67 -24
- package/deps/rocksdb/rocksdb/src.mk +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +195 -35
- package/deps/rocksdb/rocksdb/table/block_based/block.h +197 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +71 -51
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +7 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +4 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +43 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +36 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +266 -166
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +44 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +63 -56
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +8 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +10 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +14 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +918 -2
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -9
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -8
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +18 -23
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +8 -8
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -32
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +7 -8
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +4 -5
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +46 -53
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +12 -12
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -9
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +26 -23
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +3 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +7 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +3 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +5 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +4 -2
- package/deps/rocksdb/rocksdb/table/format.cc +4 -4
- package/deps/rocksdb/rocksdb/table/format.h +1 -1
- package/deps/rocksdb/rocksdb/table/get_context.cc +1 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +33 -22
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +4 -0
- package/deps/rocksdb/rocksdb/table/mock_table.cc +4 -2
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +1 -1
- package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +1 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +18 -10
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -3
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +10 -7
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +4 -2
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +11 -0
- package/deps/rocksdb/rocksdb/table/table_builder.h +14 -5
- package/deps/rocksdb/rocksdb/table/table_properties.cc +2 -0
- package/deps/rocksdb/rocksdb/table/table_reader.h +6 -3
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +291 -34
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +3 -1
- package/deps/rocksdb/rocksdb/test_util/testharness.h +5 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +33 -17
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -1
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +2 -2
- package/deps/rocksdb/rocksdb/util/compression.h +1 -1
- package/deps/rocksdb/rocksdb/util/crc32c.cc +24 -83
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +7 -9
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +4 -1
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +9 -10
- package/deps/rocksdb/rocksdb/util/math.h +12 -7
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +16 -18
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +46 -2
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +6 -6
- package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +12 -7
- package/deps/rocksdb/rocksdb/util/stop_watch.h +31 -13
- package/deps/rocksdb/rocksdb/util/thread_list_test.cc +2 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
- package/deps/rocksdb/rocksdb/util/udt_util.h +77 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +11 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +34 -1
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +15 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +5 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +29 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +6 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +10 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +6 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +5 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +5 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- /package/deps/rocksdb/rocksdb/memory/{memory_allocator.h → memory_allocator_impl.h} +0 -0
- /package/deps/rocksdb/rocksdb/monitoring/{statistics.h → statistics_impl.h} +0 -0
- /package/deps/rocksdb/rocksdb/table/block_based/{flush_block_policy.h → flush_block_policy_impl.h} +0 -0
- /package/deps/rocksdb/rocksdb/util/{rate_limiter.h → rate_limiter_impl.h} +0 -0
- /package/deps/rocksdb/rocksdb/utilities/agg_merge/{agg_merge.h → agg_merge_impl.h} +0 -0
|
@@ -560,7 +560,8 @@ Status BlockBasedTable::Open(
|
|
|
560
560
|
const EnvOptions& env_options, const BlockBasedTableOptions& table_options,
|
|
561
561
|
const InternalKeyComparator& internal_comparator,
|
|
562
562
|
std::unique_ptr<RandomAccessFileReader>&& file, uint64_t file_size,
|
|
563
|
-
|
|
563
|
+
uint8_t block_protection_bytes_per_key,
|
|
564
|
+
std::unique_ptr<TableReader>* table_reader, uint64_t tail_size,
|
|
564
565
|
std::shared_ptr<CacheReservationManager> table_reader_cache_res_mgr,
|
|
565
566
|
const std::shared_ptr<const SliceTransform>& prefix_extractor,
|
|
566
567
|
const bool prefetch_index_and_filter_in_cache, const bool skip_filters,
|
|
@@ -583,6 +584,7 @@ Status BlockBasedTable::Open(
|
|
|
583
584
|
ro.io_timeout = read_options.io_timeout;
|
|
584
585
|
ro.rate_limiter_priority = read_options.rate_limiter_priority;
|
|
585
586
|
ro.verify_checksums = read_options.verify_checksums;
|
|
587
|
+
ro.io_activity = read_options.io_activity;
|
|
586
588
|
|
|
587
589
|
// prefetch both index and filters, down to all partitions
|
|
588
590
|
const bool prefetch_all = prefetch_index_and_filter_in_cache || level == 0;
|
|
@@ -591,7 +593,8 @@ Status BlockBasedTable::Open(
|
|
|
591
593
|
if (!ioptions.allow_mmap_reads) {
|
|
592
594
|
s = PrefetchTail(ro, file.get(), file_size, force_direct_prefetch,
|
|
593
595
|
tail_prefetch_stats, prefetch_all, preload_all,
|
|
594
|
-
&prefetch_buffer, ioptions.stats
|
|
596
|
+
&prefetch_buffer, ioptions.stats, tail_size,
|
|
597
|
+
ioptions.logger);
|
|
595
598
|
// Return error in prefetch path to users.
|
|
596
599
|
if (!s.ok()) {
|
|
597
600
|
return s;
|
|
@@ -644,6 +647,7 @@ Status BlockBasedTable::Open(
|
|
|
644
647
|
// meta-block reads.
|
|
645
648
|
rep->compression_dict_handle = BlockHandle::NullBlockHandle();
|
|
646
649
|
|
|
650
|
+
rep->create_context.protection_bytes_per_key = block_protection_bytes_per_key;
|
|
647
651
|
// Read metaindex
|
|
648
652
|
std::unique_ptr<BlockBasedTable> new_table(
|
|
649
653
|
new BlockBasedTable(rep, block_cache_tracer));
|
|
@@ -670,9 +674,11 @@ Status BlockBasedTable::Open(
|
|
|
670
674
|
CompressionTypeToString(kZSTD) ||
|
|
671
675
|
rep->table_properties->compression_name ==
|
|
672
676
|
CompressionTypeToString(kZSTDNotFinalCompression));
|
|
673
|
-
rep->create_context =
|
|
674
|
-
|
|
675
|
-
|
|
677
|
+
rep->create_context = BlockCreateContext(
|
|
678
|
+
&rep->table_options, rep->ioptions.stats,
|
|
679
|
+
blocks_definitely_zstd_compressed, block_protection_bytes_per_key,
|
|
680
|
+
rep->internal_comparator.user_comparator(), rep->index_value_is_full,
|
|
681
|
+
rep->index_has_first_key);
|
|
676
682
|
|
|
677
683
|
// Check expected unique id if provided
|
|
678
684
|
if (expected_unique_id != kNullUniqueId64x2) {
|
|
@@ -802,21 +808,37 @@ Status BlockBasedTable::PrefetchTail(
|
|
|
802
808
|
const ReadOptions& ro, RandomAccessFileReader* file, uint64_t file_size,
|
|
803
809
|
bool force_direct_prefetch, TailPrefetchStats* tail_prefetch_stats,
|
|
804
810
|
const bool prefetch_all, const bool preload_all,
|
|
805
|
-
std::unique_ptr<FilePrefetchBuffer>* prefetch_buffer, Statistics* stats
|
|
811
|
+
std::unique_ptr<FilePrefetchBuffer>* prefetch_buffer, Statistics* stats,
|
|
812
|
+
uint64_t tail_size, Logger* const logger) {
|
|
813
|
+
assert(tail_size <= file_size);
|
|
814
|
+
|
|
806
815
|
size_t tail_prefetch_size = 0;
|
|
807
|
-
if (
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
816
|
+
if (tail_size != 0) {
|
|
817
|
+
tail_prefetch_size = tail_size;
|
|
818
|
+
} else {
|
|
819
|
+
if (tail_prefetch_stats != nullptr) {
|
|
820
|
+
// Multiple threads may get a 0 (no history) when running in parallel,
|
|
821
|
+
// but it will get cleared after the first of them finishes.
|
|
822
|
+
tail_prefetch_size = tail_prefetch_stats->GetSuggestedPrefetchSize();
|
|
823
|
+
}
|
|
824
|
+
if (tail_prefetch_size == 0) {
|
|
825
|
+
// Before read footer, readahead backwards to prefetch data. Do more
|
|
826
|
+
// readahead if we're going to read index/filter.
|
|
827
|
+
// TODO: This may incorrectly select small readahead in case partitioned
|
|
828
|
+
// index/filter is enabled and top-level partition pinning is enabled.
|
|
829
|
+
// That's because we need to issue readahead before we read the
|
|
830
|
+
// properties, at which point we don't yet know the index type.
|
|
831
|
+
tail_prefetch_size = prefetch_all || preload_all ? 512 * 1024 : 4 * 1024;
|
|
832
|
+
|
|
833
|
+
ROCKS_LOG_WARN(logger,
|
|
834
|
+
"Tail prefetch size %zu is calculated based on heuristics",
|
|
835
|
+
tail_prefetch_size);
|
|
836
|
+
} else {
|
|
837
|
+
ROCKS_LOG_WARN(
|
|
838
|
+
logger,
|
|
839
|
+
"Tail prefetch size %zu is calculated based on TailPrefetchStats",
|
|
840
|
+
tail_prefetch_size);
|
|
841
|
+
}
|
|
820
842
|
}
|
|
821
843
|
size_t prefetch_off;
|
|
822
844
|
size_t prefetch_len;
|
|
@@ -916,10 +938,18 @@ Status BlockBasedTable::ReadPropertiesBlock(
|
|
|
916
938
|
// If table properties don't contain index type, we assume that the table
|
|
917
939
|
// is in very old format and has kBinarySearch index type.
|
|
918
940
|
auto& props = rep_->table_properties->user_collected_properties;
|
|
919
|
-
auto
|
|
920
|
-
if (
|
|
941
|
+
auto index_type_pos = props.find(BlockBasedTablePropertyNames::kIndexType);
|
|
942
|
+
if (index_type_pos != props.end()) {
|
|
921
943
|
rep_->index_type = static_cast<BlockBasedTableOptions::IndexType>(
|
|
922
|
-
DecodeFixed32(
|
|
944
|
+
DecodeFixed32(index_type_pos->second.c_str()));
|
|
945
|
+
}
|
|
946
|
+
auto min_ts_pos = props.find("rocksdb.timestamp_min");
|
|
947
|
+
if (min_ts_pos != props.end()) {
|
|
948
|
+
rep_->min_timestamp = Slice(min_ts_pos->second);
|
|
949
|
+
}
|
|
950
|
+
auto max_ts_pos = props.find("rocksdb.timestamp_max");
|
|
951
|
+
if (max_ts_pos != props.end()) {
|
|
952
|
+
rep_->max_timestamp = Slice(max_ts_pos->second);
|
|
923
953
|
}
|
|
924
954
|
|
|
925
955
|
rep_->index_has_first_key =
|
|
@@ -1127,7 +1157,8 @@ Status BlockBasedTable::PrefetchIndexAndFilterBlocks(
|
|
|
1127
1157
|
// are hence follow the configuration for pin and prefetch regardless of
|
|
1128
1158
|
// the value of cache_index_and_filter_blocks
|
|
1129
1159
|
if (prefetch_all || pin_partition) {
|
|
1130
|
-
s = rep_->index_reader->CacheDependencies(ro, pin_partition
|
|
1160
|
+
s = rep_->index_reader->CacheDependencies(ro, pin_partition,
|
|
1161
|
+
prefetch_buffer);
|
|
1131
1162
|
}
|
|
1132
1163
|
if (!s.ok()) {
|
|
1133
1164
|
return s;
|
|
@@ -1151,7 +1182,7 @@ Status BlockBasedTable::PrefetchIndexAndFilterBlocks(
|
|
|
1151
1182
|
if (filter) {
|
|
1152
1183
|
// Refer to the comment above about paritioned indexes always being cached
|
|
1153
1184
|
if (prefetch_all || pin_partition) {
|
|
1154
|
-
s = filter->CacheDependencies(ro, pin_partition);
|
|
1185
|
+
s = filter->CacheDependencies(ro, pin_partition, prefetch_buffer);
|
|
1155
1186
|
if (!s.ok()) {
|
|
1156
1187
|
return s;
|
|
1157
1188
|
}
|
|
@@ -1555,75 +1586,111 @@ BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1555
1586
|
}
|
|
1556
1587
|
}
|
|
1557
1588
|
|
|
1558
|
-
//
|
|
1589
|
+
// TODO: optimize so that lookup_context != nullptr implies the others
|
|
1559
1590
|
if (block_cache_tracer_ && block_cache_tracer_->is_tracing_enabled() &&
|
|
1560
1591
|
lookup_context) {
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
if (out_parsed_block->GetValue()) {
|
|
1564
|
-
// Approximate the number of keys in the block using restarts.
|
|
1565
|
-
// FIXME: Should this only apply to data blocks?
|
|
1566
|
-
nkeys = rep_->table_options.block_restart_interval *
|
|
1567
|
-
GetBlockNumRestarts(*out_parsed_block->GetValue());
|
|
1568
|
-
usage = out_parsed_block->GetValue()->ApproximateMemoryUsage();
|
|
1569
|
-
}
|
|
1570
|
-
TraceType trace_block_type = TraceType::kTraceMax;
|
|
1571
|
-
switch (TBlocklike::kBlockType) {
|
|
1572
|
-
case BlockType::kData:
|
|
1573
|
-
trace_block_type = TraceType::kBlockTraceDataBlock;
|
|
1574
|
-
break;
|
|
1575
|
-
case BlockType::kFilter:
|
|
1576
|
-
case BlockType::kFilterPartitionIndex:
|
|
1577
|
-
trace_block_type = TraceType::kBlockTraceFilterBlock;
|
|
1578
|
-
break;
|
|
1579
|
-
case BlockType::kCompressionDictionary:
|
|
1580
|
-
trace_block_type = TraceType::kBlockTraceUncompressionDictBlock;
|
|
1581
|
-
break;
|
|
1582
|
-
case BlockType::kRangeDeletion:
|
|
1583
|
-
trace_block_type = TraceType::kBlockTraceRangeDeletionBlock;
|
|
1584
|
-
break;
|
|
1585
|
-
case BlockType::kIndex:
|
|
1586
|
-
trace_block_type = TraceType::kBlockTraceIndexBlock;
|
|
1587
|
-
break;
|
|
1588
|
-
default:
|
|
1589
|
-
// This cannot happen.
|
|
1590
|
-
assert(false);
|
|
1591
|
-
break;
|
|
1592
|
-
}
|
|
1593
|
-
bool no_insert = no_io || !ro.fill_cache;
|
|
1594
|
-
if (BlockCacheTraceHelper::IsGetOrMultiGetOnDataBlock(
|
|
1595
|
-
trace_block_type, lookup_context->caller)) {
|
|
1596
|
-
// Defer logging the access to Get() and MultiGet() to trace additional
|
|
1597
|
-
// information, e.g., referenced_key_exist_in_block.
|
|
1598
|
-
|
|
1599
|
-
// Make a copy of the block key here since it will be logged later.
|
|
1600
|
-
lookup_context->FillLookupContext(
|
|
1601
|
-
is_cache_hit, no_insert, trace_block_type,
|
|
1602
|
-
/*block_size=*/usage, /*block_key=*/key.ToString(), nkeys);
|
|
1603
|
-
} else {
|
|
1604
|
-
// Avoid making copy of block_key and cf_name when constructing the access
|
|
1605
|
-
// record.
|
|
1606
|
-
BlockCacheTraceRecord access_record(
|
|
1607
|
-
rep_->ioptions.clock->NowMicros(),
|
|
1608
|
-
/*block_key=*/"", trace_block_type,
|
|
1609
|
-
/*block_size=*/usage, rep_->cf_id_for_tracing(),
|
|
1610
|
-
/*cf_name=*/"", rep_->level_for_tracing(),
|
|
1611
|
-
rep_->sst_number_for_tracing(), lookup_context->caller, is_cache_hit,
|
|
1612
|
-
no_insert, lookup_context->get_id,
|
|
1613
|
-
lookup_context->get_from_user_specified_snapshot,
|
|
1614
|
-
/*referenced_key=*/"");
|
|
1615
|
-
// TODO: Should handle this error?
|
|
1616
|
-
block_cache_tracer_
|
|
1617
|
-
->WriteBlockAccess(access_record, key, rep_->cf_name_for_tracing(),
|
|
1618
|
-
lookup_context->referenced_key)
|
|
1619
|
-
.PermitUncheckedError();
|
|
1620
|
-
}
|
|
1592
|
+
SaveLookupContextOrTraceRecord(
|
|
1593
|
+
key, is_cache_hit, ro, out_parsed_block->GetValue(), lookup_context);
|
|
1621
1594
|
}
|
|
1622
1595
|
|
|
1623
1596
|
assert(s.ok() || out_parsed_block->GetValue() == nullptr);
|
|
1624
1597
|
return s;
|
|
1625
1598
|
}
|
|
1626
1599
|
|
|
1600
|
+
template <typename TBlocklike>
|
|
1601
|
+
WithBlocklikeCheck<void, TBlocklike>
|
|
1602
|
+
BlockBasedTable::SaveLookupContextOrTraceRecord(
|
|
1603
|
+
const Slice& block_key, bool is_cache_hit, const ReadOptions& ro,
|
|
1604
|
+
const TBlocklike* parsed_block_value,
|
|
1605
|
+
BlockCacheLookupContext* lookup_context) const {
|
|
1606
|
+
assert(lookup_context);
|
|
1607
|
+
size_t usage = 0;
|
|
1608
|
+
uint64_t nkeys = 0;
|
|
1609
|
+
if (parsed_block_value) {
|
|
1610
|
+
// Approximate the number of keys in the block using restarts.
|
|
1611
|
+
int interval = rep_->table_options.block_restart_interval;
|
|
1612
|
+
nkeys = interval * GetBlockNumRestarts(*parsed_block_value);
|
|
1613
|
+
// On average, the last restart should be just over half utilized.
|
|
1614
|
+
// Specifically, 1..N should be N/2 + 0.5. For example, 7 -> 4, 8 -> 4.5.
|
|
1615
|
+
// Use the get_id to alternate between rounding up vs. down.
|
|
1616
|
+
if (nkeys > 0) {
|
|
1617
|
+
bool rounding = static_cast<int>(lookup_context->get_id) & 1;
|
|
1618
|
+
nkeys -= (interval - rounding) / 2;
|
|
1619
|
+
}
|
|
1620
|
+
usage = parsed_block_value->ApproximateMemoryUsage();
|
|
1621
|
+
}
|
|
1622
|
+
TraceType trace_block_type = TraceType::kTraceMax;
|
|
1623
|
+
switch (TBlocklike::kBlockType) {
|
|
1624
|
+
case BlockType::kData:
|
|
1625
|
+
trace_block_type = TraceType::kBlockTraceDataBlock;
|
|
1626
|
+
break;
|
|
1627
|
+
case BlockType::kFilter:
|
|
1628
|
+
case BlockType::kFilterPartitionIndex:
|
|
1629
|
+
trace_block_type = TraceType::kBlockTraceFilterBlock;
|
|
1630
|
+
break;
|
|
1631
|
+
case BlockType::kCompressionDictionary:
|
|
1632
|
+
trace_block_type = TraceType::kBlockTraceUncompressionDictBlock;
|
|
1633
|
+
break;
|
|
1634
|
+
case BlockType::kRangeDeletion:
|
|
1635
|
+
trace_block_type = TraceType::kBlockTraceRangeDeletionBlock;
|
|
1636
|
+
break;
|
|
1637
|
+
case BlockType::kIndex:
|
|
1638
|
+
trace_block_type = TraceType::kBlockTraceIndexBlock;
|
|
1639
|
+
break;
|
|
1640
|
+
default:
|
|
1641
|
+
// This cannot happen.
|
|
1642
|
+
assert(false);
|
|
1643
|
+
break;
|
|
1644
|
+
}
|
|
1645
|
+
const bool no_io = ro.read_tier == kBlockCacheTier;
|
|
1646
|
+
bool no_insert = no_io || !ro.fill_cache;
|
|
1647
|
+
if (BlockCacheTraceHelper::IsGetOrMultiGetOnDataBlock(
|
|
1648
|
+
trace_block_type, lookup_context->caller)) {
|
|
1649
|
+
// Make a copy of the block key here since it will be logged later.
|
|
1650
|
+
lookup_context->FillLookupContext(is_cache_hit, no_insert, trace_block_type,
|
|
1651
|
+
/*block_size=*/usage,
|
|
1652
|
+
block_key.ToString(), nkeys);
|
|
1653
|
+
|
|
1654
|
+
// Defer logging the access to Get() and MultiGet() to trace additional
|
|
1655
|
+
// information, e.g., referenced_key
|
|
1656
|
+
} else {
|
|
1657
|
+
// Avoid making copy of block_key if it doesn't need to be saved in
|
|
1658
|
+
// BlockCacheLookupContext
|
|
1659
|
+
lookup_context->FillLookupContext(is_cache_hit, no_insert, trace_block_type,
|
|
1660
|
+
/*block_size=*/usage,
|
|
1661
|
+
/*block_key=*/{}, nkeys);
|
|
1662
|
+
|
|
1663
|
+
// Fill in default values for irrelevant/unknown fields
|
|
1664
|
+
FinishTraceRecord(*lookup_context, block_key,
|
|
1665
|
+
lookup_context->referenced_key,
|
|
1666
|
+
/*does_referenced_key_exist*/ false,
|
|
1667
|
+
/*referenced_data_size*/ 0);
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
void BlockBasedTable::FinishTraceRecord(
|
|
1672
|
+
const BlockCacheLookupContext& lookup_context, const Slice& block_key,
|
|
1673
|
+
const Slice& referenced_key, bool does_referenced_key_exist,
|
|
1674
|
+
uint64_t referenced_data_size) const {
|
|
1675
|
+
// Avoid making copy of referenced_key if it doesn't need to be saved in
|
|
1676
|
+
// BlockCacheLookupContext
|
|
1677
|
+
BlockCacheTraceRecord access_record(
|
|
1678
|
+
rep_->ioptions.clock->NowMicros(),
|
|
1679
|
+
/*block_key=*/"", lookup_context.block_type, lookup_context.block_size,
|
|
1680
|
+
rep_->cf_id_for_tracing(),
|
|
1681
|
+
/*cf_name=*/"", rep_->level_for_tracing(), rep_->sst_number_for_tracing(),
|
|
1682
|
+
lookup_context.caller, lookup_context.is_cache_hit,
|
|
1683
|
+
lookup_context.no_insert, lookup_context.get_id,
|
|
1684
|
+
lookup_context.get_from_user_specified_snapshot,
|
|
1685
|
+
/*referenced_key=*/"", referenced_data_size,
|
|
1686
|
+
lookup_context.num_keys_in_block, does_referenced_key_exist);
|
|
1687
|
+
// TODO: Should handle status here?
|
|
1688
|
+
block_cache_tracer_
|
|
1689
|
+
->WriteBlockAccess(access_record, block_key, rep_->cf_name_for_tracing(),
|
|
1690
|
+
referenced_key)
|
|
1691
|
+
.PermitUncheckedError();
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1627
1694
|
template <typename TBlocklike /*, auto*/>
|
|
1628
1695
|
WithBlocklikeCheck<Status, TBlocklike> BlockBasedTable::RetrieveBlock(
|
|
1629
1696
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
|
@@ -1746,8 +1813,8 @@ BlockBasedTable::PartitionedIndexIteratorState::NewSecondaryIterator(
|
|
|
1746
1813
|
bool BlockBasedTable::PrefixRangeMayMatch(
|
|
1747
1814
|
const Slice& internal_key, const ReadOptions& read_options,
|
|
1748
1815
|
const SliceTransform* options_prefix_extractor,
|
|
1749
|
-
const bool need_upper_bound_check,
|
|
1750
|
-
|
|
1816
|
+
const bool need_upper_bound_check, BlockCacheLookupContext* lookup_context,
|
|
1817
|
+
bool* filter_checked) const {
|
|
1751
1818
|
if (!rep_->filter_policy) {
|
|
1752
1819
|
return true;
|
|
1753
1820
|
}
|
|
@@ -1772,7 +1839,7 @@ bool BlockBasedTable::PrefixRangeMayMatch(
|
|
|
1772
1839
|
bool may_match = true;
|
|
1773
1840
|
|
|
1774
1841
|
FilterBlockReader* const filter = rep_->filter.get();
|
|
1775
|
-
|
|
1842
|
+
*filter_checked = false;
|
|
1776
1843
|
if (filter != nullptr) {
|
|
1777
1844
|
const bool no_io = read_options.read_tier == kBlockCacheTier;
|
|
1778
1845
|
|
|
@@ -1780,16 +1847,8 @@ bool BlockBasedTable::PrefixRangeMayMatch(
|
|
|
1780
1847
|
may_match = filter->RangeMayExist(
|
|
1781
1848
|
read_options.iterate_upper_bound, user_key_without_ts, prefix_extractor,
|
|
1782
1849
|
rep_->internal_comparator.user_comparator(), const_ikey_ptr,
|
|
1783
|
-
|
|
1784
|
-
read_options
|
|
1785
|
-
}
|
|
1786
|
-
|
|
1787
|
-
if (filter_checked) {
|
|
1788
|
-
Statistics* statistics = rep_->ioptions.stats;
|
|
1789
|
-
RecordTick(statistics, BLOOM_FILTER_PREFIX_CHECKED);
|
|
1790
|
-
if (!may_match) {
|
|
1791
|
-
RecordTick(statistics, BLOOM_FILTER_PREFIX_USEFUL);
|
|
1792
|
-
}
|
|
1850
|
+
filter_checked, need_upper_bound_check, no_io, lookup_context,
|
|
1851
|
+
read_options);
|
|
1793
1852
|
}
|
|
1794
1853
|
|
|
1795
1854
|
return may_match;
|
|
@@ -1807,6 +1866,13 @@ bool BlockBasedTable::PrefixExtractorChanged(
|
|
|
1807
1866
|
}
|
|
1808
1867
|
}
|
|
1809
1868
|
|
|
1869
|
+
Statistics* BlockBasedTable::GetStatistics() const {
|
|
1870
|
+
return rep_->ioptions.stats;
|
|
1871
|
+
}
|
|
1872
|
+
bool BlockBasedTable::IsLastLevel() const {
|
|
1873
|
+
return rep_->level == rep_->ioptions.num_levels - 1;
|
|
1874
|
+
}
|
|
1875
|
+
|
|
1810
1876
|
InternalIterator* BlockBasedTable::NewIterator(
|
|
1811
1877
|
const ReadOptions& read_options, const SliceTransform* prefix_extractor,
|
|
1812
1878
|
Arena* arena, bool skip_filters, TableReaderCaller caller,
|
|
@@ -1855,7 +1921,7 @@ bool BlockBasedTable::FullFilterKeyMayMatch(
|
|
|
1855
1921
|
FilterBlockReader* filter, const Slice& internal_key, const bool no_io,
|
|
1856
1922
|
const SliceTransform* prefix_extractor, GetContext* get_context,
|
|
1857
1923
|
BlockCacheLookupContext* lookup_context,
|
|
1858
|
-
|
|
1924
|
+
const ReadOptions& read_options) const {
|
|
1859
1925
|
if (filter == nullptr) {
|
|
1860
1926
|
return true;
|
|
1861
1927
|
}
|
|
@@ -1865,22 +1931,31 @@ bool BlockBasedTable::FullFilterKeyMayMatch(
|
|
|
1865
1931
|
size_t ts_sz = rep_->internal_comparator.user_comparator()->timestamp_size();
|
|
1866
1932
|
Slice user_key_without_ts = StripTimestampFromUserKey(user_key, ts_sz);
|
|
1867
1933
|
if (rep_->whole_key_filtering) {
|
|
1868
|
-
may_match =
|
|
1869
|
-
|
|
1870
|
-
|
|
1934
|
+
may_match = filter->KeyMayMatch(user_key_without_ts, no_io, const_ikey_ptr,
|
|
1935
|
+
get_context, lookup_context, read_options);
|
|
1936
|
+
if (may_match) {
|
|
1937
|
+
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_POSITIVE);
|
|
1938
|
+
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_positive, 1, rep_->level);
|
|
1939
|
+
} else {
|
|
1940
|
+
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_USEFUL);
|
|
1941
|
+
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, 1, rep_->level);
|
|
1942
|
+
}
|
|
1871
1943
|
} else if (!PrefixExtractorChanged(prefix_extractor) &&
|
|
1872
|
-
prefix_extractor->InDomain(user_key_without_ts)
|
|
1873
|
-
!filter->PrefixMayMatch(
|
|
1874
|
-
prefix_extractor->Transform(user_key_without_ts), no_io,
|
|
1875
|
-
const_ikey_ptr, get_context, lookup_context,
|
|
1876
|
-
rate_limiter_priority)) {
|
|
1944
|
+
prefix_extractor->InDomain(user_key_without_ts)) {
|
|
1877
1945
|
// FIXME ^^^: there should be no reason for Get() to depend on current
|
|
1878
1946
|
// prefix_extractor at all. It should always use table_prefix_extractor.
|
|
1879
|
-
may_match =
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
RecordTick(rep_->ioptions.stats,
|
|
1883
|
-
|
|
1947
|
+
may_match = filter->PrefixMayMatch(
|
|
1948
|
+
prefix_extractor->Transform(user_key_without_ts), no_io, const_ikey_ptr,
|
|
1949
|
+
get_context, lookup_context, read_options);
|
|
1950
|
+
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_CHECKED);
|
|
1951
|
+
if (may_match) {
|
|
1952
|
+
// Includes prefix stats
|
|
1953
|
+
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_positive, 1, rep_->level);
|
|
1954
|
+
} else {
|
|
1955
|
+
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_USEFUL);
|
|
1956
|
+
// Includes prefix stats
|
|
1957
|
+
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, 1, rep_->level);
|
|
1958
|
+
}
|
|
1884
1959
|
}
|
|
1885
1960
|
return may_match;
|
|
1886
1961
|
}
|
|
@@ -1889,14 +1964,14 @@ void BlockBasedTable::FullFilterKeysMayMatch(
|
|
|
1889
1964
|
FilterBlockReader* filter, MultiGetRange* range, const bool no_io,
|
|
1890
1965
|
const SliceTransform* prefix_extractor,
|
|
1891
1966
|
BlockCacheLookupContext* lookup_context,
|
|
1892
|
-
|
|
1967
|
+
const ReadOptions& read_options) const {
|
|
1893
1968
|
if (filter == nullptr) {
|
|
1894
1969
|
return;
|
|
1895
1970
|
}
|
|
1896
1971
|
uint64_t before_keys = range->KeysLeft();
|
|
1897
1972
|
assert(before_keys > 0); // Caller should ensure
|
|
1898
1973
|
if (rep_->whole_key_filtering) {
|
|
1899
|
-
filter->KeysMayMatch(range, no_io, lookup_context,
|
|
1974
|
+
filter->KeysMayMatch(range, no_io, lookup_context, read_options);
|
|
1900
1975
|
uint64_t after_keys = range->KeysLeft();
|
|
1901
1976
|
if (after_keys) {
|
|
1902
1977
|
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_POSITIVE, after_keys);
|
|
@@ -1913,13 +1988,21 @@ void BlockBasedTable::FullFilterKeysMayMatch(
|
|
|
1913
1988
|
// FIXME ^^^: there should be no reason for MultiGet() to depend on current
|
|
1914
1989
|
// prefix_extractor at all. It should always use table_prefix_extractor.
|
|
1915
1990
|
filter->PrefixesMayMatch(range, prefix_extractor, false, lookup_context,
|
|
1916
|
-
|
|
1991
|
+
read_options);
|
|
1917
1992
|
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_CHECKED, before_keys);
|
|
1918
1993
|
uint64_t after_keys = range->KeysLeft();
|
|
1994
|
+
if (after_keys) {
|
|
1995
|
+
// Includes prefix stats
|
|
1996
|
+
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_positive, after_keys,
|
|
1997
|
+
rep_->level);
|
|
1998
|
+
}
|
|
1919
1999
|
uint64_t filtered_keys = before_keys - after_keys;
|
|
1920
2000
|
if (filtered_keys) {
|
|
1921
2001
|
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_USEFUL,
|
|
1922
2002
|
filtered_keys);
|
|
2003
|
+
// Includes prefix stats
|
|
2004
|
+
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, filtered_keys,
|
|
2005
|
+
rep_->level);
|
|
1923
2006
|
}
|
|
1924
2007
|
}
|
|
1925
2008
|
}
|
|
@@ -1937,8 +2020,8 @@ Status BlockBasedTable::ApproximateKeyAnchors(const ReadOptions& read_options,
|
|
|
1937
2020
|
// `CacheDependencies()` brings all the blocks into cache using one I/O. That
|
|
1938
2021
|
// way the full index scan usually finds the index data it is looking for in
|
|
1939
2022
|
// cache rather than doing an I/O for each "dependency" (partition).
|
|
1940
|
-
Status s =
|
|
1941
|
-
|
|
2023
|
+
Status s = rep_->index_reader->CacheDependencies(
|
|
2024
|
+
read_options, false /* pin */, nullptr /* prefetch_buffer */);
|
|
1942
2025
|
if (!s.ok()) {
|
|
1943
2026
|
return s;
|
|
1944
2027
|
}
|
|
@@ -1985,10 +2068,28 @@ Status BlockBasedTable::ApproximateKeyAnchors(const ReadOptions& read_options,
|
|
|
1985
2068
|
return Status::OK();
|
|
1986
2069
|
}
|
|
1987
2070
|
|
|
2071
|
+
bool BlockBasedTable::TimestampMayMatch(const ReadOptions& read_options) const {
|
|
2072
|
+
if (read_options.timestamp != nullptr && !rep_->min_timestamp.empty()) {
|
|
2073
|
+
RecordTick(rep_->ioptions.stats, TIMESTAMP_FILTER_TABLE_CHECKED);
|
|
2074
|
+
auto read_ts = read_options.timestamp;
|
|
2075
|
+
auto comparator = rep_->internal_comparator.user_comparator();
|
|
2076
|
+
if (comparator->CompareTimestamp(*read_ts, rep_->min_timestamp) < 0) {
|
|
2077
|
+
RecordTick(rep_->ioptions.stats, TIMESTAMP_FILTER_TABLE_FILTERED);
|
|
2078
|
+
return false;
|
|
2079
|
+
}
|
|
2080
|
+
}
|
|
2081
|
+
return true;
|
|
2082
|
+
}
|
|
2083
|
+
|
|
1988
2084
|
Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
|
|
1989
2085
|
GetContext* get_context,
|
|
1990
2086
|
const SliceTransform* prefix_extractor,
|
|
1991
2087
|
bool skip_filters) {
|
|
2088
|
+
// Similar to Bloom filter !may_match
|
|
2089
|
+
// If timestamp is beyond the range of the table, skip
|
|
2090
|
+
if (!TimestampMayMatch(read_options)) {
|
|
2091
|
+
return Status::OK();
|
|
2092
|
+
}
|
|
1992
2093
|
assert(key.size() >= 8); // key must be internal key
|
|
1993
2094
|
assert(get_context != nullptr);
|
|
1994
2095
|
Status s;
|
|
@@ -2010,14 +2111,11 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
|
|
|
2010
2111
|
read_options.snapshot != nullptr;
|
|
2011
2112
|
}
|
|
2012
2113
|
TEST_SYNC_POINT("BlockBasedTable::Get:BeforeFilterMatch");
|
|
2013
|
-
const bool may_match =
|
|
2014
|
-
filter, key, no_io, prefix_extractor, get_context,
|
|
2015
|
-
|
|
2114
|
+
const bool may_match =
|
|
2115
|
+
FullFilterKeyMayMatch(filter, key, no_io, prefix_extractor, get_context,
|
|
2116
|
+
&lookup_context, read_options);
|
|
2016
2117
|
TEST_SYNC_POINT("BlockBasedTable::Get:AfterFilterMatch");
|
|
2017
|
-
if (
|
|
2018
|
-
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_USEFUL);
|
|
2019
|
-
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_useful, 1, rep_->level);
|
|
2020
|
-
} else {
|
|
2118
|
+
if (may_match) {
|
|
2021
2119
|
IndexBlockIter iiter_on_stack;
|
|
2022
2120
|
// if prefix_extractor found in block differs from options, disable
|
|
2023
2121
|
// BlockPrefixIndex. Only do this check when index_type is kHashSearch.
|
|
@@ -2107,6 +2205,9 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
|
|
|
2107
2205
|
}
|
|
2108
2206
|
}
|
|
2109
2207
|
s = biter.status();
|
|
2208
|
+
if (!s.ok()) {
|
|
2209
|
+
break;
|
|
2210
|
+
}
|
|
2110
2211
|
}
|
|
2111
2212
|
// Write the block cache access record.
|
|
2112
2213
|
if (block_cache_tracer_ && block_cache_tracer_->is_tracing_enabled()) {
|
|
@@ -2118,25 +2219,9 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
|
|
|
2118
2219
|
} else {
|
|
2119
2220
|
referenced_key = key;
|
|
2120
2221
|
}
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
lookup_data_block_context.block_size, rep_->cf_id_for_tracing(),
|
|
2125
|
-
/*cf_name=*/"", rep_->level_for_tracing(),
|
|
2126
|
-
rep_->sst_number_for_tracing(), lookup_data_block_context.caller,
|
|
2127
|
-
lookup_data_block_context.is_cache_hit,
|
|
2128
|
-
lookup_data_block_context.no_insert,
|
|
2129
|
-
lookup_data_block_context.get_id,
|
|
2130
|
-
lookup_data_block_context.get_from_user_specified_snapshot,
|
|
2131
|
-
/*referenced_key=*/"", referenced_data_size,
|
|
2132
|
-
lookup_data_block_context.num_keys_in_block,
|
|
2133
|
-
does_referenced_key_exist);
|
|
2134
|
-
// TODO: Should handle status here?
|
|
2135
|
-
block_cache_tracer_
|
|
2136
|
-
->WriteBlockAccess(access_record,
|
|
2137
|
-
lookup_data_block_context.block_key,
|
|
2138
|
-
rep_->cf_name_for_tracing(), referenced_key)
|
|
2139
|
-
.PermitUncheckedError();
|
|
2222
|
+
FinishTraceRecord(lookup_data_block_context,
|
|
2223
|
+
lookup_data_block_context.block_key, referenced_key,
|
|
2224
|
+
does_referenced_key_exist, referenced_data_size);
|
|
2140
2225
|
}
|
|
2141
2226
|
|
|
2142
2227
|
if (done) {
|
|
@@ -2145,10 +2230,16 @@ Status BlockBasedTable::Get(const ReadOptions& read_options, const Slice& key,
|
|
|
2145
2230
|
}
|
|
2146
2231
|
}
|
|
2147
2232
|
if (matched && filter != nullptr) {
|
|
2148
|
-
|
|
2233
|
+
if (rep_->whole_key_filtering) {
|
|
2234
|
+
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_FULL_TRUE_POSITIVE);
|
|
2235
|
+
} else {
|
|
2236
|
+
RecordTick(rep_->ioptions.stats, BLOOM_FILTER_PREFIX_TRUE_POSITIVE);
|
|
2237
|
+
}
|
|
2238
|
+
// Includes prefix stats
|
|
2149
2239
|
PERF_COUNTER_BY_LEVEL_ADD(bloom_filter_full_true_positive, 1,
|
|
2150
2240
|
rep_->level);
|
|
2151
2241
|
}
|
|
2242
|
+
|
|
2152
2243
|
if (s.ok() && !iiter->status().IsNotFound()) {
|
|
2153
2244
|
s = iiter->status();
|
|
2154
2245
|
}
|
|
@@ -2182,12 +2273,13 @@ Status BlockBasedTable::MultiGetFilter(const ReadOptions& read_options,
|
|
|
2182
2273
|
TableReaderCaller::kUserMultiGet, tracing_mget_id,
|
|
2183
2274
|
/*_get_from_user_specified_snapshot=*/read_options.snapshot != nullptr};
|
|
2184
2275
|
FullFilterKeysMayMatch(filter, mget_range, no_io, prefix_extractor,
|
|
2185
|
-
&lookup_context, read_options
|
|
2276
|
+
&lookup_context, read_options);
|
|
2186
2277
|
|
|
2187
2278
|
return Status::OK();
|
|
2188
2279
|
}
|
|
2189
2280
|
|
|
2190
|
-
Status BlockBasedTable::Prefetch(const
|
|
2281
|
+
Status BlockBasedTable::Prefetch(const ReadOptions& read_options,
|
|
2282
|
+
const Slice* const begin,
|
|
2191
2283
|
const Slice* const end) {
|
|
2192
2284
|
auto& comparator = rep_->internal_comparator;
|
|
2193
2285
|
UserComparatorWrapper user_comparator(comparator.user_comparator());
|
|
@@ -2197,7 +2289,7 @@ Status BlockBasedTable::Prefetch(const Slice* const begin,
|
|
|
2197
2289
|
}
|
|
2198
2290
|
BlockCacheLookupContext lookup_context{TableReaderCaller::kPrefetch};
|
|
2199
2291
|
IndexBlockIter iiter_on_stack;
|
|
2200
|
-
auto iiter = NewIndexIterator(
|
|
2292
|
+
auto iiter = NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
|
|
2201
2293
|
&iiter_on_stack, /*get_context=*/nullptr,
|
|
2202
2294
|
&lookup_context);
|
|
2203
2295
|
std::unique_ptr<InternalIteratorBase<IndexValue>> iiter_unique_ptr;
|
|
@@ -2234,7 +2326,7 @@ Status BlockBasedTable::Prefetch(const Slice* const begin,
|
|
|
2234
2326
|
DataBlockIter biter;
|
|
2235
2327
|
Status tmp_status;
|
|
2236
2328
|
NewDataBlockIterator<DataBlockIter>(
|
|
2237
|
-
|
|
2329
|
+
read_options, block_handle, &biter, /*type=*/BlockType::kData,
|
|
2238
2330
|
/*get_context=*/nullptr, &lookup_context,
|
|
2239
2331
|
/*prefetch_buffer=*/nullptr, /*for_compaction=*/false,
|
|
2240
2332
|
/*async_read=*/false, tmp_status);
|
|
@@ -2254,11 +2346,10 @@ Status BlockBasedTable::VerifyChecksum(const ReadOptions& read_options,
|
|
|
2254
2346
|
// Check Meta blocks
|
|
2255
2347
|
std::unique_ptr<Block> metaindex;
|
|
2256
2348
|
std::unique_ptr<InternalIterator> metaindex_iter;
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
&metaindex_iter);
|
|
2349
|
+
s = ReadMetaIndexBlock(read_options, nullptr /* prefetch buffer */,
|
|
2350
|
+
&metaindex, &metaindex_iter);
|
|
2260
2351
|
if (s.ok()) {
|
|
2261
|
-
s = VerifyChecksumInMetaBlocks(metaindex_iter.get());
|
|
2352
|
+
s = VerifyChecksumInMetaBlocks(read_options, metaindex_iter.get());
|
|
2262
2353
|
if (!s.ok()) {
|
|
2263
2354
|
return s;
|
|
2264
2355
|
}
|
|
@@ -2365,7 +2456,7 @@ BlockType BlockBasedTable::GetBlockTypeForMetaBlockByName(
|
|
|
2365
2456
|
}
|
|
2366
2457
|
|
|
2367
2458
|
Status BlockBasedTable::VerifyChecksumInMetaBlocks(
|
|
2368
|
-
InternalIteratorBase<Slice>* index_iter) {
|
|
2459
|
+
const ReadOptions& read_options, InternalIteratorBase<Slice>* index_iter) {
|
|
2369
2460
|
Status s;
|
|
2370
2461
|
for (index_iter->SeekToFirst(); index_iter->Valid(); index_iter->Next()) {
|
|
2371
2462
|
s = index_iter->status();
|
|
@@ -2381,14 +2472,14 @@ Status BlockBasedTable::VerifyChecksumInMetaBlocks(
|
|
|
2381
2472
|
// Unfortunate special handling for properties block checksum w/
|
|
2382
2473
|
// global seqno
|
|
2383
2474
|
std::unique_ptr<TableProperties> table_properties;
|
|
2384
|
-
s = ReadTablePropertiesHelper(
|
|
2475
|
+
s = ReadTablePropertiesHelper(read_options, handle, rep_->file.get(),
|
|
2385
2476
|
nullptr /* prefetch_buffer */, rep_->footer,
|
|
2386
2477
|
rep_->ioptions, &table_properties,
|
|
2387
2478
|
nullptr /* memory_allocator */);
|
|
2388
2479
|
} else {
|
|
2389
2480
|
s = BlockFetcher(
|
|
2390
2481
|
rep_->file.get(), nullptr /* prefetch buffer */, rep_->footer,
|
|
2391
|
-
|
|
2482
|
+
read_options, handle, &contents, rep_->ioptions,
|
|
2392
2483
|
false /* decompress */, false /*maybe_compressed*/,
|
|
2393
2484
|
GetBlockTypeForMetaBlockByName(meta_block_name),
|
|
2394
2485
|
UncompressionDict::GetEmptyDict(), rep_->persistent_cache_options)
|
|
@@ -2500,7 +2591,8 @@ uint64_t BlockBasedTable::GetApproximateDataSize() {
|
|
|
2500
2591
|
return rep_->footer.metaindex_handle().offset();
|
|
2501
2592
|
}
|
|
2502
2593
|
|
|
2503
|
-
uint64_t BlockBasedTable::ApproximateOffsetOf(const
|
|
2594
|
+
uint64_t BlockBasedTable::ApproximateOffsetOf(const ReadOptions& read_options,
|
|
2595
|
+
const Slice& key,
|
|
2504
2596
|
TableReaderCaller caller) {
|
|
2505
2597
|
uint64_t data_size = GetApproximateDataSize();
|
|
2506
2598
|
if (UNLIKELY(data_size == 0)) {
|
|
@@ -2514,6 +2606,7 @@ uint64_t BlockBasedTable::ApproximateOffsetOf(const Slice& key,
|
|
|
2514
2606
|
IndexBlockIter iiter_on_stack;
|
|
2515
2607
|
ReadOptions ro;
|
|
2516
2608
|
ro.total_order_seek = true;
|
|
2609
|
+
ro.io_activity = read_options.io_activity;
|
|
2517
2610
|
auto index_iter =
|
|
2518
2611
|
NewIndexIterator(ro, /*disable_prefix_seek=*/true,
|
|
2519
2612
|
/*input_iter=*/&iiter_on_stack, /*get_context=*/nullptr,
|
|
@@ -2542,7 +2635,8 @@ uint64_t BlockBasedTable::ApproximateOffsetOf(const Slice& key,
|
|
|
2542
2635
|
static_cast<double>(rep_->file_size));
|
|
2543
2636
|
}
|
|
2544
2637
|
|
|
2545
|
-
uint64_t BlockBasedTable::ApproximateSize(const
|
|
2638
|
+
uint64_t BlockBasedTable::ApproximateSize(const ReadOptions& read_options,
|
|
2639
|
+
const Slice& start, const Slice& end,
|
|
2546
2640
|
TableReaderCaller caller) {
|
|
2547
2641
|
assert(rep_->internal_comparator.Compare(start, end) <= 0);
|
|
2548
2642
|
|
|
@@ -2559,6 +2653,7 @@ uint64_t BlockBasedTable::ApproximateSize(const Slice& start, const Slice& end,
|
|
|
2559
2653
|
IndexBlockIter iiter_on_stack;
|
|
2560
2654
|
ReadOptions ro;
|
|
2561
2655
|
ro.total_order_seek = true;
|
|
2656
|
+
ro.io_activity = read_options.io_activity;
|
|
2562
2657
|
auto index_iter =
|
|
2563
2658
|
NewIndexIterator(ro, /*disable_prefix_seek=*/true,
|
|
2564
2659
|
/*input_iter=*/&iiter_on_stack, /*get_context=*/nullptr,
|
|
@@ -2610,9 +2705,9 @@ bool BlockBasedTable::TEST_IndexBlockInCache() const {
|
|
|
2610
2705
|
}
|
|
2611
2706
|
|
|
2612
2707
|
Status BlockBasedTable::GetKVPairsFromDataBlocks(
|
|
2613
|
-
std::vector<KVPairBlock>* kv_pair_blocks) {
|
|
2708
|
+
const ReadOptions& read_options, std::vector<KVPairBlock>* kv_pair_blocks) {
|
|
2614
2709
|
std::unique_ptr<InternalIteratorBase<IndexValue>> blockhandles_iter(
|
|
2615
|
-
NewIndexIterator(
|
|
2710
|
+
NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
|
|
2616
2711
|
/*input_iter=*/nullptr, /*get_context=*/nullptr,
|
|
2617
2712
|
/*lookup_contex=*/nullptr));
|
|
2618
2713
|
|
|
@@ -2633,7 +2728,7 @@ Status BlockBasedTable::GetKVPairsFromDataBlocks(
|
|
|
2633
2728
|
std::unique_ptr<InternalIterator> datablock_iter;
|
|
2634
2729
|
Status tmp_status;
|
|
2635
2730
|
datablock_iter.reset(NewDataBlockIterator<DataBlockIter>(
|
|
2636
|
-
|
|
2731
|
+
read_options, blockhandles_iter->value().handle,
|
|
2637
2732
|
/*input_iter=*/nullptr, /*type=*/BlockType::kData,
|
|
2638
2733
|
/*get_context=*/nullptr, /*lookup_context=*/nullptr,
|
|
2639
2734
|
/*prefetch_buffer=*/nullptr, /*for_compaction=*/false,
|
|
@@ -2679,7 +2774,8 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
|
|
|
2679
2774
|
"--------------------------------------\n";
|
|
2680
2775
|
std::unique_ptr<Block> metaindex;
|
|
2681
2776
|
std::unique_ptr<InternalIterator> metaindex_iter;
|
|
2682
|
-
|
|
2777
|
+
// TODO: plumb Env::IOActivity
|
|
2778
|
+
const ReadOptions ro;
|
|
2683
2779
|
Status s = ReadMetaIndexBlock(ro, nullptr /* prefetch_buffer */, &metaindex,
|
|
2684
2780
|
&metaindex_iter);
|
|
2685
2781
|
if (s.ok()) {
|
|
@@ -2735,7 +2831,7 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
|
|
|
2735
2831
|
if (rep_->uncompression_dict_reader) {
|
|
2736
2832
|
CachableEntry<UncompressionDict> uncompression_dict;
|
|
2737
2833
|
s = rep_->uncompression_dict_reader->GetOrReadUncompressionDictionary(
|
|
2738
|
-
nullptr /* prefetch_buffer */, false /* no_io */,
|
|
2834
|
+
nullptr /* prefetch_buffer */, ro, false /* no_io */,
|
|
2739
2835
|
false, /* verify_checksums */
|
|
2740
2836
|
nullptr /* get_context */, nullptr /* lookup_context */,
|
|
2741
2837
|
&uncompression_dict);
|
|
@@ -2753,7 +2849,7 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
|
|
|
2753
2849
|
}
|
|
2754
2850
|
|
|
2755
2851
|
// Output range deletions block
|
|
2756
|
-
auto* range_del_iter = NewRangeTombstoneIterator(
|
|
2852
|
+
auto* range_del_iter = NewRangeTombstoneIterator(ro);
|
|
2757
2853
|
if (range_del_iter != nullptr) {
|
|
2758
2854
|
range_del_iter->SeekToFirst();
|
|
2759
2855
|
if (range_del_iter->Valid()) {
|
|
@@ -2783,8 +2879,10 @@ Status BlockBasedTable::DumpTable(WritableFile* out_file) {
|
|
|
2783
2879
|
Status BlockBasedTable::DumpIndexBlock(std::ostream& out_stream) {
|
|
2784
2880
|
out_stream << "Index Details:\n"
|
|
2785
2881
|
"--------------------------------------\n";
|
|
2882
|
+
// TODO: plumb Env::IOActivity
|
|
2883
|
+
const ReadOptions read_options;
|
|
2786
2884
|
std::unique_ptr<InternalIteratorBase<IndexValue>> blockhandles_iter(
|
|
2787
|
-
NewIndexIterator(
|
|
2885
|
+
NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
|
|
2788
2886
|
/*input_iter=*/nullptr, /*get_context=*/nullptr,
|
|
2789
2887
|
/*lookup_contex=*/nullptr));
|
|
2790
2888
|
Status s = blockhandles_iter->status();
|
|
@@ -2832,8 +2930,10 @@ Status BlockBasedTable::DumpIndexBlock(std::ostream& out_stream) {
|
|
|
2832
2930
|
}
|
|
2833
2931
|
|
|
2834
2932
|
Status BlockBasedTable::DumpDataBlocks(std::ostream& out_stream) {
|
|
2933
|
+
// TODO: plumb Env::IOActivity
|
|
2934
|
+
const ReadOptions read_options;
|
|
2835
2935
|
std::unique_ptr<InternalIteratorBase<IndexValue>> blockhandles_iter(
|
|
2836
|
-
NewIndexIterator(
|
|
2936
|
+
NewIndexIterator(read_options, /*need_upper_bound_check=*/false,
|
|
2837
2937
|
/*input_iter=*/nullptr, /*get_context=*/nullptr,
|
|
2838
2938
|
/*lookup_contex=*/nullptr));
|
|
2839
2939
|
Status s = blockhandles_iter->status();
|
|
@@ -2867,7 +2967,7 @@ Status BlockBasedTable::DumpDataBlocks(std::ostream& out_stream) {
|
|
|
2867
2967
|
std::unique_ptr<InternalIterator> datablock_iter;
|
|
2868
2968
|
Status tmp_status;
|
|
2869
2969
|
datablock_iter.reset(NewDataBlockIterator<DataBlockIter>(
|
|
2870
|
-
|
|
2970
|
+
read_options, blockhandles_iter->value().handle,
|
|
2871
2971
|
/*input_iter=*/nullptr, /*type=*/BlockType::kData,
|
|
2872
2972
|
/*get_context=*/nullptr, /*lookup_context=*/nullptr,
|
|
2873
2973
|
/*prefetch_buffer=*/nullptr, /*for_compaction=*/false,
|