@nxtedition/rocksdb 6.0.0-alpha.0 → 6.0.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/BUILDING.md +10 -0
- package/binding.cc +14 -17
- package/binding.gyp +2 -2
- package/deps/rocksdb/build_version.cc +4 -10
- package/deps/rocksdb/rocksdb/CMakeLists.txt +17 -3
- package/deps/rocksdb/rocksdb/Makefile +57 -86
- package/deps/rocksdb/rocksdb/TARGETS +4 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +29 -17
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +511 -0
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +299 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +3 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +7 -0
- package/deps/rocksdb/rocksdb/common.mk +30 -0
- package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/builder.cc +11 -4
- package/deps/rocksdb/rocksdb/db/c.cc +45 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +25 -2
- package/deps/rocksdb/rocksdb/db/column_family.cc +4 -3
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +25 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +6 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +69 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +21 -21
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +135 -32
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +9 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +9 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +15 -14
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
- package/deps/rocksdb/rocksdb/db/db_test.cc +44 -42
- package/deps/rocksdb/rocksdb/db/db_test2.cc +23 -19
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +95 -17
- package/deps/rocksdb/rocksdb/db/db_test_util.h +48 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +34 -12
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +3 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
- package/deps/rocksdb/rocksdb/db/flush_job.cc +18 -4
- package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
- package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
- package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
- package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -4
- package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_set.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
- package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +7 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +31 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +359 -275
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
- package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
- package/deps/rocksdb/rocksdb/env/env.cc +0 -60
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
- package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
- package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
- package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -1
- package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +69 -45
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +35 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +28 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +189 -103
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
- package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
- package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
- package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
- package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +2 -8
- package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
- package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
- package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
- package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +34 -38
- package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
- package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
- package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
- package/deps/rocksdb/rocksdb/options/db_options.cc +38 -17
- package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +82 -39
- package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -3
- package/deps/rocksdb/rocksdb/options/options_test.cc +115 -59
- package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
- package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
- package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
- package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
- package/deps/rocksdb/rocksdb/src.mk +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +14 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +85 -41
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +42 -72
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +7 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +6 -3
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -5
- package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/format.cc +22 -20
- package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/multiget_context.h +14 -11
- package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
- package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
- package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
- package/deps/rocksdb/rocksdb/table/unique_id.cc +57 -25
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +34 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +254 -98
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +17 -3
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
- package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
- package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
- package/deps/rocksdb/rocksdb/util/compression.h +7 -7
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
- package/deps/rocksdb/rocksdb/util/heap.h +5 -3
- package/deps/rocksdb/rocksdb/util/random.cc +1 -5
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
- package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
- package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
- package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
- package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
- package/deps/rocksdb/rocksdb.gyp +40 -31
- package/package.json +2 -2
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/python.mk +0 -9
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-arm64/node.napi.node +0 -0
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
#include <algorithm>
|
|
12
12
|
#include <array>
|
|
13
|
+
#include <cstdint>
|
|
13
14
|
#include <limits>
|
|
14
15
|
#include <memory>
|
|
15
16
|
#include <string>
|
|
@@ -117,14 +118,6 @@ Status ReadBlockFromFile(
|
|
|
117
118
|
return s;
|
|
118
119
|
}
|
|
119
120
|
|
|
120
|
-
// Release the cached entry and decrement its ref count.
|
|
121
|
-
// Do not force erase
|
|
122
|
-
void ReleaseCachedEntry(void* arg, void* h) {
|
|
123
|
-
Cache* cache = reinterpret_cast<Cache*>(arg);
|
|
124
|
-
Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(h);
|
|
125
|
-
cache->Release(handle, false /* erase_if_last_ref */);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
121
|
// For hash based index, return false if table_properties->prefix_extractor_name
|
|
129
122
|
// and prefix_extractor both exist and match, otherwise true.
|
|
130
123
|
inline bool PrefixExtractorChangedHelper(
|
|
@@ -568,7 +561,7 @@ Status BlockBasedTable::Open(
|
|
|
568
561
|
Footer footer;
|
|
569
562
|
std::unique_ptr<FilePrefetchBuffer> prefetch_buffer;
|
|
570
563
|
|
|
571
|
-
//
|
|
564
|
+
// From read_options, retain deadline, io_timeout, and rate_limiter_priority.
|
|
572
565
|
// In future, we may retain more
|
|
573
566
|
// options. Specifically, w ignore verify_checksums and default to
|
|
574
567
|
// checksum verification anyway when creating the index and filter
|
|
@@ -576,6 +569,7 @@ Status BlockBasedTable::Open(
|
|
|
576
569
|
ReadOptions ro;
|
|
577
570
|
ro.deadline = read_options.deadline;
|
|
578
571
|
ro.io_timeout = read_options.io_timeout;
|
|
572
|
+
ro.rate_limiter_priority = read_options.rate_limiter_priority;
|
|
579
573
|
|
|
580
574
|
// prefetch both index and filters, down to all partitions
|
|
581
575
|
const bool prefetch_all = prefetch_index_and_filter_in_cache || level == 0;
|
|
@@ -725,7 +719,10 @@ Status BlockBasedTable::Open(
|
|
|
725
719
|
mem_usage, &(rep->table_reader_cache_res_handle));
|
|
726
720
|
if (s.IsIncomplete()) {
|
|
727
721
|
s = Status::MemoryLimit(
|
|
728
|
-
"Can't allocate
|
|
722
|
+
"Can't allocate " +
|
|
723
|
+
kCacheEntryRoleToCamelString[static_cast<std::uint32_t>(
|
|
724
|
+
CacheEntryRole::kBlockBasedTableReader)] +
|
|
725
|
+
" due to memory limit based on "
|
|
729
726
|
"cache capacity for memory allocation");
|
|
730
727
|
}
|
|
731
728
|
}
|
|
@@ -770,7 +767,8 @@ Status BlockBasedTable::PrefetchTail(
|
|
|
770
767
|
|
|
771
768
|
// Try file system prefetch
|
|
772
769
|
if (!file->use_direct_io() && !force_direct_prefetch) {
|
|
773
|
-
if (!file->Prefetch(prefetch_off, prefetch_len
|
|
770
|
+
if (!file->Prefetch(prefetch_off, prefetch_len, ro.rate_limiter_priority)
|
|
771
|
+
.IsNotSupported()) {
|
|
774
772
|
prefetch_buffer->reset(new FilePrefetchBuffer(
|
|
775
773
|
0 /* readahead_size */, 0 /* max_readahead_size */,
|
|
776
774
|
false /* enable */, true /* track_min_offset */));
|
|
@@ -782,6 +780,7 @@ Status BlockBasedTable::PrefetchTail(
|
|
|
782
780
|
prefetch_buffer->reset(
|
|
783
781
|
new FilePrefetchBuffer(0 /* readahead_size */, 0 /* max_readahead_size */,
|
|
784
782
|
true /* enable */, true /* track_min_offset */));
|
|
783
|
+
|
|
785
784
|
IOOptions opts;
|
|
786
785
|
Status s = file->PrepareIOOptions(ro, opts);
|
|
787
786
|
if (s.ok()) {
|
|
@@ -1819,10 +1818,11 @@ void BlockBasedTable::RetrieveMultipleBlocks(
|
|
|
1819
1818
|
if (s.ok()) {
|
|
1820
1819
|
if ((req.result.size() != req.len) ||
|
|
1821
1820
|
(req_offset + BlockSizeWithTrailer(handle) > req.result.size())) {
|
|
1822
|
-
s = Status::Corruption(
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1821
|
+
s = Status::Corruption("truncated block read from " +
|
|
1822
|
+
rep_->file->file_name() + " offset " +
|
|
1823
|
+
std::to_string(handle.offset()) + ", expected " +
|
|
1824
|
+
std::to_string(req.len) + " bytes, got " +
|
|
1825
|
+
std::to_string(req.result.size()));
|
|
1826
1826
|
}
|
|
1827
1827
|
}
|
|
1828
1828
|
|
|
@@ -2570,10 +2570,11 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2570
2570
|
iiter_unique_ptr.reset(iiter);
|
|
2571
2571
|
}
|
|
2572
2572
|
|
|
2573
|
-
uint64_t
|
|
2573
|
+
uint64_t prev_offset = std::numeric_limits<uint64_t>::max();
|
|
2574
2574
|
autovector<BlockHandle, MultiGetContext::MAX_BATCH_SIZE> block_handles;
|
|
2575
2575
|
autovector<CachableEntry<Block>, MultiGetContext::MAX_BATCH_SIZE> results;
|
|
2576
2576
|
autovector<Status, MultiGetContext::MAX_BATCH_SIZE> statuses;
|
|
2577
|
+
MultiGetContext::Mask reused_mask = 0;
|
|
2577
2578
|
char stack_buf[kMultiGetReadStackBufSize];
|
|
2578
2579
|
std::unique_ptr<char[]> block_buf;
|
|
2579
2580
|
{
|
|
@@ -2635,16 +2636,19 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2635
2636
|
|
|
2636
2637
|
statuses.emplace_back();
|
|
2637
2638
|
results.emplace_back();
|
|
2638
|
-
if (v.handle.offset() ==
|
|
2639
|
-
//
|
|
2640
|
-
//
|
|
2639
|
+
if (v.handle.offset() == prev_offset) {
|
|
2640
|
+
// This key can reuse the previous block (later on).
|
|
2641
|
+
// Mark previous as "reused"
|
|
2642
|
+
reused_mask |= MultiGetContext::Mask{1} << (block_handles.size() - 1);
|
|
2643
|
+
// Use null handle to indicate this one reuses same block as
|
|
2644
|
+
// previous.
|
|
2641
2645
|
block_handles.emplace_back(BlockHandle::NullBlockHandle());
|
|
2642
2646
|
continue;
|
|
2643
2647
|
}
|
|
2644
2648
|
// Lookup the cache for the given data block referenced by an index
|
|
2645
2649
|
// iterator value (i.e BlockHandle). If it exists in the cache,
|
|
2646
2650
|
// initialize block to the contents of the data block.
|
|
2647
|
-
|
|
2651
|
+
prev_offset = v.handle.offset();
|
|
2648
2652
|
BlockHandle handle = v.handle;
|
|
2649
2653
|
BlockCacheLookupContext lookup_data_block_context(
|
|
2650
2654
|
TableReaderCaller::kUserMultiGet);
|
|
@@ -2748,6 +2752,7 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2748
2752
|
DataBlockIter first_biter;
|
|
2749
2753
|
DataBlockIter next_biter;
|
|
2750
2754
|
size_t idx_in_batch = 0;
|
|
2755
|
+
SharedCleanablePtr shared_cleanable;
|
|
2751
2756
|
for (auto miter = sst_file_range.begin(); miter != sst_file_range.end();
|
|
2752
2757
|
++miter) {
|
|
2753
2758
|
Status s;
|
|
@@ -2758,7 +2763,8 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2758
2763
|
bool first_block = true;
|
|
2759
2764
|
do {
|
|
2760
2765
|
DataBlockIter* biter = nullptr;
|
|
2761
|
-
bool
|
|
2766
|
+
bool reusing_prev_block;
|
|
2767
|
+
bool later_reused;
|
|
2762
2768
|
uint64_t referenced_data_size = 0;
|
|
2763
2769
|
bool does_referenced_key_exist = false;
|
|
2764
2770
|
BlockCacheLookupContext lookup_data_block_context(
|
|
@@ -2772,13 +2778,16 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2772
2778
|
NewDataBlockIterator<DataBlockIter>(
|
|
2773
2779
|
read_options, results[idx_in_batch], &first_biter,
|
|
2774
2780
|
statuses[idx_in_batch]);
|
|
2775
|
-
|
|
2781
|
+
reusing_prev_block = false;
|
|
2776
2782
|
} else {
|
|
2777
2783
|
// If handler is null and result is empty, then the status is never
|
|
2778
2784
|
// set, which should be the initial value: ok().
|
|
2779
2785
|
assert(statuses[idx_in_batch].ok());
|
|
2786
|
+
reusing_prev_block = true;
|
|
2780
2787
|
}
|
|
2781
2788
|
biter = &first_biter;
|
|
2789
|
+
later_reused =
|
|
2790
|
+
(reused_mask & (MultiGetContext::Mask{1} << idx_in_batch)) != 0;
|
|
2782
2791
|
idx_in_batch++;
|
|
2783
2792
|
} else {
|
|
2784
2793
|
IndexValue v = iiter->value();
|
|
@@ -2798,7 +2807,8 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2798
2807
|
BlockType::kData, get_context, &lookup_data_block_context,
|
|
2799
2808
|
Status(), nullptr);
|
|
2800
2809
|
biter = &next_biter;
|
|
2801
|
-
|
|
2810
|
+
reusing_prev_block = false;
|
|
2811
|
+
later_reused = false;
|
|
2802
2812
|
}
|
|
2803
2813
|
|
|
2804
2814
|
if (read_options.read_tier == kBlockCacheTier &&
|
|
@@ -2823,28 +2833,56 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2823
2833
|
break;
|
|
2824
2834
|
}
|
|
2825
2835
|
|
|
2836
|
+
// Reusing blocks complicates pinning/Cleanable, because the cache
|
|
2837
|
+
// entry referenced by biter can only be released once all returned
|
|
2838
|
+
// pinned values are released. This code previously did an extra
|
|
2839
|
+
// block_cache Ref for each reuse, but that unnecessarily increases
|
|
2840
|
+
// block cache contention. Instead we can use a variant of shared_ptr
|
|
2841
|
+
// to release in block cache only once.
|
|
2842
|
+
//
|
|
2843
|
+
// Although the biter loop below might SaveValue multiple times for
|
|
2844
|
+
// merges, just one value_pinner suffices, as MultiGet will merge
|
|
2845
|
+
// the operands before returning to the API user.
|
|
2846
|
+
Cleanable* value_pinner;
|
|
2847
|
+
if (biter->IsValuePinned()) {
|
|
2848
|
+
if (reusing_prev_block) {
|
|
2849
|
+
// Note that we don't yet know if the MultiGet results will need
|
|
2850
|
+
// to pin this block, so we might wrap a block for sharing and
|
|
2851
|
+
// still end up with 1 (or 0) pinning ref. Not ideal but OK.
|
|
2852
|
+
//
|
|
2853
|
+
// Here we avoid adding redundant cleanups if we didn't end up
|
|
2854
|
+
// delegating the cleanup from last time around.
|
|
2855
|
+
if (!biter->HasCleanups()) {
|
|
2856
|
+
assert(shared_cleanable.get());
|
|
2857
|
+
if (later_reused) {
|
|
2858
|
+
shared_cleanable.RegisterCopyWith(biter);
|
|
2859
|
+
} else {
|
|
2860
|
+
shared_cleanable.MoveAsCleanupTo(biter);
|
|
2861
|
+
}
|
|
2862
|
+
}
|
|
2863
|
+
} else if (later_reused) {
|
|
2864
|
+
assert(biter->HasCleanups());
|
|
2865
|
+
// Make the existing cleanups on `biter` sharable:
|
|
2866
|
+
shared_cleanable.Allocate();
|
|
2867
|
+
// Move existing `biter` cleanup(s) to `shared_cleanable`
|
|
2868
|
+
biter->DelegateCleanupsTo(&*shared_cleanable);
|
|
2869
|
+
// Reference `shared_cleanable` as new cleanup for `biter`
|
|
2870
|
+
shared_cleanable.RegisterCopyWith(biter);
|
|
2871
|
+
}
|
|
2872
|
+
assert(biter->HasCleanups());
|
|
2873
|
+
value_pinner = biter;
|
|
2874
|
+
} else {
|
|
2875
|
+
value_pinner = nullptr;
|
|
2876
|
+
}
|
|
2877
|
+
|
|
2826
2878
|
// Call the *saver function on each entry/block until it returns false
|
|
2827
2879
|
for (; biter->Valid(); biter->Next()) {
|
|
2828
2880
|
ParsedInternalKey parsed_key;
|
|
2829
|
-
Cleanable dummy;
|
|
2830
|
-
Cleanable* value_pinner = nullptr;
|
|
2831
2881
|
Status pik_status = ParseInternalKey(
|
|
2832
2882
|
biter->key(), &parsed_key, false /* log_err_key */); // TODO
|
|
2833
2883
|
if (!pik_status.ok()) {
|
|
2834
2884
|
s = pik_status;
|
|
2835
2885
|
}
|
|
2836
|
-
if (biter->IsValuePinned()) {
|
|
2837
|
-
if (reusing_block) {
|
|
2838
|
-
Cache* block_cache = rep_->table_options.block_cache.get();
|
|
2839
|
-
assert(biter->cache_handle() != nullptr);
|
|
2840
|
-
block_cache->Ref(biter->cache_handle());
|
|
2841
|
-
dummy.RegisterCleanup(&ReleaseCachedEntry, block_cache,
|
|
2842
|
-
biter->cache_handle());
|
|
2843
|
-
value_pinner = &dummy;
|
|
2844
|
-
} else {
|
|
2845
|
-
value_pinner = biter;
|
|
2846
|
-
}
|
|
2847
|
-
}
|
|
2848
2886
|
if (!get_context->SaveValue(parsed_key, biter->value(), &matched,
|
|
2849
2887
|
value_pinner)) {
|
|
2850
2888
|
if (get_context->State() == GetContext::GetState::kFound) {
|
|
@@ -2858,7 +2896,10 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2858
2896
|
s = biter->status();
|
|
2859
2897
|
}
|
|
2860
2898
|
// Write the block cache access.
|
|
2861
|
-
|
|
2899
|
+
// XXX: There appear to be 'break' statements above that bypass this
|
|
2900
|
+
// writing of the block cache trace record
|
|
2901
|
+
if (block_cache_tracer_ && block_cache_tracer_->is_tracing_enabled() &&
|
|
2902
|
+
!reusing_prev_block) {
|
|
2862
2903
|
// Avoid making copy of block_key, cf_name, and referenced_key when
|
|
2863
2904
|
// constructing the access record.
|
|
2864
2905
|
Slice referenced_key;
|
|
@@ -2894,6 +2935,9 @@ void BlockBasedTable::MultiGet(const ReadOptions& read_options,
|
|
|
2894
2935
|
}
|
|
2895
2936
|
if (first_block) {
|
|
2896
2937
|
iiter->Seek(key);
|
|
2938
|
+
if (!iiter->Valid()) {
|
|
2939
|
+
break;
|
|
2940
|
+
}
|
|
2897
2941
|
}
|
|
2898
2942
|
first_block = false;
|
|
2899
2943
|
iiter->Next();
|
|
@@ -3203,7 +3247,7 @@ Status BlockBasedTable::CreateIndexReader(
|
|
|
3203
3247
|
}
|
|
3204
3248
|
default: {
|
|
3205
3249
|
std::string error_message =
|
|
3206
|
-
"Unrecognized index type: " +
|
|
3250
|
+
"Unrecognized index type: " + std::to_string(rep_->index_type);
|
|
3207
3251
|
return Status::InvalidArgument(error_message.c_str());
|
|
3208
3252
|
}
|
|
3209
3253
|
}
|
|
@@ -3626,8 +3670,8 @@ Status BlockBasedTable::DumpDataBlocks(std::ostream& out_stream) {
|
|
|
3626
3670
|
out_stream << " # data blocks: " << num_datablocks << "\n";
|
|
3627
3671
|
out_stream << " min data block size: " << datablock_size_min << "\n";
|
|
3628
3672
|
out_stream << " max data block size: " << datablock_size_max << "\n";
|
|
3629
|
-
out_stream << " avg data block size: "
|
|
3630
|
-
<< "\n";
|
|
3673
|
+
out_stream << " avg data block size: "
|
|
3674
|
+
<< std::to_string(datablock_size_avg) << "\n";
|
|
3631
3675
|
}
|
|
3632
3676
|
|
|
3633
3677
|
return Status::OK();
|
|
@@ -283,46 +283,10 @@ TEST_P(BlockBasedTableReaderTest, MultiGet) {
|
|
|
283
283
|
}
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
-
class
|
|
287
|
-
public:
|
|
288
|
-
explicit BlockBasedTableReaderResOnlyCache(std::shared_ptr<Cache> target)
|
|
289
|
-
: CacheWrapper(std::move(target)) {}
|
|
290
|
-
|
|
291
|
-
using Cache::Insert;
|
|
292
|
-
Status Insert(const Slice& key, void* value, size_t charge,
|
|
293
|
-
void (*deleter)(const Slice& key, void* value),
|
|
294
|
-
Handle** handle = nullptr,
|
|
295
|
-
Priority priority = Priority::LOW) override {
|
|
296
|
-
if (deleter == kNoopDeleterForBlockBasedTableReader) {
|
|
297
|
-
return target_->Insert(key, value, charge, deleter, handle, priority);
|
|
298
|
-
} else {
|
|
299
|
-
return Status::OK();
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
using Cache::Release;
|
|
304
|
-
bool Release(Handle* handle, bool force_erase = false) override {
|
|
305
|
-
auto deleter = GetDeleter(handle);
|
|
306
|
-
if (deleter == kNoopDeleterForBlockBasedTableReader) {
|
|
307
|
-
return target_->Release(handle, force_erase);
|
|
308
|
-
} else {
|
|
309
|
-
return true;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
private:
|
|
314
|
-
static const Cache::DeleterFn kNoopDeleterForBlockBasedTableReader;
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
const Cache::DeleterFn
|
|
318
|
-
BlockBasedTableReaderResOnlyCache::kNoopDeleterForBlockBasedTableReader =
|
|
319
|
-
CacheReservationManagerImpl<CacheEntryRole::kBlockBasedTableReader>::
|
|
320
|
-
TEST_GetNoopDeleterForRole();
|
|
321
|
-
|
|
322
|
-
class BlockBasedTableReaderCapMemoryTest
|
|
286
|
+
class ChargeTableReaderTest
|
|
323
287
|
: public BlockBasedTableReaderBaseTest,
|
|
324
288
|
public testing::WithParamInterface<
|
|
325
|
-
|
|
289
|
+
CacheEntryRoleOptions::Decision /* charge_table_reader_mem */> {
|
|
326
290
|
protected:
|
|
327
291
|
static std::size_t CalculateMaxTableReaderNumBeforeCacheFull(
|
|
328
292
|
std::size_t cache_capacity, std::size_t approx_table_reader_mem) {
|
|
@@ -361,28 +325,30 @@ class BlockBasedTableReaderCapMemoryTest
|
|
|
361
325
|
kv_ = BlockBasedTableReaderBaseTest::GenerateKVMap();
|
|
362
326
|
compression_type_ = CompressionType::kNoCompression;
|
|
363
327
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
328
|
+
table_reader_charge_tracking_cache_ = std::make_shared<
|
|
329
|
+
TargetCacheChargeTrackingCache<
|
|
330
|
+
CacheEntryRole::kBlockBasedTableReader>>((NewLRUCache(
|
|
331
|
+
4 * CacheReservationManagerImpl<
|
|
332
|
+
CacheEntryRole::kBlockBasedTableReader>::GetDummyEntrySize(),
|
|
333
|
+
0 /* num_shard_bits */, true /* strict_capacity_limit */)));
|
|
369
334
|
|
|
370
|
-
// To ApproximateTableReaderMem() without
|
|
371
|
-
//
|
|
372
|
-
|
|
373
|
-
reserve_table_reader_memory_ = false;
|
|
335
|
+
// To ApproximateTableReaderMem() without being affected by
|
|
336
|
+
// the feature of charging its memory, we turn off the feature
|
|
337
|
+
charge_table_reader_ = CacheEntryRoleOptions::Decision::kDisabled;
|
|
374
338
|
BlockBasedTableReaderBaseTest::SetUp();
|
|
375
339
|
approx_table_reader_mem_ = ApproximateTableReaderMem();
|
|
376
340
|
|
|
377
341
|
// Now we condtionally turn on the feature to test
|
|
378
|
-
|
|
342
|
+
charge_table_reader_ = GetParam();
|
|
379
343
|
ConfigureTableFactory();
|
|
380
344
|
}
|
|
381
345
|
|
|
382
346
|
void ConfigureTableFactory() override {
|
|
383
347
|
BlockBasedTableOptions table_options;
|
|
384
|
-
table_options.
|
|
385
|
-
|
|
348
|
+
table_options.cache_usage_options.options_overrides.insert(
|
|
349
|
+
{CacheEntryRole::kBlockBasedTableReader,
|
|
350
|
+
{/*.charged = */ charge_table_reader_}});
|
|
351
|
+
table_options.block_cache = table_reader_charge_tracking_cache_;
|
|
386
352
|
|
|
387
353
|
table_options.cache_index_and_filter_blocks = false;
|
|
388
354
|
table_options.filter_policy.reset(NewBloomFilterPolicy(10, false));
|
|
@@ -392,9 +358,10 @@ class BlockBasedTableReaderCapMemoryTest
|
|
|
392
358
|
options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
393
359
|
}
|
|
394
360
|
|
|
395
|
-
|
|
396
|
-
std::shared_ptr<
|
|
397
|
-
|
|
361
|
+
CacheEntryRoleOptions::Decision charge_table_reader_;
|
|
362
|
+
std::shared_ptr<
|
|
363
|
+
TargetCacheChargeTrackingCache<CacheEntryRole::kBlockBasedTableReader>>
|
|
364
|
+
table_reader_charge_tracking_cache_;
|
|
398
365
|
std::size_t approx_table_reader_mem_;
|
|
399
366
|
std::map<std::string, std::string> kv_;
|
|
400
367
|
CompressionType compression_type_;
|
|
@@ -420,16 +387,16 @@ class BlockBasedTableReaderCapMemoryTest
|
|
|
420
387
|
}
|
|
421
388
|
};
|
|
422
389
|
|
|
423
|
-
INSTANTIATE_TEST_CASE_P(
|
|
424
|
-
|
|
425
|
-
|
|
390
|
+
INSTANTIATE_TEST_CASE_P(
|
|
391
|
+
ChargeTableReaderTest, ChargeTableReaderTest,
|
|
392
|
+
::testing::Values(CacheEntryRoleOptions::Decision::kEnabled,
|
|
393
|
+
CacheEntryRoleOptions::Decision::kDisabled));
|
|
426
394
|
|
|
427
|
-
TEST_P(
|
|
395
|
+
TEST_P(ChargeTableReaderTest, Basic) {
|
|
428
396
|
const std::size_t max_table_reader_num_capped =
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
approx_table_reader_mem_);
|
|
397
|
+
ChargeTableReaderTest::CalculateMaxTableReaderNumBeforeCacheFull(
|
|
398
|
+
table_reader_charge_tracking_cache_->GetCapacity(),
|
|
399
|
+
approx_table_reader_mem_);
|
|
433
400
|
|
|
434
401
|
// Acceptable estimtation errors coming from
|
|
435
402
|
// 1. overstimate max_table_reader_num_capped due to # dummy entries is high
|
|
@@ -448,16 +415,16 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
|
|
|
448
415
|
<< "We need `max_table_reader_num_uncapped` > "
|
|
449
416
|
"`max_table_reader_num_capped_upper_bound` to differentiate cases "
|
|
450
417
|
"between "
|
|
451
|
-
"
|
|
418
|
+
"charge_table_reader_ == kDisabled and == kEnabled)";
|
|
452
419
|
|
|
453
420
|
Status s = Status::OK();
|
|
454
421
|
std::size_t opened_table_reader_num = 0;
|
|
455
422
|
std::string table_name;
|
|
456
423
|
std::vector<std::unique_ptr<BlockBasedTable>> tables;
|
|
457
424
|
// Keep creating BlockBasedTableReader till hiting the memory limit based on
|
|
458
|
-
// cache capacity and creation fails (when
|
|
459
|
-
//
|
|
460
|
-
//
|
|
425
|
+
// cache capacity and creation fails (when charge_table_reader_ ==
|
|
426
|
+
// kEnabled) or reaching a specfied big number of table readers (when
|
|
427
|
+
// charge_table_reader_ == kDisabled)
|
|
461
428
|
while (s.ok() && opened_table_reader_num < max_table_reader_num_uncapped) {
|
|
462
429
|
table_name = "table_" + std::to_string(opened_table_reader_num);
|
|
463
430
|
CreateTable(table_name, compression_type_, kv_);
|
|
@@ -471,8 +438,12 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
|
|
|
471
438
|
}
|
|
472
439
|
}
|
|
473
440
|
|
|
474
|
-
if (
|
|
441
|
+
if (charge_table_reader_ == CacheEntryRoleOptions::Decision::kEnabled) {
|
|
475
442
|
EXPECT_TRUE(s.IsMemoryLimit()) << "s: " << s.ToString();
|
|
443
|
+
EXPECT_TRUE(s.ToString().find(
|
|
444
|
+
kCacheEntryRoleToCamelString[static_cast<std::uint32_t>(
|
|
445
|
+
CacheEntryRole::kBlockBasedTableReader)]) !=
|
|
446
|
+
std::string::npos);
|
|
476
447
|
EXPECT_TRUE(s.ToString().find("memory limit based on cache capacity") !=
|
|
477
448
|
std::string::npos);
|
|
478
449
|
|
|
@@ -480,10 +451,9 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
|
|
|
480
451
|
EXPECT_LE(opened_table_reader_num, max_table_reader_num_capped_upper_bound);
|
|
481
452
|
|
|
482
453
|
std::size_t updated_max_table_reader_num_capped =
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
approx_table_reader_mem_);
|
|
454
|
+
ChargeTableReaderTest::CalculateMaxTableReaderNumBeforeCacheFull(
|
|
455
|
+
table_reader_charge_tracking_cache_->GetCapacity() / 2,
|
|
456
|
+
approx_table_reader_mem_);
|
|
487
457
|
|
|
488
458
|
// Keep deleting BlockBasedTableReader to lower down memory usage from the
|
|
489
459
|
// memory limit to make the next creation succeeds
|
|
@@ -501,13 +471,13 @@ TEST_P(BlockBasedTableReaderCapMemoryTest, CapMemoryUsageUnderCacheCapacity) {
|
|
|
501
471
|
EXPECT_TRUE(s.ok()) << s.ToString();
|
|
502
472
|
|
|
503
473
|
tables.clear();
|
|
504
|
-
EXPECT_EQ(
|
|
474
|
+
EXPECT_EQ(table_reader_charge_tracking_cache_->GetCacheCharge(), 0);
|
|
505
475
|
} else {
|
|
506
476
|
EXPECT_TRUE(s.ok() &&
|
|
507
477
|
opened_table_reader_num == max_table_reader_num_uncapped)
|
|
508
478
|
<< "s: " << s.ToString() << " opened_table_reader_num: "
|
|
509
479
|
<< std::to_string(opened_table_reader_num);
|
|
510
|
-
EXPECT_EQ(
|
|
480
|
+
EXPECT_EQ(table_reader_charge_tracking_cache_->GetCacheCharge(), 0);
|
|
511
481
|
}
|
|
512
482
|
}
|
|
513
483
|
|
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
#include "table/block_based/block_prefetcher.h"
|
|
10
10
|
|
|
11
|
+
#include "rocksdb/file_system.h"
|
|
11
12
|
#include "table/block_based/block_based_table_reader.h"
|
|
12
13
|
|
|
13
14
|
namespace ROCKSDB_NAMESPACE {
|
|
14
|
-
void BlockPrefetcher::PrefetchIfNeeded(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
void BlockPrefetcher::PrefetchIfNeeded(
|
|
16
|
+
const BlockBasedTable::Rep* rep, const BlockHandle& handle,
|
|
17
|
+
const size_t readahead_size, bool is_for_compaction, const bool async_io,
|
|
18
|
+
const Env::IOPriority rate_limiter_priority) {
|
|
18
19
|
if (is_for_compaction) {
|
|
19
20
|
rep->CreateFilePrefetchBufferIfNotExists(
|
|
20
21
|
compaction_readahead_size_, compaction_readahead_size_,
|
|
@@ -84,7 +85,8 @@ void BlockPrefetcher::PrefetchIfNeeded(const BlockBasedTable::Rep* rep,
|
|
|
84
85
|
// we can fallback to reading from disk if Prefetch fails.
|
|
85
86
|
Status s = rep->file->Prefetch(
|
|
86
87
|
handle.offset(),
|
|
87
|
-
BlockBasedTable::BlockSizeWithTrailer(handle) + readahead_size_
|
|
88
|
+
BlockBasedTable::BlockSizeWithTrailer(handle) + readahead_size_,
|
|
89
|
+
rate_limiter_priority);
|
|
88
90
|
if (s.IsNotSupported()) {
|
|
89
91
|
rep->CreateFilePrefetchBufferIfNotExists(initial_auto_readahead_size_,
|
|
90
92
|
max_auto_readahead_size,
|
|
@@ -20,7 +20,8 @@ class BlockPrefetcher {
|
|
|
20
20
|
|
|
21
21
|
void PrefetchIfNeeded(const BlockBasedTable::Rep* rep,
|
|
22
22
|
const BlockHandle& handle, size_t readahead_size,
|
|
23
|
-
bool is_for_compaction, bool async_io
|
|
23
|
+
bool is_for_compaction, bool async_io,
|
|
24
|
+
Env::IOPriority rate_limiter_priority);
|
|
24
25
|
FilePrefetchBuffer* prefetch_buffer() { return prefetch_buffer_.get(); }
|
|
25
26
|
|
|
26
27
|
void UpdateReadPattern(const uint64_t& offset, const size_t& len) {
|
|
@@ -84,7 +84,7 @@ class FilterBlockBuilder {
|
|
|
84
84
|
Status* status, std::unique_ptr<const char[]>* filter_data = nullptr) = 0;
|
|
85
85
|
|
|
86
86
|
// This is called when finishes using the FilterBitsBuilder
|
|
87
|
-
// in order to release memory usage and cache
|
|
87
|
+
// in order to release memory usage and cache charge
|
|
88
88
|
// associated with it timely
|
|
89
89
|
virtual void ResetFilterBitsBuilder() {}
|
|
90
90
|
|
|
@@ -109,7 +109,7 @@ class XXPH3FilterBitsBuilder : public BuiltinFilterBitsBuilder {
|
|
|
109
109
|
static constexpr uint32_t kMetadataLen = 5;
|
|
110
110
|
|
|
111
111
|
// Number of hash entries to accumulate before charging their memory usage to
|
|
112
|
-
// the cache when cache
|
|
112
|
+
// the cache when cache charging is available
|
|
113
113
|
static const std::size_t kUint64tHashEntryCacheResBucketSize =
|
|
114
114
|
CacheReservationManagerImpl<
|
|
115
115
|
CacheEntryRole::kFilterConstruction>::GetDummyEntrySize() /
|
|
@@ -257,7 +257,7 @@ class XXPH3FilterBitsBuilder : public BuiltinFilterBitsBuilder {
|
|
|
257
257
|
// For reserving memory used in (new) Bloom and Ribbon Filter construction
|
|
258
258
|
std::shared_ptr<CacheReservationManager> cache_res_mgr_;
|
|
259
259
|
|
|
260
|
-
// For managing cache
|
|
260
|
+
// For managing cache charge for final filter in (new) Bloom and Ribbon
|
|
261
261
|
// Filter construction
|
|
262
262
|
std::deque<std::unique_ptr<CacheReservationManager::CacheReservationHandle>>
|
|
263
263
|
final_filter_cache_res_handles_;
|
|
@@ -270,7 +270,7 @@ class XXPH3FilterBitsBuilder : public BuiltinFilterBitsBuilder {
|
|
|
270
270
|
std::deque<uint64_t> entries;
|
|
271
271
|
|
|
272
272
|
// If cache_res_mgr_ != nullptr,
|
|
273
|
-
// it manages cache
|
|
273
|
+
// it manages cache charge for buckets of hash entries in (new) Bloom
|
|
274
274
|
// or Ribbon Filter construction.
|
|
275
275
|
// Otherwise, it is empty.
|
|
276
276
|
std::deque<std::unique_ptr<CacheReservationManager::CacheReservationHandle>>
|
|
@@ -338,7 +338,7 @@ class FastLocalBloomBitsBuilder : public XXPH3FilterBitsBuilder {
|
|
|
338
338
|
final_filter_cache_res_handle;
|
|
339
339
|
len_with_metadata =
|
|
340
340
|
AllocateMaybeRounding(len_with_metadata, num_entries, &mutable_buf);
|
|
341
|
-
// Cache
|
|
341
|
+
// Cache charging for mutable_buf
|
|
342
342
|
if (cache_res_mgr_) {
|
|
343
343
|
Status s = cache_res_mgr_->MakeCacheReservation(
|
|
344
344
|
len_with_metadata * sizeof(char), &final_filter_cache_res_handle);
|
|
@@ -655,7 +655,7 @@ class Standard128RibbonBitsBuilder : public XXPH3FilterBitsBuilder {
|
|
|
655
655
|
Standard128RibbonTypesAndSettings>::EstimateMemoryUsage(num_slots);
|
|
656
656
|
Status status_banding_cache_res = Status::OK();
|
|
657
657
|
|
|
658
|
-
// Cache
|
|
658
|
+
// Cache charging for banding
|
|
659
659
|
std::unique_ptr<CacheReservationManager::CacheReservationHandle>
|
|
660
660
|
banding_res_handle;
|
|
661
661
|
if (cache_res_mgr_) {
|
|
@@ -665,7 +665,7 @@ class Standard128RibbonBitsBuilder : public XXPH3FilterBitsBuilder {
|
|
|
665
665
|
|
|
666
666
|
if (status_banding_cache_res.IsIncomplete()) {
|
|
667
667
|
ROCKS_LOG_WARN(info_log_,
|
|
668
|
-
"Cache
|
|
668
|
+
"Cache charging for Ribbon filter banding failed due "
|
|
669
669
|
"to cache full");
|
|
670
670
|
SwapEntriesWith(&bloom_fallback_);
|
|
671
671
|
assert(hash_entries_info_.entries.empty());
|
|
@@ -717,7 +717,7 @@ class Standard128RibbonBitsBuilder : public XXPH3FilterBitsBuilder {
|
|
|
717
717
|
final_filter_cache_res_handle;
|
|
718
718
|
len_with_metadata =
|
|
719
719
|
AllocateMaybeRounding(len_with_metadata, num_entries, &mutable_buf);
|
|
720
|
-
// Cache
|
|
720
|
+
// Cache charging for mutable_buf
|
|
721
721
|
if (cache_res_mgr_) {
|
|
722
722
|
Status s = cache_res_mgr_->MakeCacheReservation(
|
|
723
723
|
len_with_metadata * sizeof(char), &final_filter_cache_res_handle);
|
|
@@ -1483,11 +1483,19 @@ std::string BloomFilterPolicy::GetId() const {
|
|
|
1483
1483
|
FilterBitsBuilder* BloomLikeFilterPolicy::GetFastLocalBloomBuilderWithContext(
|
|
1484
1484
|
const FilterBuildingContext& context) const {
|
|
1485
1485
|
bool offm = context.table_options.optimize_filters_for_memory;
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1486
|
+
const auto options_overrides_iter =
|
|
1487
|
+
context.table_options.cache_usage_options.options_overrides.find(
|
|
1488
|
+
CacheEntryRole::kFilterConstruction);
|
|
1489
|
+
const auto filter_construction_charged =
|
|
1490
|
+
options_overrides_iter !=
|
|
1491
|
+
context.table_options.cache_usage_options.options_overrides.end()
|
|
1492
|
+
? options_overrides_iter->second.charged
|
|
1493
|
+
: context.table_options.cache_usage_options.options.charged;
|
|
1494
|
+
|
|
1489
1495
|
std::shared_ptr<CacheReservationManager> cache_res_mgr;
|
|
1490
|
-
if (
|
|
1496
|
+
if (context.table_options.block_cache &&
|
|
1497
|
+
filter_construction_charged ==
|
|
1498
|
+
CacheEntryRoleOptions::Decision::kEnabled) {
|
|
1491
1499
|
cache_res_mgr = std::make_shared<
|
|
1492
1500
|
CacheReservationManagerImpl<CacheEntryRole::kFilterConstruction>>(
|
|
1493
1501
|
context.table_options.block_cache);
|
|
@@ -1525,11 +1533,19 @@ BloomLikeFilterPolicy::GetStandard128RibbonBuilderWithContext(
|
|
|
1525
1533
|
const FilterBuildingContext& context) const {
|
|
1526
1534
|
// FIXME: code duplication with GetFastLocalBloomBuilderWithContext
|
|
1527
1535
|
bool offm = context.table_options.optimize_filters_for_memory;
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1536
|
+
const auto options_overrides_iter =
|
|
1537
|
+
context.table_options.cache_usage_options.options_overrides.find(
|
|
1538
|
+
CacheEntryRole::kFilterConstruction);
|
|
1539
|
+
const auto filter_construction_charged =
|
|
1540
|
+
options_overrides_iter !=
|
|
1541
|
+
context.table_options.cache_usage_options.options_overrides.end()
|
|
1542
|
+
? options_overrides_iter->second.charged
|
|
1543
|
+
: context.table_options.cache_usage_options.options.charged;
|
|
1544
|
+
|
|
1531
1545
|
std::shared_ptr<CacheReservationManager> cache_res_mgr;
|
|
1532
|
-
if (
|
|
1546
|
+
if (context.table_options.block_cache &&
|
|
1547
|
+
filter_construction_charged ==
|
|
1548
|
+
CacheEntryRoleOptions::Decision::kEnabled) {
|
|
1533
1549
|
cache_res_mgr = std::make_shared<
|
|
1534
1550
|
CacheReservationManagerImpl<CacheEntryRole::kFilterConstruction>>(
|
|
1535
1551
|
context.table_options.block_cache);
|
|
@@ -1542,7 +1558,7 @@ BloomLikeFilterPolicy::GetStandard128RibbonBuilderWithContext(
|
|
|
1542
1558
|
}
|
|
1543
1559
|
|
|
1544
1560
|
std::string BloomLikeFilterPolicy::GetBitsPerKeySuffix() const {
|
|
1545
|
-
std::string rv = ":" +
|
|
1561
|
+
std::string rv = ":" + std::to_string(millibits_per_key_ / 1000);
|
|
1546
1562
|
int frac = millibits_per_key_ % 1000;
|
|
1547
1563
|
if (frac > 0) {
|
|
1548
1564
|
rv.push_back('.');
|
|
@@ -1837,7 +1853,7 @@ const char* RibbonFilterPolicy::kNickName() { return "rocksdb.RibbonFilter"; }
|
|
|
1837
1853
|
|
|
1838
1854
|
std::string RibbonFilterPolicy::GetId() const {
|
|
1839
1855
|
return BloomLikeFilterPolicy::GetId() + ":" +
|
|
1840
|
-
|
|
1856
|
+
std::to_string(bloom_before_level_);
|
|
1841
1857
|
}
|
|
1842
1858
|
|
|
1843
1859
|
const FilterPolicy* NewRibbonFilterPolicy(double bloom_equivalent_bits_per_key,
|
|
@@ -117,7 +117,8 @@ InternalIteratorBase<IndexValue>* HashIndexReader::NewIterator(
|
|
|
117
117
|
const bool no_io = (read_options.read_tier == kBlockCacheTier);
|
|
118
118
|
CachableEntry<Block> index_block;
|
|
119
119
|
const Status s =
|
|
120
|
-
GetOrReadIndexBlock(no_io,
|
|
120
|
+
GetOrReadIndexBlock(no_io, read_options.rate_limiter_priority,
|
|
121
|
+
get_context, lookup_context, &index_block);
|
|
121
122
|
if (!s.ok()) {
|
|
122
123
|
if (iter != nullptr) {
|
|
123
124
|
iter->Invalidate(s);
|