@nxtedition/rocksdb 9.0.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +244 -177
- package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -9
- package/deps/rocksdb/rocksdb/Makefile +15 -6
- package/deps/rocksdb/rocksdb/README.md +29 -0
- package/deps/rocksdb/rocksdb/TARGETS +17 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +74 -15
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +16 -4
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2024 -14
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +349 -23
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +126 -51
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +202 -7
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +31 -14
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -33
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +314 -25
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +29 -4
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +10 -0
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -3
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +25 -11
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
- package/deps/rocksdb/rocksdb/db/builder.cc +3 -3
- package/deps/rocksdb/rocksdb/db/c.cc +64 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +36 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +23 -15
- package/deps/rocksdb/rocksdb/db/column_family.h +9 -0
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +101 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +36 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +3 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +7 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +146 -64
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -39
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -7
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +8 -3
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +59 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +186 -2
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +17 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +519 -240
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +104 -43
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +169 -66
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +12 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +85 -53
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +99 -82
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +4 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +24 -21
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +83 -55
- package/deps/rocksdb/rocksdb/db/db_iter.h +10 -2
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +187 -1
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +134 -30
- package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +5 -2
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +337 -1
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/error_handler.cc +51 -34
- package/deps/rocksdb/rocksdb/db/error_handler.h +7 -6
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +58 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -19
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +18 -70
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +1 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.h +11 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
- package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
- package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
- package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +454 -70
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
- package/deps/rocksdb/rocksdb/db/table_cache.cc +32 -19
- package/deps/rocksdb/rocksdb/db/table_cache.h +12 -6
- package/deps/rocksdb/rocksdb/db/version_edit.h +10 -4
- package/deps/rocksdb/rocksdb/db/version_set.cc +75 -73
- package/deps/rocksdb/rocksdb/db/version_set.h +8 -8
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +22 -11
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +44 -20
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +15 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +108 -58
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +36 -14
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +195 -130
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +12 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +14 -11
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +44 -38
- package/deps/rocksdb/rocksdb/env/env.cc +5 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +1 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +50 -29
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +32 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +513 -30
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +38 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +42 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +65 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +26 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +37 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +79 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +16 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +14 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -2
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -2
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +4 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -0
- package/deps/rocksdb/rocksdb/options/db_options.cc +47 -2
- package/deps/rocksdb/rocksdb/options/db_options.h +3 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +12 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_test.cc +6 -1
- package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
- package/deps/rocksdb/rocksdb/port/README +10 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -0
- package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
- package/deps/rocksdb/rocksdb/src.mk +7 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +275 -61
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +96 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +179 -62
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +35 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +14 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +10 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +39 -18
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +10 -8
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +6 -2
- package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
- package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +12 -0
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +33 -6
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +2 -4
- package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -43
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +213 -28
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -10
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
- package/deps/rocksdb/rocksdb/util/cast_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +26 -1
- package/deps/rocksdb/rocksdb/util/compression.h +9 -3
- package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
- package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/util/overload.h +23 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
- package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
- package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
- package/deps/rocksdb/rocksdb/util/status.cc +1 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
- package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -0
- package/deps/rocksdb/rocksdb/util/udt_util.cc +42 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +19 -0
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +14 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
- package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +19 -15
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +9 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +41 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +155 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +81 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +7 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -27
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +105 -8
- package/deps/rocksdb/rocksdb.gyp +4 -2
- package/index.js +38 -55
- package/package.json +4 -4
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/util.h +7 -1
- package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -534,7 +534,7 @@ TYPED_TEST(ClockCacheTest, Limits) {
|
|
|
534
534
|
// (Cleverly using mostly zero-charge entries, but some non-zero to
|
|
535
535
|
// verify usage tracking on detached entries.)
|
|
536
536
|
{
|
|
537
|
-
size_t n =
|
|
537
|
+
size_t n = kCapacity * 5 + 1;
|
|
538
538
|
std::unique_ptr<HandleImpl* []> ha { new HandleImpl* [n] {} };
|
|
539
539
|
Status s;
|
|
540
540
|
for (size_t i = 0; i < n && s.ok(); ++i) {
|
|
@@ -560,6 +560,8 @@ TYPED_TEST(ClockCacheTest, Limits) {
|
|
|
560
560
|
EXPECT_OK(s);
|
|
561
561
|
}
|
|
562
562
|
|
|
563
|
+
EXPECT_EQ(shard.GetOccupancyCount(), shard.GetOccupancyLimit());
|
|
564
|
+
|
|
563
565
|
// Regardless, we didn't allow table to actually get full
|
|
564
566
|
EXPECT_LT(shard.GetOccupancyCount(), shard.GetTableAddressCount());
|
|
565
567
|
|
|
@@ -981,13 +983,14 @@ class TestSecondaryCache : public SecondaryCache {
|
|
|
981
983
|
|
|
982
984
|
using ResultMap = std::unordered_map<std::string, ResultType>;
|
|
983
985
|
|
|
984
|
-
explicit TestSecondaryCache(size_t capacity)
|
|
986
|
+
explicit TestSecondaryCache(size_t capacity, bool insert_saved = false)
|
|
985
987
|
: cache_(NewLRUCache(capacity, 0, false, 0.5 /* high_pri_pool_ratio */,
|
|
986
988
|
nullptr, kDefaultToAdaptiveMutex,
|
|
987
989
|
kDontChargeCacheMetadata)),
|
|
988
990
|
num_inserts_(0),
|
|
989
991
|
num_lookups_(0),
|
|
990
|
-
inject_failure_(false)
|
|
992
|
+
inject_failure_(false),
|
|
993
|
+
insert_saved_(insert_saved) {}
|
|
991
994
|
|
|
992
995
|
const char* Name() const override { return "TestSecondaryCache"; }
|
|
993
996
|
|
|
@@ -1018,6 +1021,17 @@ class TestSecondaryCache : public SecondaryCache {
|
|
|
1018
1021
|
return cache_.Insert(key, buf, size);
|
|
1019
1022
|
}
|
|
1020
1023
|
|
|
1024
|
+
Status InsertSaved(const Slice& key, const Slice& saved,
|
|
1025
|
+
CompressionType /*type*/ = kNoCompression,
|
|
1026
|
+
CacheTier /*source*/ = CacheTier::kVolatileTier) override {
|
|
1027
|
+
if (insert_saved_) {
|
|
1028
|
+
return Insert(key, const_cast<Slice*>(&saved), &kSliceCacheItemHelper,
|
|
1029
|
+
/*force_insert=*/true);
|
|
1030
|
+
} else {
|
|
1031
|
+
return Status::OK();
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1021
1035
|
std::unique_ptr<SecondaryCacheResultHandle> Lookup(
|
|
1022
1036
|
const Slice& key, const Cache::CacheItemHelper* helper,
|
|
1023
1037
|
Cache::CreateContext* create_context, bool /*wait*/,
|
|
@@ -1046,7 +1060,8 @@ class TestSecondaryCache : public SecondaryCache {
|
|
|
1046
1060
|
char* ptr = cache_.Value(handle);
|
|
1047
1061
|
size_t size = DecodeFixed64(ptr);
|
|
1048
1062
|
ptr += sizeof(uint64_t);
|
|
1049
|
-
s = helper->create_cb(Slice(ptr, size),
|
|
1063
|
+
s = helper->create_cb(Slice(ptr, size), kNoCompression,
|
|
1064
|
+
CacheTier::kVolatileTier, create_context,
|
|
1050
1065
|
/*alloc*/ nullptr, &value, &charge);
|
|
1051
1066
|
}
|
|
1052
1067
|
if (s.ok()) {
|
|
@@ -1135,6 +1150,7 @@ class TestSecondaryCache : public SecondaryCache {
|
|
|
1135
1150
|
uint32_t num_inserts_;
|
|
1136
1151
|
uint32_t num_lookups_;
|
|
1137
1152
|
bool inject_failure_;
|
|
1153
|
+
bool insert_saved_;
|
|
1138
1154
|
std::string ckey_prefix_;
|
|
1139
1155
|
ResultMap result_map_;
|
|
1140
1156
|
};
|
|
@@ -1165,7 +1181,7 @@ INSTANTIATE_TEST_CASE_P(DBSecondaryCacheTest, DBSecondaryCacheTest,
|
|
|
1165
1181
|
|
|
1166
1182
|
TEST_P(BasicSecondaryCacheTest, BasicTest) {
|
|
1167
1183
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
1168
|
-
std::make_shared<TestSecondaryCache>(4096);
|
|
1184
|
+
std::make_shared<TestSecondaryCache>(4096, true);
|
|
1169
1185
|
std::shared_ptr<Cache> cache =
|
|
1170
1186
|
NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
|
|
1171
1187
|
false /* strict_capacity_limit */, secondary_cache);
|
|
@@ -1222,7 +1238,7 @@ TEST_P(BasicSecondaryCacheTest, BasicTest) {
|
|
|
1222
1238
|
|
|
1223
1239
|
TEST_P(BasicSecondaryCacheTest, StatsTest) {
|
|
1224
1240
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
1225
|
-
std::make_shared<TestSecondaryCache>(4096);
|
|
1241
|
+
std::make_shared<TestSecondaryCache>(4096, true);
|
|
1226
1242
|
std::shared_ptr<Cache> cache =
|
|
1227
1243
|
NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
|
|
1228
1244
|
false /* strict_capacity_limit */, secondary_cache);
|
|
@@ -1276,7 +1292,7 @@ TEST_P(BasicSecondaryCacheTest, StatsTest) {
|
|
|
1276
1292
|
|
|
1277
1293
|
TEST_P(BasicSecondaryCacheTest, BasicFailTest) {
|
|
1278
1294
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
1279
|
-
std::make_shared<TestSecondaryCache>(2048);
|
|
1295
|
+
std::make_shared<TestSecondaryCache>(2048, true);
|
|
1280
1296
|
std::shared_ptr<Cache> cache =
|
|
1281
1297
|
NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
|
|
1282
1298
|
false /* strict_capacity_limit */, secondary_cache);
|
|
@@ -1318,7 +1334,7 @@ TEST_P(BasicSecondaryCacheTest, BasicFailTest) {
|
|
|
1318
1334
|
|
|
1319
1335
|
TEST_P(BasicSecondaryCacheTest, SaveFailTest) {
|
|
1320
1336
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
1321
|
-
std::make_shared<TestSecondaryCache>(2048);
|
|
1337
|
+
std::make_shared<TestSecondaryCache>(2048, true);
|
|
1322
1338
|
std::shared_ptr<Cache> cache =
|
|
1323
1339
|
NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
|
|
1324
1340
|
false /* strict_capacity_limit */, secondary_cache);
|
|
@@ -1359,7 +1375,7 @@ TEST_P(BasicSecondaryCacheTest, SaveFailTest) {
|
|
|
1359
1375
|
|
|
1360
1376
|
TEST_P(BasicSecondaryCacheTest, CreateFailTest) {
|
|
1361
1377
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
1362
|
-
std::make_shared<TestSecondaryCache>(2048);
|
|
1378
|
+
std::make_shared<TestSecondaryCache>(2048, true);
|
|
1363
1379
|
std::shared_ptr<Cache> cache =
|
|
1364
1380
|
NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
|
|
1365
1381
|
false /* strict_capacity_limit */, secondary_cache);
|
|
@@ -1400,7 +1416,7 @@ TEST_P(BasicSecondaryCacheTest, CreateFailTest) {
|
|
|
1400
1416
|
TEST_P(BasicSecondaryCacheTest, FullCapacityTest) {
|
|
1401
1417
|
for (bool strict_capacity_limit : {false, true}) {
|
|
1402
1418
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
1403
|
-
std::make_shared<TestSecondaryCache>(2048);
|
|
1419
|
+
std::make_shared<TestSecondaryCache>(2048, true);
|
|
1404
1420
|
std::shared_ptr<Cache> cache =
|
|
1405
1421
|
NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
|
|
1406
1422
|
strict_capacity_limit, secondary_cache);
|
|
@@ -2019,8 +2035,9 @@ class CacheWithStats : public CacheWrapper {
|
|
|
2019
2035
|
|
|
2020
2036
|
Status Insert(const Slice& key, Cache::ObjectPtr value,
|
|
2021
2037
|
const CacheItemHelper* helper, size_t charge,
|
|
2022
|
-
Handle** handle = nullptr,
|
|
2023
|
-
|
|
2038
|
+
Handle** handle = nullptr, Priority priority = Priority::LOW,
|
|
2039
|
+
const Slice& /*compressed*/ = Slice(),
|
|
2040
|
+
CompressionType /*type*/ = kNoCompression) override {
|
|
2024
2041
|
insert_count_++;
|
|
2025
2042
|
return target_->Insert(key, value, helper, charge, handle, priority);
|
|
2026
2043
|
}
|
|
@@ -2113,7 +2130,7 @@ TEST_P(DBSecondaryCacheTest, LRUCacheDumpLoadBasic) {
|
|
|
2113
2130
|
// we have a new cache it is empty, then, before we do the Get, we do the
|
|
2114
2131
|
// dumpload
|
|
2115
2132
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
2116
|
-
std::make_shared<TestSecondaryCache>(2048 * 1024);
|
|
2133
|
+
std::make_shared<TestSecondaryCache>(2048 * 1024, true);
|
|
2117
2134
|
// This time with secondary cache
|
|
2118
2135
|
base_cache = NewCache(1024 * 1024 /* capacity */, 0 /* num_shard_bits */,
|
|
2119
2136
|
false /* strict_capacity_limit */, secondary_cache);
|
|
@@ -2269,7 +2286,7 @@ TEST_P(DBSecondaryCacheTest, LRUCacheDumpLoadWithFilter) {
|
|
|
2269
2286
|
// we have a new cache it is empty, then, before we do the Get, we do the
|
|
2270
2287
|
// dumpload
|
|
2271
2288
|
std::shared_ptr<TestSecondaryCache> secondary_cache =
|
|
2272
|
-
std::make_shared<TestSecondaryCache>(2048 * 1024);
|
|
2289
|
+
std::make_shared<TestSecondaryCache>(2048 * 1024, true);
|
|
2273
2290
|
// This time with secondary_cache
|
|
2274
2291
|
base_cache = NewCache(1024 * 1024 /* capacity */, 0 /* num_shard_bits */,
|
|
2275
2292
|
false /* strict_capacity_limit */, secondary_cache);
|
|
@@ -9,37 +9,4 @@
|
|
|
9
9
|
|
|
10
10
|
namespace ROCKSDB_NAMESPACE {
|
|
11
11
|
|
|
12
|
-
namespace {
|
|
13
|
-
|
|
14
|
-
void NoopDelete(Cache::ObjectPtr, MemoryAllocator*) {}
|
|
15
|
-
|
|
16
|
-
size_t SliceSize(Cache::ObjectPtr obj) {
|
|
17
|
-
return static_cast<Slice*>(obj)->size();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
Status SliceSaveTo(Cache::ObjectPtr from_obj, size_t from_offset, size_t length,
|
|
21
|
-
char* out) {
|
|
22
|
-
const Slice& slice = *static_cast<Slice*>(from_obj);
|
|
23
|
-
std::memcpy(out, slice.data() + from_offset, length);
|
|
24
|
-
return Status::OK();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
Status FailCreate(const Slice&, Cache::CreateContext*, MemoryAllocator*,
|
|
28
|
-
Cache::ObjectPtr*, size_t*) {
|
|
29
|
-
return Status::NotSupported("Only for dumping data into SecondaryCache");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
} // namespace
|
|
33
|
-
|
|
34
|
-
Status SecondaryCache::InsertSaved(const Slice& key, const Slice& saved) {
|
|
35
|
-
static Cache::CacheItemHelper helper_no_secondary{CacheEntryRole::kMisc,
|
|
36
|
-
&NoopDelete};
|
|
37
|
-
static Cache::CacheItemHelper helper{
|
|
38
|
-
CacheEntryRole::kMisc, &NoopDelete, &SliceSize,
|
|
39
|
-
&SliceSaveTo, &FailCreate, &helper_no_secondary};
|
|
40
|
-
// NOTE: depends on Insert() being synchronous, not keeping pointer `&saved`
|
|
41
|
-
return Insert(key, const_cast<Slice*>(&saved), &helper,
|
|
42
|
-
/*force_insert=*/true);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
12
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
#include "cache/secondary_cache_adapter.h"
|
|
7
7
|
|
|
8
|
+
#include <atomic>
|
|
9
|
+
|
|
10
|
+
#include "cache/tiered_secondary_cache.h"
|
|
8
11
|
#include "monitoring/perf_context_imp.h"
|
|
12
|
+
#include "test_util/sync_point.h"
|
|
9
13
|
#include "util/cast_util.h"
|
|
10
14
|
|
|
11
15
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -17,6 +21,7 @@ struct Dummy {
|
|
|
17
21
|
};
|
|
18
22
|
const Dummy kDummy{};
|
|
19
23
|
Cache::ObjectPtr const kDummyObj = const_cast<Dummy*>(&kDummy);
|
|
24
|
+
const char* kTieredCacheName = "TieredCache";
|
|
20
25
|
} // namespace
|
|
21
26
|
|
|
22
27
|
// When CacheWithSecondaryAdapter is constructed with the distribute_cache_res
|
|
@@ -78,7 +83,10 @@ CacheWithSecondaryAdapter::CacheWithSecondaryAdapter(
|
|
|
78
83
|
: CacheWrapper(std::move(target)),
|
|
79
84
|
secondary_cache_(std::move(secondary_cache)),
|
|
80
85
|
adm_policy_(adm_policy),
|
|
81
|
-
distribute_cache_res_(distribute_cache_res)
|
|
86
|
+
distribute_cache_res_(distribute_cache_res),
|
|
87
|
+
placeholder_usage_(0),
|
|
88
|
+
reserved_usage_(0),
|
|
89
|
+
sec_reserved_(0) {
|
|
82
90
|
target_->SetEvictionCallback(
|
|
83
91
|
[this](const Slice& key, Handle* handle, bool was_hit) {
|
|
84
92
|
return EvictionHandler(key, handle, was_hit);
|
|
@@ -111,7 +119,7 @@ CacheWithSecondaryAdapter::~CacheWithSecondaryAdapter() {
|
|
|
111
119
|
size_t sec_capacity = 0;
|
|
112
120
|
Status s = secondary_cache_->GetCapacity(sec_capacity);
|
|
113
121
|
assert(s.ok());
|
|
114
|
-
assert(pri_cache_res_->
|
|
122
|
+
assert(pri_cache_res_->GetTotalMemoryUsed() == sec_capacity);
|
|
115
123
|
}
|
|
116
124
|
#endif // NDEBUG
|
|
117
125
|
}
|
|
@@ -119,7 +127,8 @@ CacheWithSecondaryAdapter::~CacheWithSecondaryAdapter() {
|
|
|
119
127
|
bool CacheWithSecondaryAdapter::EvictionHandler(const Slice& key,
|
|
120
128
|
Handle* handle, bool was_hit) {
|
|
121
129
|
auto helper = GetCacheItemHelper(handle);
|
|
122
|
-
if (helper->IsSecondaryCacheCompatible()
|
|
130
|
+
if (helper->IsSecondaryCacheCompatible() &&
|
|
131
|
+
adm_policy_ != TieredAdmissionPolicy::kAdmPolicyThreeQueue) {
|
|
123
132
|
auto obj = target_->Value(handle);
|
|
124
133
|
// Ignore dummy entry
|
|
125
134
|
if (obj != kDummyObj) {
|
|
@@ -225,14 +234,42 @@ Cache::Handle* CacheWithSecondaryAdapter::Promote(
|
|
|
225
234
|
Status CacheWithSecondaryAdapter::Insert(const Slice& key, ObjectPtr value,
|
|
226
235
|
const CacheItemHelper* helper,
|
|
227
236
|
size_t charge, Handle** handle,
|
|
228
|
-
Priority priority
|
|
237
|
+
Priority priority,
|
|
238
|
+
const Slice& compressed_value,
|
|
239
|
+
CompressionType type) {
|
|
229
240
|
Status s = target_->Insert(key, value, helper, charge, handle, priority);
|
|
230
|
-
if (s.ok() && value == nullptr && distribute_cache_res_) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
241
|
+
if (s.ok() && value == nullptr && distribute_cache_res_ && handle) {
|
|
242
|
+
charge = target_->GetCharge(*handle);
|
|
243
|
+
|
|
244
|
+
MutexLock l(&cache_res_mutex_);
|
|
245
|
+
placeholder_usage_ += charge;
|
|
246
|
+
// Check if total placeholder reservation is more than the overall
|
|
247
|
+
// cache capacity. If it is, then we don't try to charge the
|
|
248
|
+
// secondary cache because we don't want to overcharge it (beyond
|
|
249
|
+
// its capacity).
|
|
250
|
+
// In order to make this a bit more lightweight, we also check if
|
|
251
|
+
// the difference between placeholder_usage_ and reserved_usage_ is
|
|
252
|
+
// atleast kReservationChunkSize and avoid any adjustments if not.
|
|
253
|
+
if ((placeholder_usage_ <= target_->GetCapacity()) &&
|
|
254
|
+
((placeholder_usage_ - reserved_usage_) >= kReservationChunkSize)) {
|
|
255
|
+
reserved_usage_ = placeholder_usage_ & ~(kReservationChunkSize - 1);
|
|
256
|
+
size_t new_sec_reserved =
|
|
257
|
+
static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
|
|
258
|
+
size_t sec_charge = new_sec_reserved - sec_reserved_;
|
|
259
|
+
s = secondary_cache_->Deflate(sec_charge);
|
|
260
|
+
assert(s.ok());
|
|
261
|
+
s = pri_cache_res_->UpdateCacheReservation(sec_charge,
|
|
262
|
+
/*increase=*/false);
|
|
263
|
+
assert(s.ok());
|
|
264
|
+
sec_reserved_ += sec_charge;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Warm up the secondary cache with the compressed block. The secondary
|
|
268
|
+
// cache may choose to ignore it based on the admission policy.
|
|
269
|
+
if (value != nullptr && !compressed_value.empty() &&
|
|
270
|
+
adm_policy_ == TieredAdmissionPolicy::kAdmPolicyThreeQueue) {
|
|
271
|
+
Status status = secondary_cache_->InsertSaved(key, compressed_value, type);
|
|
272
|
+
assert(status.ok() || status.IsNotSupported());
|
|
236
273
|
}
|
|
237
274
|
|
|
238
275
|
return s;
|
|
@@ -270,11 +307,27 @@ bool CacheWithSecondaryAdapter::Release(Handle* handle,
|
|
|
270
307
|
ObjectPtr v = target_->Value(handle);
|
|
271
308
|
if (v == nullptr && distribute_cache_res_) {
|
|
272
309
|
size_t charge = target_->GetCharge(handle);
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
310
|
+
|
|
311
|
+
MutexLock l(&cache_res_mutex_);
|
|
312
|
+
placeholder_usage_ -= charge;
|
|
313
|
+
// Check if total placeholder reservation is more than the overall
|
|
314
|
+
// cache capacity. If it is, then we do nothing as reserved_usage_ must
|
|
315
|
+
// be already maxed out
|
|
316
|
+
if ((placeholder_usage_ <= target_->GetCapacity()) &&
|
|
317
|
+
(placeholder_usage_ < reserved_usage_)) {
|
|
318
|
+
// Adjust reserved_usage_ in chunks of kReservationChunkSize, so
|
|
319
|
+
// we don't hit this slow path too often.
|
|
320
|
+
reserved_usage_ = placeholder_usage_ & ~(kReservationChunkSize - 1);
|
|
321
|
+
size_t new_sec_reserved =
|
|
322
|
+
static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
|
|
323
|
+
size_t sec_charge = sec_reserved_ - new_sec_reserved;
|
|
324
|
+
Status s = secondary_cache_->Inflate(sec_charge);
|
|
325
|
+
assert(s.ok());
|
|
326
|
+
s = pri_cache_res_->UpdateCacheReservation(sec_charge,
|
|
327
|
+
/*increase=*/true);
|
|
328
|
+
assert(s.ok());
|
|
329
|
+
sec_reserved_ -= sec_charge;
|
|
330
|
+
}
|
|
278
331
|
}
|
|
279
332
|
}
|
|
280
333
|
return target_->Release(handle, erase_if_last_ref);
|
|
@@ -406,41 +459,277 @@ std::string CacheWithSecondaryAdapter::GetPrintableOptions() const {
|
|
|
406
459
|
}
|
|
407
460
|
|
|
408
461
|
const char* CacheWithSecondaryAdapter::Name() const {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
462
|
+
if (distribute_cache_res_) {
|
|
463
|
+
return kTieredCacheName;
|
|
464
|
+
} else {
|
|
465
|
+
// To the user, at least for now, configure the underlying cache with
|
|
466
|
+
// a secondary cache. So we pretend to be that cache
|
|
467
|
+
return target_->Name();
|
|
468
|
+
}
|
|
412
469
|
}
|
|
413
470
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
471
|
+
// Update the total cache capacity. If we're distributing cache reservations
|
|
472
|
+
// to both primary and secondary, then update the pri_cache_res_reservation
|
|
473
|
+
// as well. At the moment, we don't have a good way of handling the case
|
|
474
|
+
// where the new capacity < total cache reservations.
|
|
475
|
+
void CacheWithSecondaryAdapter::SetCapacity(size_t capacity) {
|
|
476
|
+
size_t sec_capacity = static_cast<size_t>(
|
|
477
|
+
capacity * (distribute_cache_res_ ? sec_cache_res_ratio_ : 0.0));
|
|
478
|
+
size_t old_sec_capacity = 0;
|
|
479
|
+
|
|
480
|
+
if (distribute_cache_res_) {
|
|
481
|
+
MutexLock m(&cache_res_mutex_);
|
|
482
|
+
|
|
483
|
+
Status s = secondary_cache_->GetCapacity(old_sec_capacity);
|
|
484
|
+
if (!s.ok()) {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
if (old_sec_capacity > sec_capacity) {
|
|
488
|
+
// We're shrinking the cache. We do things in the following order to
|
|
489
|
+
// avoid a temporary spike in usage over the configured capacity -
|
|
490
|
+
// 1. Lower the secondary cache capacity
|
|
491
|
+
// 2. Credit an equal amount (by decreasing pri_cache_res_) to the
|
|
492
|
+
// primary cache
|
|
493
|
+
// 3. Decrease the primary cache capacity to the total budget
|
|
494
|
+
s = secondary_cache_->SetCapacity(sec_capacity);
|
|
495
|
+
if (s.ok()) {
|
|
496
|
+
if (placeholder_usage_ > capacity) {
|
|
497
|
+
// Adjust reserved_usage_ down
|
|
498
|
+
reserved_usage_ = capacity & ~(kReservationChunkSize - 1);
|
|
499
|
+
}
|
|
500
|
+
size_t new_sec_reserved =
|
|
501
|
+
static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
|
|
502
|
+
s = pri_cache_res_->UpdateCacheReservation(
|
|
503
|
+
(old_sec_capacity - sec_capacity) -
|
|
504
|
+
(sec_reserved_ - new_sec_reserved),
|
|
505
|
+
/*increase=*/false);
|
|
506
|
+
sec_reserved_ = new_sec_reserved;
|
|
507
|
+
assert(s.ok());
|
|
508
|
+
target_->SetCapacity(capacity);
|
|
509
|
+
}
|
|
510
|
+
} else {
|
|
511
|
+
// We're expanding the cache. Do it in the following order to avoid
|
|
512
|
+
// unnecessary evictions -
|
|
513
|
+
// 1. Increase the primary cache capacity to total budget
|
|
514
|
+
// 2. Reserve additional memory in primary on behalf of secondary (by
|
|
515
|
+
// increasing pri_cache_res_ reservation)
|
|
516
|
+
// 3. Increase secondary cache capacity
|
|
517
|
+
target_->SetCapacity(capacity);
|
|
518
|
+
s = pri_cache_res_->UpdateCacheReservation(
|
|
519
|
+
sec_capacity - old_sec_capacity,
|
|
520
|
+
/*increase=*/true);
|
|
521
|
+
assert(s.ok());
|
|
522
|
+
s = secondary_cache_->SetCapacity(sec_capacity);
|
|
523
|
+
assert(s.ok());
|
|
524
|
+
}
|
|
525
|
+
} else {
|
|
526
|
+
// No cache reservation distribution. Just set the primary cache capacity.
|
|
527
|
+
target_->SetCapacity(capacity);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
Status CacheWithSecondaryAdapter::GetSecondaryCacheCapacity(
|
|
532
|
+
size_t& size) const {
|
|
533
|
+
return secondary_cache_->GetCapacity(size);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
Status CacheWithSecondaryAdapter::GetSecondaryCachePinnedUsage(
|
|
537
|
+
size_t& size) const {
|
|
538
|
+
Status s;
|
|
539
|
+
if (distribute_cache_res_) {
|
|
540
|
+
MutexLock m(&cache_res_mutex_);
|
|
541
|
+
size_t capacity = 0;
|
|
542
|
+
s = secondary_cache_->GetCapacity(capacity);
|
|
543
|
+
if (s.ok()) {
|
|
544
|
+
size = capacity - pri_cache_res_->GetTotalMemoryUsed();
|
|
545
|
+
} else {
|
|
546
|
+
size = 0;
|
|
547
|
+
}
|
|
548
|
+
} else {
|
|
549
|
+
size = 0;
|
|
550
|
+
}
|
|
551
|
+
return s;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// Update the secondary/primary allocation ratio (remember, the primary
|
|
555
|
+
// capacity is the total memory budget when distribute_cache_res_ is true).
|
|
556
|
+
// When the ratio changes, we may accumulate some error in the calculations
|
|
557
|
+
// for secondary cache inflate/deflate and pri_cache_res_ reservations.
|
|
558
|
+
// This is due to the rounding of the reservation amount.
|
|
559
|
+
//
|
|
560
|
+
// We rely on the current pri_cache_res_ total memory used to estimate the
|
|
561
|
+
// new secondary cache reservation after the ratio change. For this reason,
|
|
562
|
+
// once the ratio is lowered to 0.0 (effectively disabling the secondary
|
|
563
|
+
// cache and pri_cache_res_ total mem used going down to 0), we cannot
|
|
564
|
+
// increase the ratio and re-enable it, We might remove this limitation
|
|
565
|
+
// in the future.
|
|
566
|
+
Status CacheWithSecondaryAdapter::UpdateCacheReservationRatio(
|
|
567
|
+
double compressed_secondary_ratio) {
|
|
568
|
+
if (!distribute_cache_res_) {
|
|
569
|
+
return Status::NotSupported();
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
MutexLock m(&cache_res_mutex_);
|
|
573
|
+
size_t pri_capacity = target_->GetCapacity();
|
|
574
|
+
size_t sec_capacity =
|
|
575
|
+
static_cast<size_t>(pri_capacity * compressed_secondary_ratio);
|
|
576
|
+
size_t old_sec_capacity;
|
|
577
|
+
Status s = secondary_cache_->GetCapacity(old_sec_capacity);
|
|
578
|
+
if (!s.ok()) {
|
|
579
|
+
return s;
|
|
418
580
|
}
|
|
419
581
|
|
|
420
|
-
|
|
582
|
+
// Calculate the new secondary cache reservation
|
|
583
|
+
// reserved_usage_ will never be > the cache capacity, so we don't
|
|
584
|
+
// have to worry about adjusting it here.
|
|
585
|
+
sec_cache_res_ratio_ = compressed_secondary_ratio;
|
|
586
|
+
size_t new_sec_reserved =
|
|
587
|
+
static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
|
|
588
|
+
if (sec_capacity > old_sec_capacity) {
|
|
589
|
+
// We're increasing the ratio, thus ending up with a larger secondary
|
|
590
|
+
// cache and a smaller usable primary cache capacity. Similar to
|
|
591
|
+
// SetCapacity(), we try to avoid a temporary increase in total usage
|
|
592
|
+
// beyond the configured capacity -
|
|
593
|
+
// 1. A higher secondary cache ratio means it gets a higher share of
|
|
594
|
+
// cache reservations. So first account for that by deflating the
|
|
595
|
+
// secondary cache
|
|
596
|
+
// 2. Increase pri_cache_res_ reservation to reflect the new secondary
|
|
597
|
+
// cache utilization (increase in capacity - increase in share of cache
|
|
598
|
+
// reservation)
|
|
599
|
+
// 3. Increase secondary cache capacity
|
|
600
|
+
s = secondary_cache_->Deflate(new_sec_reserved - sec_reserved_);
|
|
601
|
+
assert(s.ok());
|
|
602
|
+
s = pri_cache_res_->UpdateCacheReservation(
|
|
603
|
+
(sec_capacity - old_sec_capacity) - (new_sec_reserved - sec_reserved_),
|
|
604
|
+
/*increase=*/true);
|
|
605
|
+
assert(s.ok());
|
|
606
|
+
sec_reserved_ = new_sec_reserved;
|
|
607
|
+
s = secondary_cache_->SetCapacity(sec_capacity);
|
|
608
|
+
assert(s.ok());
|
|
609
|
+
} else {
|
|
610
|
+
// We're shrinking the ratio. Try to avoid unnecessary evictions -
|
|
611
|
+
// 1. Lower the secondary cache capacity
|
|
612
|
+
// 2. Decrease pri_cache_res_ reservation to relect lower secondary
|
|
613
|
+
// cache utilization (decrease in capacity - decrease in share of cache
|
|
614
|
+
// reservations)
|
|
615
|
+
// 3. Inflate the secondary cache to give it back the reduction in its
|
|
616
|
+
// share of cache reservations
|
|
617
|
+
s = secondary_cache_->SetCapacity(sec_capacity);
|
|
618
|
+
if (s.ok()) {
|
|
619
|
+
s = pri_cache_res_->UpdateCacheReservation(
|
|
620
|
+
(old_sec_capacity - sec_capacity) -
|
|
621
|
+
(sec_reserved_ - new_sec_reserved),
|
|
622
|
+
/*increase=*/false);
|
|
623
|
+
assert(s.ok());
|
|
624
|
+
s = secondary_cache_->Inflate(sec_reserved_ - new_sec_reserved);
|
|
625
|
+
assert(s.ok());
|
|
626
|
+
sec_reserved_ = new_sec_reserved;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
return s;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
Status CacheWithSecondaryAdapter::UpdateAdmissionPolicy(
|
|
634
|
+
TieredAdmissionPolicy adm_policy) {
|
|
635
|
+
adm_policy_ = adm_policy;
|
|
636
|
+
return Status::OK();
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
std::shared_ptr<Cache> NewTieredCache(const TieredCacheOptions& _opts) {
|
|
640
|
+
if (!_opts.cache_opts) {
|
|
421
641
|
return nullptr;
|
|
422
642
|
}
|
|
423
643
|
|
|
644
|
+
TieredCacheOptions opts = _opts;
|
|
645
|
+
{
|
|
646
|
+
bool valid_adm_policy = true;
|
|
647
|
+
|
|
648
|
+
switch (_opts.adm_policy) {
|
|
649
|
+
case TieredAdmissionPolicy::kAdmPolicyAuto:
|
|
650
|
+
// Select an appropriate default policy
|
|
651
|
+
if (opts.adm_policy == TieredAdmissionPolicy::kAdmPolicyAuto) {
|
|
652
|
+
if (opts.nvm_sec_cache) {
|
|
653
|
+
opts.adm_policy = TieredAdmissionPolicy::kAdmPolicyThreeQueue;
|
|
654
|
+
} else {
|
|
655
|
+
opts.adm_policy = TieredAdmissionPolicy::kAdmPolicyPlaceholder;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
break;
|
|
659
|
+
case TieredAdmissionPolicy::kAdmPolicyPlaceholder:
|
|
660
|
+
case TieredAdmissionPolicy::kAdmPolicyAllowCacheHits:
|
|
661
|
+
if (opts.nvm_sec_cache) {
|
|
662
|
+
valid_adm_policy = false;
|
|
663
|
+
}
|
|
664
|
+
break;
|
|
665
|
+
case TieredAdmissionPolicy::kAdmPolicyThreeQueue:
|
|
666
|
+
if (!opts.nvm_sec_cache) {
|
|
667
|
+
valid_adm_policy = false;
|
|
668
|
+
}
|
|
669
|
+
break;
|
|
670
|
+
default:
|
|
671
|
+
valid_adm_policy = false;
|
|
672
|
+
}
|
|
673
|
+
if (!valid_adm_policy) {
|
|
674
|
+
return nullptr;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
424
678
|
std::shared_ptr<Cache> cache;
|
|
425
679
|
if (opts.cache_type == PrimaryCacheType::kCacheTypeLRU) {
|
|
426
680
|
LRUCacheOptions cache_opts =
|
|
427
681
|
*(static_cast_with_check<LRUCacheOptions, ShardedCacheOptions>(
|
|
428
682
|
opts.cache_opts));
|
|
429
|
-
cache_opts.capacity
|
|
683
|
+
cache_opts.capacity = opts.total_capacity;
|
|
430
684
|
cache = cache_opts.MakeSharedCache();
|
|
431
685
|
} else if (opts.cache_type == PrimaryCacheType::kCacheTypeHCC) {
|
|
432
686
|
HyperClockCacheOptions cache_opts =
|
|
433
687
|
*(static_cast_with_check<HyperClockCacheOptions, ShardedCacheOptions>(
|
|
434
688
|
opts.cache_opts));
|
|
435
|
-
cache_opts.capacity
|
|
689
|
+
cache_opts.capacity = opts.total_capacity;
|
|
436
690
|
cache = cache_opts.MakeSharedCache();
|
|
437
691
|
} else {
|
|
438
692
|
return nullptr;
|
|
439
693
|
}
|
|
440
694
|
std::shared_ptr<SecondaryCache> sec_cache;
|
|
695
|
+
opts.comp_cache_opts.capacity = static_cast<size_t>(
|
|
696
|
+
opts.total_capacity * opts.compressed_secondary_ratio);
|
|
441
697
|
sec_cache = NewCompressedSecondaryCache(opts.comp_cache_opts);
|
|
442
698
|
|
|
699
|
+
if (opts.nvm_sec_cache) {
|
|
700
|
+
if (opts.adm_policy == TieredAdmissionPolicy::kAdmPolicyThreeQueue) {
|
|
701
|
+
sec_cache = std::make_shared<TieredSecondaryCache>(
|
|
702
|
+
sec_cache, opts.nvm_sec_cache,
|
|
703
|
+
TieredAdmissionPolicy::kAdmPolicyThreeQueue);
|
|
704
|
+
} else {
|
|
705
|
+
return nullptr;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
443
709
|
return std::make_shared<CacheWithSecondaryAdapter>(
|
|
444
710
|
cache, sec_cache, opts.adm_policy, /*distribute_cache_res=*/true);
|
|
445
711
|
}
|
|
712
|
+
|
|
713
|
+
Status UpdateTieredCache(const std::shared_ptr<Cache>& cache,
|
|
714
|
+
int64_t total_capacity,
|
|
715
|
+
double compressed_secondary_ratio,
|
|
716
|
+
TieredAdmissionPolicy adm_policy) {
|
|
717
|
+
if (!cache || strcmp(cache->Name(), kTieredCacheName)) {
|
|
718
|
+
return Status::InvalidArgument();
|
|
719
|
+
}
|
|
720
|
+
CacheWithSecondaryAdapter* tiered_cache =
|
|
721
|
+
static_cast<CacheWithSecondaryAdapter*>(cache.get());
|
|
722
|
+
|
|
723
|
+
Status s;
|
|
724
|
+
if (total_capacity > 0) {
|
|
725
|
+
tiered_cache->SetCapacity(total_capacity);
|
|
726
|
+
}
|
|
727
|
+
if (compressed_secondary_ratio >= 0.0 && compressed_secondary_ratio <= 1.0) {
|
|
728
|
+
s = tiered_cache->UpdateCacheReservationRatio(compressed_secondary_ratio);
|
|
729
|
+
}
|
|
730
|
+
if (adm_policy < TieredAdmissionPolicy::kAdmPolicyMax) {
|
|
731
|
+
s = tiered_cache->UpdateAdmissionPolicy(adm_policy);
|
|
732
|
+
}
|
|
733
|
+
return s;
|
|
734
|
+
}
|
|
446
735
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -20,10 +20,12 @@ class CacheWithSecondaryAdapter : public CacheWrapper {
|
|
|
20
20
|
|
|
21
21
|
~CacheWithSecondaryAdapter() override;
|
|
22
22
|
|
|
23
|
-
Status Insert(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
Status Insert(
|
|
24
|
+
const Slice& key, ObjectPtr value, const CacheItemHelper* helper,
|
|
25
|
+
size_t charge, Handle** handle = nullptr,
|
|
26
|
+
Priority priority = Priority::LOW,
|
|
27
|
+
const Slice& compressed_value = Slice(),
|
|
28
|
+
CompressionType type = CompressionType::kNoCompression) override;
|
|
27
29
|
|
|
28
30
|
Handle* Lookup(const Slice& key, const CacheItemHelper* helper,
|
|
29
31
|
CreateContext* create_context,
|
|
@@ -43,11 +45,23 @@ class CacheWithSecondaryAdapter : public CacheWrapper {
|
|
|
43
45
|
|
|
44
46
|
const char* Name() const override;
|
|
45
47
|
|
|
48
|
+
void SetCapacity(size_t capacity) override;
|
|
49
|
+
|
|
50
|
+
Status GetSecondaryCacheCapacity(size_t& size) const override;
|
|
51
|
+
|
|
52
|
+
Status GetSecondaryCachePinnedUsage(size_t& size) const override;
|
|
53
|
+
|
|
54
|
+
Status UpdateCacheReservationRatio(double ratio);
|
|
55
|
+
|
|
56
|
+
Status UpdateAdmissionPolicy(TieredAdmissionPolicy adm_policy);
|
|
57
|
+
|
|
46
58
|
Cache* TEST_GetCache() { return target_.get(); }
|
|
47
59
|
|
|
48
60
|
SecondaryCache* TEST_GetSecondaryCache() { return secondary_cache_.get(); }
|
|
49
61
|
|
|
50
62
|
private:
|
|
63
|
+
static constexpr size_t kReservationChunkSize = 1 << 20;
|
|
64
|
+
|
|
51
65
|
bool EvictionHandler(const Slice& key, Handle* handle, bool was_hit);
|
|
52
66
|
|
|
53
67
|
void StartAsyncLookupOnMySecondary(AsyncLookupHandle& async_handle);
|
|
@@ -73,6 +87,17 @@ class CacheWithSecondaryAdapter : public CacheWrapper {
|
|
|
73
87
|
// Fraction of a cache memory reservation to be assigned to the secondary
|
|
74
88
|
// cache
|
|
75
89
|
double sec_cache_res_ratio_;
|
|
90
|
+
// Mutex for use when managing cache memory reservations. Should not be used
|
|
91
|
+
// for other purposes, as it may risk causing deadlocks.
|
|
92
|
+
mutable port::Mutex cache_res_mutex_;
|
|
93
|
+
// Total memory reserved by placeholder entriesin the cache
|
|
94
|
+
size_t placeholder_usage_;
|
|
95
|
+
// Total placeholoder memory charged to both the primary and secondary
|
|
96
|
+
// caches. Will be <= placeholder_usage_.
|
|
97
|
+
size_t reserved_usage_;
|
|
98
|
+
// Amount of memory reserved in the secondary cache. This should be
|
|
99
|
+
// reserved_usage_ * sec_cache_res_ratio_ in steady state.
|
|
100
|
+
size_t sec_reserved_;
|
|
76
101
|
};
|
|
77
102
|
|
|
78
103
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -83,6 +83,16 @@ size_t ShardedCacheBase::GetCapacity() const {
|
|
|
83
83
|
return capacity_;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
Status ShardedCacheBase::GetSecondaryCacheCapacity(size_t& size) const {
|
|
87
|
+
size = 0;
|
|
88
|
+
return Status::OK();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
Status ShardedCacheBase::GetSecondaryCachePinnedUsage(size_t& size) const {
|
|
92
|
+
size = 0;
|
|
93
|
+
return Status::OK();
|
|
94
|
+
}
|
|
95
|
+
|
|
86
96
|
bool ShardedCacheBase::HasStrictCapacityLimit() const {
|
|
87
97
|
MutexLock l(&config_mutex_);
|
|
88
98
|
return strict_capacity_limit_;
|