@nxtedition/rocksdb 6.0.0 → 6.0.3
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 +18 -0
- package/binding.cc +16 -17
- package/binding.gyp +2 -2
- package/deps/rocksdb/build_version.cc +4 -10
- package/deps/rocksdb/rocksdb/CMakeLists.txt +26 -3
- package/deps/rocksdb/rocksdb/Makefile +73 -91
- package/deps/rocksdb/rocksdb/TARGETS +27 -2
- 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/cmake/modules/CxxFlags.cmake +7 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
- package/deps/rocksdb/rocksdb/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 +22 -7
- package/deps/rocksdb/rocksdb/db/c.cc +71 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +28 -2
- package/deps/rocksdb/rocksdb/db/column_family.cc +12 -5
- 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 +54 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +14 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +85 -18
- 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 +23 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +151 -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 +404 -32
- 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 +11 -20
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +15 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +12 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +42 -10
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +54 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +14 -4
- 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 +28 -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_readonly_with_timestamp_test.cc +331 -0
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +11 -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 +60 -42
- package/deps/rocksdb/rocksdb/db/db_test2.cc +244 -111
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +101 -19
- package/deps/rocksdb/rocksdb/db/db_test_util.h +52 -2
- 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 +5 -175
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.cc +96 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.h +126 -0
- 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/experimental.cc +1 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +91 -12
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +16 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +2 -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 +28 -15
- 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 +14 -1
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -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 +13 -2
- package/deps/rocksdb/rocksdb/db/repair_test.cc +37 -15
- package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
- package/deps/rocksdb/rocksdb/db/snapshot_impl.h +3 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +20 -130
- package/deps/rocksdb/rocksdb/db/table_cache.h +3 -2
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +140 -0
- package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +133 -133
- package/deps/rocksdb/rocksdb/db/version_edit.cc +22 -2
- package/deps/rocksdb/rocksdb/db/version_edit.h +13 -4
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +14 -14
- package/deps/rocksdb/rocksdb/db/version_set.cc +207 -214
- package/deps/rocksdb/rocksdb/db/version_set.h +14 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +154 -0
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -9
- 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 +9 -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 +44 -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 +374 -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.cc +159 -65
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +44 -22
- package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +142 -17
- 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 +60 -40
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +23 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +49 -1
- 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/file_system.h +2 -0
- 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 +45 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +4 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
- 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 +378 -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 +7 -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/statistics.cc +1 -1
- 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 +47 -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 +46 -17
- package/deps/rocksdb/rocksdb/options/db_options.h +2 -0
- package/deps/rocksdb/rocksdb/options/options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +86 -39
- package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +12 -7
- package/deps/rocksdb/rocksdb/options/options_test.cc +222 -68
- 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 +6 -1
- 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 +23 -8
- 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 +81 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +8 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +94 -726
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +21 -15
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +9 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +754 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -73
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +2 -11
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +59 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +18 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +0 -61
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +0 -13
- 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 +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +8 -4
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +65 -7
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -0
- 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/merging_iterator.cc +39 -0
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/multiget_context.h +60 -13
- 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_dumper.cc +2 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +1 -1
- 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_reader.h +13 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
- package/deps/rocksdb/rocksdb/table/unique_id.cc +84 -25
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +37 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -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 +277 -105
- 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 +26 -4
- 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/async_file_reader.cc +72 -0
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +144 -0
- 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 +56 -7
- package/deps/rocksdb/rocksdb/util/coro_utils.h +111 -0
- 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/single_thread_executor.h +55 -0
- 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 +47 -37
- package/package-lock.json +23687 -0
- package/package.json +2 -30
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/liburing/liburing/README +0 -46
- package/deps/liburing/liburing/test/232c93d07b74-test.c +0 -305
- package/deps/liburing/liburing/test/35fa71a030ca-test.c +0 -329
- package/deps/liburing/liburing/test/500f9fbadef8-test.c +0 -89
- package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +0 -93
- package/deps/liburing/liburing/test/8a9973408177-test.c +0 -106
- package/deps/liburing/liburing/test/917257daa0fe-test.c +0 -53
- package/deps/liburing/liburing/test/Makefile +0 -312
- package/deps/liburing/liburing/test/a0908ae19763-test.c +0 -58
- package/deps/liburing/liburing/test/a4c0b3decb33-test.c +0 -180
- package/deps/liburing/liburing/test/accept-link.c +0 -251
- package/deps/liburing/liburing/test/accept-reuse.c +0 -164
- package/deps/liburing/liburing/test/accept-test.c +0 -79
- package/deps/liburing/liburing/test/accept.c +0 -476
- package/deps/liburing/liburing/test/across-fork.c +0 -283
- package/deps/liburing/liburing/test/b19062a56726-test.c +0 -53
- package/deps/liburing/liburing/test/b5837bd5311d-test.c +0 -77
- package/deps/liburing/liburing/test/ce593a6c480a-test.c +0 -135
- package/deps/liburing/liburing/test/close-opath.c +0 -122
- package/deps/liburing/liburing/test/config +0 -10
- package/deps/liburing/liburing/test/connect.c +0 -398
- package/deps/liburing/liburing/test/cq-full.c +0 -96
- package/deps/liburing/liburing/test/cq-overflow.c +0 -294
- package/deps/liburing/liburing/test/cq-peek-batch.c +0 -102
- package/deps/liburing/liburing/test/cq-ready.c +0 -94
- package/deps/liburing/liburing/test/cq-size.c +0 -58
- package/deps/liburing/liburing/test/d4ae271dfaae-test.c +0 -96
- package/deps/liburing/liburing/test/d77a67ed5f27-test.c +0 -65
- package/deps/liburing/liburing/test/defer.c +0 -307
- package/deps/liburing/liburing/test/double-poll-crash.c +0 -186
- package/deps/liburing/liburing/test/eeed8b54e0df-test.c +0 -114
- package/deps/liburing/liburing/test/empty-eownerdead.c +0 -42
- package/deps/liburing/liburing/test/eventfd-disable.c +0 -151
- package/deps/liburing/liburing/test/eventfd-ring.c +0 -97
- package/deps/liburing/liburing/test/eventfd.c +0 -112
- package/deps/liburing/liburing/test/fadvise.c +0 -202
- package/deps/liburing/liburing/test/fallocate.c +0 -249
- package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +0 -138
- package/deps/liburing/liburing/test/file-register.c +0 -843
- package/deps/liburing/liburing/test/file-update.c +0 -173
- package/deps/liburing/liburing/test/files-exit-hang-poll.c +0 -128
- package/deps/liburing/liburing/test/files-exit-hang-timeout.c +0 -134
- package/deps/liburing/liburing/test/fixed-link.c +0 -90
- package/deps/liburing/liburing/test/fsync.c +0 -224
- package/deps/liburing/liburing/test/hardlink.c +0 -136
- package/deps/liburing/liburing/test/helpers.c +0 -135
- package/deps/liburing/liburing/test/helpers.h +0 -67
- package/deps/liburing/liburing/test/io-cancel.c +0 -537
- package/deps/liburing/liburing/test/io_uring_enter.c +0 -296
- package/deps/liburing/liburing/test/io_uring_register.c +0 -664
- package/deps/liburing/liburing/test/io_uring_setup.c +0 -192
- package/deps/liburing/liburing/test/iopoll.c +0 -366
- package/deps/liburing/liburing/test/lfs-openat-write.c +0 -117
- package/deps/liburing/liburing/test/lfs-openat.c +0 -273
- package/deps/liburing/liburing/test/link-timeout.c +0 -1107
- package/deps/liburing/liburing/test/link.c +0 -496
- package/deps/liburing/liburing/test/link_drain.c +0 -229
- package/deps/liburing/liburing/test/madvise.c +0 -195
- package/deps/liburing/liburing/test/mkdir.c +0 -108
- package/deps/liburing/liburing/test/multicqes_drain.c +0 -383
- package/deps/liburing/liburing/test/nop-all-sizes.c +0 -107
- package/deps/liburing/liburing/test/nop.c +0 -115
- package/deps/liburing/liburing/test/open-close.c +0 -146
- package/deps/liburing/liburing/test/openat2.c +0 -240
- package/deps/liburing/liburing/test/personality.c +0 -204
- package/deps/liburing/liburing/test/pipe-eof.c +0 -81
- package/deps/liburing/liburing/test/pipe-reuse.c +0 -105
- package/deps/liburing/liburing/test/poll-cancel-ton.c +0 -139
- package/deps/liburing/liburing/test/poll-cancel.c +0 -135
- package/deps/liburing/liburing/test/poll-link.c +0 -227
- package/deps/liburing/liburing/test/poll-many.c +0 -208
- package/deps/liburing/liburing/test/poll-mshot-update.c +0 -273
- package/deps/liburing/liburing/test/poll-ring.c +0 -48
- package/deps/liburing/liburing/test/poll-v-poll.c +0 -353
- package/deps/liburing/liburing/test/poll.c +0 -109
- package/deps/liburing/liburing/test/probe.c +0 -137
- package/deps/liburing/liburing/test/read-write.c +0 -876
- package/deps/liburing/liburing/test/register-restrictions.c +0 -633
- package/deps/liburing/liburing/test/rename.c +0 -134
- package/deps/liburing/liburing/test/ring-leak.c +0 -173
- package/deps/liburing/liburing/test/ring-leak2.c +0 -249
- package/deps/liburing/liburing/test/rsrc_tags.c +0 -449
- package/deps/liburing/liburing/test/runtests-loop.sh +0 -16
- package/deps/liburing/liburing/test/runtests.sh +0 -170
- package/deps/liburing/liburing/test/rw_merge_test.c +0 -97
- package/deps/liburing/liburing/test/self.c +0 -91
- package/deps/liburing/liburing/test/send_recv.c +0 -291
- package/deps/liburing/liburing/test/send_recvmsg.c +0 -345
- package/deps/liburing/liburing/test/sendmsg_fs_cve.c +0 -198
- package/deps/liburing/liburing/test/shared-wq.c +0 -84
- package/deps/liburing/liburing/test/short-read.c +0 -75
- package/deps/liburing/liburing/test/shutdown.c +0 -163
- package/deps/liburing/liburing/test/sigfd-deadlock.c +0 -74
- package/deps/liburing/liburing/test/socket-rw-eagain.c +0 -156
- package/deps/liburing/liburing/test/socket-rw.c +0 -147
- package/deps/liburing/liburing/test/splice.c +0 -511
- package/deps/liburing/liburing/test/sq-full-cpp.cc +0 -45
- package/deps/liburing/liburing/test/sq-full.c +0 -45
- package/deps/liburing/liburing/test/sq-poll-dup.c +0 -200
- package/deps/liburing/liburing/test/sq-poll-kthread.c +0 -168
- package/deps/liburing/liburing/test/sq-poll-share.c +0 -137
- package/deps/liburing/liburing/test/sq-space_left.c +0 -159
- package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +0 -159
- package/deps/liburing/liburing/test/sqpoll-disable-exit.c +0 -195
- package/deps/liburing/liburing/test/sqpoll-exit-hang.c +0 -77
- package/deps/liburing/liburing/test/sqpoll-sleep.c +0 -68
- package/deps/liburing/liburing/test/statx.c +0 -172
- package/deps/liburing/liburing/test/stdout.c +0 -232
- package/deps/liburing/liburing/test/submit-link-fail.c +0 -154
- package/deps/liburing/liburing/test/submit-reuse.c +0 -239
- package/deps/liburing/liburing/test/symlink.c +0 -116
- package/deps/liburing/liburing/test/teardowns.c +0 -58
- package/deps/liburing/liburing/test/thread-exit.c +0 -131
- package/deps/liburing/liburing/test/timeout-new.c +0 -246
- package/deps/liburing/liburing/test/timeout-overflow.c +0 -204
- package/deps/liburing/liburing/test/timeout.c +0 -1354
- package/deps/liburing/liburing/test/unlink.c +0 -111
- package/deps/liburing/liburing/test/wakeup-hang.c +0 -162
- package/deps/rocksdb/rocksdb/README.md +0 -32
- package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
- package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
- package/deps/rocksdb/rocksdb/port/README +0 -10
- package/deps/rocksdb/rocksdb/python.mk +0 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
- package/prebuilds/linux-arm64/node.napi.node +0 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
2
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
3
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
5
|
+
//
|
|
6
|
+
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
7
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
8
|
+
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
|
+
|
|
10
|
+
#include "cache/fast_lru_cache.h"
|
|
11
|
+
|
|
12
|
+
#include <cassert>
|
|
13
|
+
#include <cstdint>
|
|
14
|
+
#include <cstdio>
|
|
15
|
+
|
|
16
|
+
#include "monitoring/perf_context_imp.h"
|
|
17
|
+
#include "monitoring/statistics.h"
|
|
18
|
+
#include "port/lang.h"
|
|
19
|
+
#include "util/mutexlock.h"
|
|
20
|
+
|
|
21
|
+
namespace ROCKSDB_NAMESPACE {
|
|
22
|
+
|
|
23
|
+
namespace fast_lru_cache {
|
|
24
|
+
|
|
25
|
+
LRUHandleTable::LRUHandleTable(int max_upper_hash_bits)
|
|
26
|
+
: length_bits_(/* historical starting size*/ 4),
|
|
27
|
+
list_(new LRUHandle* [size_t{1} << length_bits_] {}),
|
|
28
|
+
elems_(0),
|
|
29
|
+
max_length_bits_(max_upper_hash_bits) {}
|
|
30
|
+
|
|
31
|
+
LRUHandleTable::~LRUHandleTable() {
|
|
32
|
+
ApplyToEntriesRange(
|
|
33
|
+
[](LRUHandle* h) {
|
|
34
|
+
if (!h->HasRefs()) {
|
|
35
|
+
h->Free();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
0, uint32_t{1} << length_bits_);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
LRUHandle* LRUHandleTable::Lookup(const Slice& key, uint32_t hash) {
|
|
42
|
+
return *FindPointer(key, hash);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
LRUHandle* LRUHandleTable::Insert(LRUHandle* h) {
|
|
46
|
+
LRUHandle** ptr = FindPointer(h->key(), h->hash);
|
|
47
|
+
LRUHandle* old = *ptr;
|
|
48
|
+
h->next_hash = (old == nullptr ? nullptr : old->next_hash);
|
|
49
|
+
*ptr = h;
|
|
50
|
+
if (old == nullptr) {
|
|
51
|
+
++elems_;
|
|
52
|
+
if ((elems_ >> length_bits_) > 0) { // elems_ >= length
|
|
53
|
+
// Since each cache entry is fairly large, we aim for a small
|
|
54
|
+
// average linked list length (<= 1).
|
|
55
|
+
Resize();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return old;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
LRUHandle* LRUHandleTable::Remove(const Slice& key, uint32_t hash) {
|
|
62
|
+
LRUHandle** ptr = FindPointer(key, hash);
|
|
63
|
+
LRUHandle* result = *ptr;
|
|
64
|
+
if (result != nullptr) {
|
|
65
|
+
*ptr = result->next_hash;
|
|
66
|
+
--elems_;
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
LRUHandle** LRUHandleTable::FindPointer(const Slice& key, uint32_t hash) {
|
|
72
|
+
LRUHandle** ptr = &list_[hash >> (32 - length_bits_)];
|
|
73
|
+
while (*ptr != nullptr && ((*ptr)->hash != hash || key != (*ptr)->key())) {
|
|
74
|
+
ptr = &(*ptr)->next_hash;
|
|
75
|
+
}
|
|
76
|
+
return ptr;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void LRUHandleTable::Resize() {
|
|
80
|
+
if (length_bits_ >= max_length_bits_) {
|
|
81
|
+
// Due to reaching limit of hash information, if we made the table bigger,
|
|
82
|
+
// we would allocate more addresses but only the same number would be used.
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (length_bits_ >= 31) {
|
|
86
|
+
// Avoid undefined behavior shifting uint32_t by 32.
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
uint32_t old_length = uint32_t{1} << length_bits_;
|
|
91
|
+
int new_length_bits = length_bits_ + 1;
|
|
92
|
+
std::unique_ptr<LRUHandle* []> new_list {
|
|
93
|
+
new LRUHandle* [size_t{1} << new_length_bits] {}
|
|
94
|
+
};
|
|
95
|
+
uint32_t count = 0;
|
|
96
|
+
for (uint32_t i = 0; i < old_length; i++) {
|
|
97
|
+
LRUHandle* h = list_[i];
|
|
98
|
+
while (h != nullptr) {
|
|
99
|
+
LRUHandle* next = h->next_hash;
|
|
100
|
+
uint32_t hash = h->hash;
|
|
101
|
+
LRUHandle** ptr = &new_list[hash >> (32 - new_length_bits)];
|
|
102
|
+
h->next_hash = *ptr;
|
|
103
|
+
*ptr = h;
|
|
104
|
+
h = next;
|
|
105
|
+
count++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
assert(elems_ == count);
|
|
109
|
+
list_ = std::move(new_list);
|
|
110
|
+
length_bits_ = new_length_bits;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
LRUCacheShard::LRUCacheShard(size_t capacity, bool strict_capacity_limit,
|
|
114
|
+
CacheMetadataChargePolicy metadata_charge_policy,
|
|
115
|
+
int max_upper_hash_bits)
|
|
116
|
+
: capacity_(0),
|
|
117
|
+
strict_capacity_limit_(strict_capacity_limit),
|
|
118
|
+
table_(max_upper_hash_bits),
|
|
119
|
+
usage_(0),
|
|
120
|
+
lru_usage_(0) {
|
|
121
|
+
set_metadata_charge_policy(metadata_charge_policy);
|
|
122
|
+
// Make empty circular linked list.
|
|
123
|
+
lru_.next = &lru_;
|
|
124
|
+
lru_.prev = &lru_;
|
|
125
|
+
lru_low_pri_ = &lru_;
|
|
126
|
+
SetCapacity(capacity);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
void LRUCacheShard::EraseUnRefEntries() {
|
|
130
|
+
autovector<LRUHandle*> last_reference_list;
|
|
131
|
+
{
|
|
132
|
+
MutexLock l(&mutex_);
|
|
133
|
+
while (lru_.next != &lru_) {
|
|
134
|
+
LRUHandle* old = lru_.next;
|
|
135
|
+
// LRU list contains only elements which can be evicted.
|
|
136
|
+
assert(old->InCache() && !old->HasRefs());
|
|
137
|
+
LRU_Remove(old);
|
|
138
|
+
table_.Remove(old->key(), old->hash);
|
|
139
|
+
old->SetInCache(false);
|
|
140
|
+
size_t total_charge = old->CalcTotalCharge(metadata_charge_policy_);
|
|
141
|
+
assert(usage_ >= total_charge);
|
|
142
|
+
usage_ -= total_charge;
|
|
143
|
+
last_reference_list.push_back(old);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Free the entries here outside of mutex for performance reasons.
|
|
148
|
+
for (auto entry : last_reference_list) {
|
|
149
|
+
entry->Free();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
void LRUCacheShard::ApplyToSomeEntries(
|
|
154
|
+
const std::function<void(const Slice& key, void* value, size_t charge,
|
|
155
|
+
DeleterFn deleter)>& callback,
|
|
156
|
+
uint32_t average_entries_per_lock, uint32_t* state) {
|
|
157
|
+
// The state is essentially going to be the starting hash, which works
|
|
158
|
+
// nicely even if we resize between calls because we use upper-most
|
|
159
|
+
// hash bits for table indexes.
|
|
160
|
+
MutexLock l(&mutex_);
|
|
161
|
+
uint32_t length_bits = table_.GetLengthBits();
|
|
162
|
+
uint32_t length = uint32_t{1} << length_bits;
|
|
163
|
+
|
|
164
|
+
assert(average_entries_per_lock > 0);
|
|
165
|
+
// Assuming we are called with same average_entries_per_lock repeatedly,
|
|
166
|
+
// this simplifies some logic (index_end will not overflow).
|
|
167
|
+
assert(average_entries_per_lock < length || *state == 0);
|
|
168
|
+
|
|
169
|
+
uint32_t index_begin = *state >> (32 - length_bits);
|
|
170
|
+
uint32_t index_end = index_begin + average_entries_per_lock;
|
|
171
|
+
if (index_end >= length) {
|
|
172
|
+
// Going to end
|
|
173
|
+
index_end = length;
|
|
174
|
+
*state = UINT32_MAX;
|
|
175
|
+
} else {
|
|
176
|
+
*state = index_end << (32 - length_bits);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
table_.ApplyToEntriesRange(
|
|
180
|
+
[callback](LRUHandle* h) {
|
|
181
|
+
callback(h->key(), h->value, h->charge, h->deleter);
|
|
182
|
+
},
|
|
183
|
+
index_begin, index_end);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
void LRUCacheShard::LRU_Remove(LRUHandle* e) {
|
|
187
|
+
assert(e->next != nullptr);
|
|
188
|
+
assert(e->prev != nullptr);
|
|
189
|
+
e->next->prev = e->prev;
|
|
190
|
+
e->prev->next = e->next;
|
|
191
|
+
e->prev = e->next = nullptr;
|
|
192
|
+
size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
|
|
193
|
+
assert(lru_usage_ >= total_charge);
|
|
194
|
+
lru_usage_ -= total_charge;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
void LRUCacheShard::LRU_Insert(LRUHandle* e) {
|
|
198
|
+
assert(e->next == nullptr);
|
|
199
|
+
assert(e->prev == nullptr);
|
|
200
|
+
size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
|
|
201
|
+
// Inset "e" to head of LRU list.
|
|
202
|
+
e->next = &lru_;
|
|
203
|
+
e->prev = lru_.prev;
|
|
204
|
+
e->prev->next = e;
|
|
205
|
+
e->next->prev = e;
|
|
206
|
+
lru_usage_ += total_charge;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
void LRUCacheShard::EvictFromLRU(size_t charge,
|
|
210
|
+
autovector<LRUHandle*>* deleted) {
|
|
211
|
+
while ((usage_ + charge) > capacity_ && lru_.next != &lru_) {
|
|
212
|
+
LRUHandle* old = lru_.next;
|
|
213
|
+
// LRU list contains only elements which can be evicted.
|
|
214
|
+
assert(old->InCache() && !old->HasRefs());
|
|
215
|
+
LRU_Remove(old);
|
|
216
|
+
table_.Remove(old->key(), old->hash);
|
|
217
|
+
old->SetInCache(false);
|
|
218
|
+
size_t old_total_charge = old->CalcTotalCharge(metadata_charge_policy_);
|
|
219
|
+
assert(usage_ >= old_total_charge);
|
|
220
|
+
usage_ -= old_total_charge;
|
|
221
|
+
deleted->push_back(old);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
void LRUCacheShard::SetCapacity(size_t capacity) {
|
|
226
|
+
autovector<LRUHandle*> last_reference_list;
|
|
227
|
+
{
|
|
228
|
+
MutexLock l(&mutex_);
|
|
229
|
+
capacity_ = capacity;
|
|
230
|
+
EvictFromLRU(0, &last_reference_list);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Free the entries here outside of mutex for performance reasons.
|
|
234
|
+
for (auto entry : last_reference_list) {
|
|
235
|
+
entry->Free();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
void LRUCacheShard::SetStrictCapacityLimit(bool strict_capacity_limit) {
|
|
240
|
+
MutexLock l(&mutex_);
|
|
241
|
+
strict_capacity_limit_ = strict_capacity_limit;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
Status LRUCacheShard::InsertItem(LRUHandle* e, Cache::Handle** handle,
|
|
245
|
+
bool free_handle_on_fail) {
|
|
246
|
+
Status s = Status::OK();
|
|
247
|
+
autovector<LRUHandle*> last_reference_list;
|
|
248
|
+
size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
|
|
249
|
+
|
|
250
|
+
{
|
|
251
|
+
MutexLock l(&mutex_);
|
|
252
|
+
|
|
253
|
+
// Free the space following strict LRU policy until enough space
|
|
254
|
+
// is freed or the lru list is empty.
|
|
255
|
+
EvictFromLRU(total_charge, &last_reference_list);
|
|
256
|
+
|
|
257
|
+
if ((usage_ + total_charge) > capacity_ &&
|
|
258
|
+
(strict_capacity_limit_ || handle == nullptr)) {
|
|
259
|
+
e->SetInCache(false);
|
|
260
|
+
if (handle == nullptr) {
|
|
261
|
+
// Don't insert the entry but still return ok, as if the entry inserted
|
|
262
|
+
// into cache and get evicted immediately.
|
|
263
|
+
last_reference_list.push_back(e);
|
|
264
|
+
} else {
|
|
265
|
+
if (free_handle_on_fail) {
|
|
266
|
+
delete[] reinterpret_cast<char*>(e);
|
|
267
|
+
*handle = nullptr;
|
|
268
|
+
}
|
|
269
|
+
s = Status::Incomplete("Insert failed due to LRU cache being full.");
|
|
270
|
+
}
|
|
271
|
+
} else {
|
|
272
|
+
// Insert into the cache. Note that the cache might get larger than its
|
|
273
|
+
// capacity if not enough space was freed up.
|
|
274
|
+
LRUHandle* old = table_.Insert(e);
|
|
275
|
+
usage_ += total_charge;
|
|
276
|
+
if (old != nullptr) {
|
|
277
|
+
s = Status::OkOverwritten();
|
|
278
|
+
assert(old->InCache());
|
|
279
|
+
old->SetInCache(false);
|
|
280
|
+
if (!old->HasRefs()) {
|
|
281
|
+
// old is on LRU because it's in cache and its reference count is 0.
|
|
282
|
+
LRU_Remove(old);
|
|
283
|
+
size_t old_total_charge =
|
|
284
|
+
old->CalcTotalCharge(metadata_charge_policy_);
|
|
285
|
+
assert(usage_ >= old_total_charge);
|
|
286
|
+
usage_ -= old_total_charge;
|
|
287
|
+
last_reference_list.push_back(old);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (handle == nullptr) {
|
|
291
|
+
LRU_Insert(e);
|
|
292
|
+
} else {
|
|
293
|
+
// If caller already holds a ref, no need to take one here.
|
|
294
|
+
if (!e->HasRefs()) {
|
|
295
|
+
e->Ref();
|
|
296
|
+
}
|
|
297
|
+
*handle = reinterpret_cast<Cache::Handle*>(e);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Free the entries here outside of mutex for performance reasons.
|
|
303
|
+
for (auto entry : last_reference_list) {
|
|
304
|
+
entry->Free();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return s;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
Cache::Handle* LRUCacheShard::Lookup(const Slice& key, uint32_t hash) {
|
|
311
|
+
LRUHandle* e = nullptr;
|
|
312
|
+
{
|
|
313
|
+
MutexLock l(&mutex_);
|
|
314
|
+
e = table_.Lookup(key, hash);
|
|
315
|
+
if (e != nullptr) {
|
|
316
|
+
assert(e->InCache());
|
|
317
|
+
if (!e->HasRefs()) {
|
|
318
|
+
// The entry is in LRU since it's in hash and has no external references
|
|
319
|
+
LRU_Remove(e);
|
|
320
|
+
}
|
|
321
|
+
e->Ref();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return reinterpret_cast<Cache::Handle*>(e);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
bool LRUCacheShard::Ref(Cache::Handle* h) {
|
|
328
|
+
LRUHandle* e = reinterpret_cast<LRUHandle*>(h);
|
|
329
|
+
MutexLock l(&mutex_);
|
|
330
|
+
// To create another reference - entry must be already externally referenced.
|
|
331
|
+
assert(e->HasRefs());
|
|
332
|
+
e->Ref();
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
bool LRUCacheShard::Release(Cache::Handle* handle, bool erase_if_last_ref) {
|
|
337
|
+
if (handle == nullptr) {
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
LRUHandle* e = reinterpret_cast<LRUHandle*>(handle);
|
|
341
|
+
bool last_reference = false;
|
|
342
|
+
{
|
|
343
|
+
MutexLock l(&mutex_);
|
|
344
|
+
last_reference = e->Unref();
|
|
345
|
+
if (last_reference && e->InCache()) {
|
|
346
|
+
// The item is still in cache, and nobody else holds a reference to it.
|
|
347
|
+
if (usage_ > capacity_ || erase_if_last_ref) {
|
|
348
|
+
// The LRU list must be empty since the cache is full.
|
|
349
|
+
assert(lru_.next == &lru_ || erase_if_last_ref);
|
|
350
|
+
// Take this opportunity and remove the item.
|
|
351
|
+
table_.Remove(e->key(), e->hash);
|
|
352
|
+
e->SetInCache(false);
|
|
353
|
+
} else {
|
|
354
|
+
// Put the item back on the LRU list, and don't free it.
|
|
355
|
+
LRU_Insert(e);
|
|
356
|
+
last_reference = false;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// If it was the last reference, then decrement the cache usage.
|
|
360
|
+
if (last_reference) {
|
|
361
|
+
size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
|
|
362
|
+
assert(usage_ >= total_charge);
|
|
363
|
+
usage_ -= total_charge;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Free the entry here outside of mutex for performance reasons.
|
|
368
|
+
if (last_reference) {
|
|
369
|
+
e->Free();
|
|
370
|
+
}
|
|
371
|
+
return last_reference;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
Status LRUCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
|
|
375
|
+
size_t charge, Cache::DeleterFn deleter,
|
|
376
|
+
Cache::Handle** handle,
|
|
377
|
+
Cache::Priority /*priority*/) {
|
|
378
|
+
// Allocate the memory here outside of the mutex.
|
|
379
|
+
// If the cache is full, we'll have to release it.
|
|
380
|
+
// It shouldn't happen very often though.
|
|
381
|
+
LRUHandle* e = reinterpret_cast<LRUHandle*>(
|
|
382
|
+
new char[sizeof(LRUHandle) - 1 + key.size()]);
|
|
383
|
+
|
|
384
|
+
e->value = value;
|
|
385
|
+
e->flags = 0;
|
|
386
|
+
e->deleter = deleter;
|
|
387
|
+
e->charge = charge;
|
|
388
|
+
e->key_length = key.size();
|
|
389
|
+
e->hash = hash;
|
|
390
|
+
e->refs = 0;
|
|
391
|
+
e->next = e->prev = nullptr;
|
|
392
|
+
e->SetInCache(true);
|
|
393
|
+
memcpy(e->key_data, key.data(), key.size());
|
|
394
|
+
|
|
395
|
+
return InsertItem(e, handle, /* free_handle_on_fail */ true);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
void LRUCacheShard::Erase(const Slice& key, uint32_t hash) {
|
|
399
|
+
LRUHandle* e;
|
|
400
|
+
bool last_reference = false;
|
|
401
|
+
{
|
|
402
|
+
MutexLock l(&mutex_);
|
|
403
|
+
e = table_.Remove(key, hash);
|
|
404
|
+
if (e != nullptr) {
|
|
405
|
+
assert(e->InCache());
|
|
406
|
+
e->SetInCache(false);
|
|
407
|
+
if (!e->HasRefs()) {
|
|
408
|
+
// The entry is in LRU since it's in hash and has no external references
|
|
409
|
+
LRU_Remove(e);
|
|
410
|
+
size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
|
|
411
|
+
assert(usage_ >= total_charge);
|
|
412
|
+
usage_ -= total_charge;
|
|
413
|
+
last_reference = true;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Free the entry here outside of mutex for performance reasons.
|
|
419
|
+
// last_reference will only be true if e != nullptr.
|
|
420
|
+
if (last_reference) {
|
|
421
|
+
e->Free();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
size_t LRUCacheShard::GetUsage() const {
|
|
426
|
+
MutexLock l(&mutex_);
|
|
427
|
+
return usage_;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
size_t LRUCacheShard::GetPinnedUsage() const {
|
|
431
|
+
MutexLock l(&mutex_);
|
|
432
|
+
assert(usage_ >= lru_usage_);
|
|
433
|
+
return usage_ - lru_usage_;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
std::string LRUCacheShard::GetPrintableOptions() const { return std::string{}; }
|
|
437
|
+
|
|
438
|
+
LRUCache::LRUCache(size_t capacity, int num_shard_bits,
|
|
439
|
+
bool strict_capacity_limit,
|
|
440
|
+
CacheMetadataChargePolicy metadata_charge_policy)
|
|
441
|
+
: ShardedCache(capacity, num_shard_bits, strict_capacity_limit) {
|
|
442
|
+
num_shards_ = 1 << num_shard_bits;
|
|
443
|
+
shards_ = reinterpret_cast<LRUCacheShard*>(
|
|
444
|
+
port::cacheline_aligned_alloc(sizeof(LRUCacheShard) * num_shards_));
|
|
445
|
+
size_t per_shard = (capacity + (num_shards_ - 1)) / num_shards_;
|
|
446
|
+
for (int i = 0; i < num_shards_; i++) {
|
|
447
|
+
new (&shards_[i])
|
|
448
|
+
LRUCacheShard(per_shard, strict_capacity_limit, metadata_charge_policy,
|
|
449
|
+
/* max_upper_hash_bits */ 32 - num_shard_bits);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
LRUCache::~LRUCache() {
|
|
454
|
+
if (shards_ != nullptr) {
|
|
455
|
+
assert(num_shards_ > 0);
|
|
456
|
+
for (int i = 0; i < num_shards_; i++) {
|
|
457
|
+
shards_[i].~LRUCacheShard();
|
|
458
|
+
}
|
|
459
|
+
port::cacheline_aligned_free(shards_);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
CacheShard* LRUCache::GetShard(uint32_t shard) {
|
|
464
|
+
return reinterpret_cast<CacheShard*>(&shards_[shard]);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
const CacheShard* LRUCache::GetShard(uint32_t shard) const {
|
|
468
|
+
return reinterpret_cast<CacheShard*>(&shards_[shard]);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
void* LRUCache::Value(Handle* handle) {
|
|
472
|
+
return reinterpret_cast<const LRUHandle*>(handle)->value;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
size_t LRUCache::GetCharge(Handle* handle) const {
|
|
476
|
+
return reinterpret_cast<const LRUHandle*>(handle)->charge;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
Cache::DeleterFn LRUCache::GetDeleter(Handle* handle) const {
|
|
480
|
+
auto h = reinterpret_cast<const LRUHandle*>(handle);
|
|
481
|
+
return h->deleter;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
uint32_t LRUCache::GetHash(Handle* handle) const {
|
|
485
|
+
return reinterpret_cast<const LRUHandle*>(handle)->hash;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
void LRUCache::DisownData() {
|
|
489
|
+
// Leak data only if that won't generate an ASAN/valgrind warning.
|
|
490
|
+
if (!kMustFreeHeapAllocations) {
|
|
491
|
+
shards_ = nullptr;
|
|
492
|
+
num_shards_ = 0;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
} // namespace fast_lru_cache
|
|
497
|
+
|
|
498
|
+
std::shared_ptr<Cache> NewFastLRUCache(
|
|
499
|
+
size_t capacity, int num_shard_bits, bool strict_capacity_limit,
|
|
500
|
+
CacheMetadataChargePolicy metadata_charge_policy) {
|
|
501
|
+
if (num_shard_bits >= 20) {
|
|
502
|
+
return nullptr; // The cache cannot be sharded into too many fine pieces.
|
|
503
|
+
}
|
|
504
|
+
if (num_shard_bits < 0) {
|
|
505
|
+
num_shard_bits = GetDefaultCacheShardBits(capacity);
|
|
506
|
+
}
|
|
507
|
+
return std::make_shared<fast_lru_cache::LRUCache>(
|
|
508
|
+
capacity, num_shard_bits, strict_capacity_limit, metadata_charge_policy);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
} // namespace ROCKSDB_NAMESPACE
|