@nxtedition/rocksdb 8.2.7 → 9.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/deps/rocksdb/rocksdb/CMakeLists.txt +7 -1
- package/deps/rocksdb/rocksdb/Makefile +22 -19
- package/deps/rocksdb/rocksdb/TARGETS +8 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +157 -61
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +43 -92
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +632 -455
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +244 -149
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +41 -13
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +11 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +216 -17
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +279 -199
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +159 -8
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +28 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -0
- package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +3 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +18 -21
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/builder.cc +32 -7
- package/deps/rocksdb/rocksdb/db/c.cc +169 -6
- package/deps/rocksdb/rocksdb/db/c_test.c +104 -6
- package/deps/rocksdb/rocksdb/db/column_family.cc +98 -47
- package/deps/rocksdb/rocksdb/db/column_family.h +25 -2
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +213 -2
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +93 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +33 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +107 -43
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +25 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +13 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +29 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +24 -31
- package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +19 -19
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
- package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -3
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +15 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +666 -44
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +274 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +40 -19
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +250 -116
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +51 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +354 -96
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +26 -13
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +61 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -87
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +7 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +39 -29
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +106 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +12 -3
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +279 -166
- package/deps/rocksdb/rocksdb/db/db_test.cc +48 -21
- package/deps/rocksdb/rocksdb/db/db_test2.cc +81 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +40 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +13 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +233 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +143 -0
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/error_handler.cc +16 -0
- package/deps/rocksdb/rocksdb/db/error_handler.h +6 -3
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -4
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
- package/deps/rocksdb/rocksdb/db/flush_job.cc +101 -11
- package/deps/rocksdb/rocksdb/db/flush_job.h +24 -1
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +88 -11
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
- package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +52 -13
- package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +44 -10
- package/deps/rocksdb/rocksdb/db/memtable_list.h +32 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +90 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +21 -4
- package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/table_cache.cc +44 -35
- package/deps/rocksdb/rocksdb/db/table_cache.h +6 -6
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
- package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
- package/deps/rocksdb/rocksdb/db/version_edit.h +48 -6
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +136 -41
- package/deps/rocksdb/rocksdb/db/version_set.h +28 -7
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +25 -15
- package/deps/rocksdb/rocksdb/db/write_batch.cc +11 -0
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +22 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +32 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +7 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -120
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +9 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +13 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +15 -27
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +264 -69
- package/deps/rocksdb/rocksdb/env/env.cc +1 -2
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
- package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +78 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +52 -43
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +34 -18
- package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
- package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +724 -79
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +64 -33
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +153 -88
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +70 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +50 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +16 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +55 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +32 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +90 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +85 -17
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +13 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +21 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +33 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -0
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +16 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +10 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/options/db_options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
- package/deps/rocksdb/rocksdb/options/options.cc +15 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +11 -3
- package/deps/rocksdb/rocksdb/options/options_test.cc +8 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +27 -12
- package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
- package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +115 -42
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +60 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +62 -44
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +36 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -15
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -21
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +11 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +195 -55
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +27 -12
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +9 -6
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +11 -11
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -0
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/table/format.cc +175 -33
- package/deps/rocksdb/rocksdb/table/format.h +63 -10
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
- package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +12 -3
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +26 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
- package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +65 -26
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +8 -5
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
- package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
- package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
- package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
- package/deps/rocksdb/rocksdb/util/cast_util.h +14 -0
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +29 -7
- package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
- package/deps/rocksdb/rocksdb/util/compression.h +110 -32
- package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
- package/deps/rocksdb/rocksdb/util/hash.h +7 -3
- package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
- package/deps/rocksdb/rocksdb/util/math.h +58 -6
- package/deps/rocksdb/rocksdb/util/math128.h +29 -7
- package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
- package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
- package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
- package/deps/rocksdb/rocksdb/util/thread_operation.h +8 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +343 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +173 -1
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +447 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +69 -25
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +231 -33
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +40 -23
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +13 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +41 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +71 -24
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +39 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +14 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
- package/deps/rocksdb/rocksdb.gyp +2 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -371,11 +371,12 @@ TEST_F(LRUCacheTest, EntriesWithPriority) {
|
|
|
371
371
|
|
|
372
372
|
namespace clock_cache {
|
|
373
373
|
|
|
374
|
+
template <class ClockCache>
|
|
374
375
|
class ClockCacheTest : public testing::Test {
|
|
375
376
|
public:
|
|
376
|
-
using Shard =
|
|
377
|
-
using Table =
|
|
378
|
-
using
|
|
377
|
+
using Shard = typename ClockCache::Shard;
|
|
378
|
+
using Table = typename Shard::Table;
|
|
379
|
+
using TableOpts = typename Table::Opts;
|
|
379
380
|
|
|
380
381
|
ClockCacheTest() {}
|
|
381
382
|
~ClockCacheTest() override { DeleteShard(); }
|
|
@@ -393,8 +394,7 @@ class ClockCacheTest : public testing::Test {
|
|
|
393
394
|
shard_ =
|
|
394
395
|
reinterpret_cast<Shard*>(port::cacheline_aligned_alloc(sizeof(Shard)));
|
|
395
396
|
|
|
396
|
-
|
|
397
|
-
opts.estimated_value_size = 1;
|
|
397
|
+
TableOpts opts{1 /*value_size*/};
|
|
398
398
|
new (shard_)
|
|
399
399
|
Shard(capacity, strict_capacity_limit, kDontChargeCacheMetadata,
|
|
400
400
|
/*allocator*/ nullptr, &eviction_callback_, &hash_seed_, opts);
|
|
@@ -458,43 +458,53 @@ class ClockCacheTest : public testing::Test {
|
|
|
458
458
|
uint32_t hash_seed_ = 0;
|
|
459
459
|
};
|
|
460
460
|
|
|
461
|
-
|
|
462
|
-
|
|
461
|
+
using ClockCacheTypes =
|
|
462
|
+
::testing::Types<AutoHyperClockCache, FixedHyperClockCache>;
|
|
463
|
+
TYPED_TEST_CASE(ClockCacheTest, ClockCacheTypes);
|
|
464
|
+
|
|
465
|
+
TYPED_TEST(ClockCacheTest, Misc) {
|
|
466
|
+
this->NewShard(3);
|
|
467
|
+
// NOTE: templated base class prevents simple naming of inherited members,
|
|
468
|
+
// so lots of `this->`
|
|
469
|
+
auto& shard = *this->shard_;
|
|
463
470
|
|
|
464
471
|
// Key size stuff
|
|
465
|
-
EXPECT_OK(InsertWithLen('a', 16));
|
|
466
|
-
EXPECT_NOK(InsertWithLen('b', 15));
|
|
467
|
-
EXPECT_OK(InsertWithLen('b', 16));
|
|
468
|
-
EXPECT_NOK(InsertWithLen('c', 17));
|
|
469
|
-
EXPECT_NOK(InsertWithLen('d', 1000));
|
|
470
|
-
EXPECT_NOK(InsertWithLen('e', 11));
|
|
471
|
-
EXPECT_NOK(InsertWithLen('f', 0));
|
|
472
|
+
EXPECT_OK(this->InsertWithLen('a', 16));
|
|
473
|
+
EXPECT_NOK(this->InsertWithLen('b', 15));
|
|
474
|
+
EXPECT_OK(this->InsertWithLen('b', 16));
|
|
475
|
+
EXPECT_NOK(this->InsertWithLen('c', 17));
|
|
476
|
+
EXPECT_NOK(this->InsertWithLen('d', 1000));
|
|
477
|
+
EXPECT_NOK(this->InsertWithLen('e', 11));
|
|
478
|
+
EXPECT_NOK(this->InsertWithLen('f', 0));
|
|
472
479
|
|
|
473
480
|
// Some of this is motivated by code coverage
|
|
474
481
|
std::string wrong_size_key(15, 'x');
|
|
475
|
-
EXPECT_FALSE(Lookup(wrong_size_key, TestHashedKey('x')));
|
|
476
|
-
EXPECT_FALSE(
|
|
477
|
-
EXPECT_FALSE(
|
|
478
|
-
|
|
482
|
+
EXPECT_FALSE(this->Lookup(wrong_size_key, this->TestHashedKey('x')));
|
|
483
|
+
EXPECT_FALSE(shard.Ref(nullptr));
|
|
484
|
+
EXPECT_FALSE(shard.Release(nullptr));
|
|
485
|
+
shard.Erase(wrong_size_key, this->TestHashedKey('x')); // no-op
|
|
479
486
|
}
|
|
480
487
|
|
|
481
|
-
|
|
482
|
-
constexpr size_t kCapacity =
|
|
483
|
-
NewShard(kCapacity, false /*strict_capacity_limit*/);
|
|
488
|
+
TYPED_TEST(ClockCacheTest, Limits) {
|
|
489
|
+
constexpr size_t kCapacity = 64;
|
|
490
|
+
this->NewShard(kCapacity, false /*strict_capacity_limit*/);
|
|
491
|
+
auto& shard = *this->shard_;
|
|
492
|
+
using HandleImpl = typename ClockCacheTest<TypeParam>::Shard::HandleImpl;
|
|
493
|
+
|
|
484
494
|
for (bool strict_capacity_limit : {false, true, false}) {
|
|
485
495
|
SCOPED_TRACE("strict_capacity_limit = " +
|
|
486
496
|
std::to_string(strict_capacity_limit));
|
|
487
497
|
|
|
488
498
|
// Also tests switching between strict limit and not
|
|
489
|
-
|
|
499
|
+
shard.SetStrictCapacityLimit(strict_capacity_limit);
|
|
490
500
|
|
|
491
|
-
UniqueId64x2 hkey = TestHashedKey('x');
|
|
501
|
+
UniqueId64x2 hkey = this->TestHashedKey('x');
|
|
492
502
|
|
|
493
503
|
// Single entry charge beyond capacity
|
|
494
504
|
{
|
|
495
|
-
Status s =
|
|
496
|
-
|
|
497
|
-
|
|
505
|
+
Status s = shard.Insert(this->TestKey(hkey), hkey, nullptr /*value*/,
|
|
506
|
+
&kNoopCacheItemHelper, kCapacity + 2 /*charge*/,
|
|
507
|
+
nullptr /*handle*/, Cache::Priority::LOW);
|
|
498
508
|
if (strict_capacity_limit) {
|
|
499
509
|
EXPECT_TRUE(s.IsMemoryLimit());
|
|
500
510
|
} else {
|
|
@@ -505,11 +515,11 @@ TEST_F(ClockCacheTest, Limits) {
|
|
|
505
515
|
// Single entry fills capacity
|
|
506
516
|
{
|
|
507
517
|
HandleImpl* h;
|
|
508
|
-
ASSERT_OK(
|
|
509
|
-
|
|
510
|
-
|
|
518
|
+
ASSERT_OK(shard.Insert(this->TestKey(hkey), hkey, nullptr /*value*/,
|
|
519
|
+
&kNoopCacheItemHelper, kCapacity /*charge*/, &h,
|
|
520
|
+
Cache::Priority::LOW));
|
|
511
521
|
// Try to insert more
|
|
512
|
-
Status s = Insert('a');
|
|
522
|
+
Status s = this->Insert('a');
|
|
513
523
|
if (strict_capacity_limit) {
|
|
514
524
|
EXPECT_TRUE(s.IsMemoryLimit());
|
|
515
525
|
} else {
|
|
@@ -517,22 +527,22 @@ TEST_F(ClockCacheTest, Limits) {
|
|
|
517
527
|
}
|
|
518
528
|
// Release entry filling capacity.
|
|
519
529
|
// Cover useful = false case.
|
|
520
|
-
|
|
530
|
+
shard.Release(h, false /*useful*/, false /*erase_if_last_ref*/);
|
|
521
531
|
}
|
|
522
532
|
|
|
523
533
|
// Insert more than table size can handle to exceed occupancy limit.
|
|
524
534
|
// (Cleverly using mostly zero-charge entries, but some non-zero to
|
|
525
535
|
// verify usage tracking on detached entries.)
|
|
526
536
|
{
|
|
527
|
-
size_t n =
|
|
537
|
+
size_t n = shard.GetTableAddressCount() + 1;
|
|
528
538
|
std::unique_ptr<HandleImpl* []> ha { new HandleImpl* [n] {} };
|
|
529
539
|
Status s;
|
|
530
540
|
for (size_t i = 0; i < n && s.ok(); ++i) {
|
|
531
541
|
hkey[1] = i;
|
|
532
|
-
s =
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
542
|
+
s = shard.Insert(this->TestKey(hkey), hkey, nullptr /*value*/,
|
|
543
|
+
&kNoopCacheItemHelper,
|
|
544
|
+
(i + kCapacity < n) ? 0 : 1 /*charge*/, &ha[i],
|
|
545
|
+
Cache::Priority::LOW);
|
|
536
546
|
if (i == 0) {
|
|
537
547
|
EXPECT_OK(s);
|
|
538
548
|
}
|
|
@@ -543,7 +553,7 @@ TEST_F(ClockCacheTest, Limits) {
|
|
|
543
553
|
EXPECT_OK(s);
|
|
544
554
|
}
|
|
545
555
|
// Same result if not keeping a reference
|
|
546
|
-
s = Insert('a');
|
|
556
|
+
s = this->Insert('a');
|
|
547
557
|
if (strict_capacity_limit) {
|
|
548
558
|
EXPECT_TRUE(s.IsMemoryLimit());
|
|
549
559
|
} else {
|
|
@@ -551,122 +561,123 @@ TEST_F(ClockCacheTest, Limits) {
|
|
|
551
561
|
}
|
|
552
562
|
|
|
553
563
|
// Regardless, we didn't allow table to actually get full
|
|
554
|
-
EXPECT_LT(
|
|
564
|
+
EXPECT_LT(shard.GetOccupancyCount(), shard.GetTableAddressCount());
|
|
555
565
|
|
|
556
566
|
// Release handles
|
|
557
567
|
for (size_t i = 0; i < n; ++i) {
|
|
558
568
|
if (ha[i]) {
|
|
559
|
-
|
|
569
|
+
shard.Release(ha[i]);
|
|
560
570
|
}
|
|
561
571
|
}
|
|
562
572
|
}
|
|
563
573
|
}
|
|
564
574
|
}
|
|
565
575
|
|
|
566
|
-
|
|
576
|
+
TYPED_TEST(ClockCacheTest, ClockEvictionTest) {
|
|
567
577
|
for (bool strict_capacity_limit : {false, true}) {
|
|
568
578
|
SCOPED_TRACE("strict_capacity_limit = " +
|
|
569
579
|
std::to_string(strict_capacity_limit));
|
|
570
580
|
|
|
571
|
-
NewShard(6, strict_capacity_limit);
|
|
572
|
-
|
|
573
|
-
EXPECT_OK(Insert('
|
|
574
|
-
EXPECT_OK(Insert('
|
|
575
|
-
EXPECT_OK(Insert('
|
|
576
|
-
EXPECT_OK(Insert('
|
|
577
|
-
EXPECT_OK(Insert('
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
EXPECT_TRUE(Lookup('
|
|
581
|
-
EXPECT_TRUE(Lookup('
|
|
582
|
-
EXPECT_TRUE(Lookup('
|
|
583
|
-
EXPECT_TRUE(Lookup('
|
|
584
|
-
EXPECT_TRUE(Lookup('
|
|
581
|
+
this->NewShard(6, strict_capacity_limit);
|
|
582
|
+
auto& shard = *this->shard_;
|
|
583
|
+
EXPECT_OK(this->Insert('a', Cache::Priority::BOTTOM));
|
|
584
|
+
EXPECT_OK(this->Insert('b', Cache::Priority::LOW));
|
|
585
|
+
EXPECT_OK(this->Insert('c', Cache::Priority::HIGH));
|
|
586
|
+
EXPECT_OK(this->Insert('d', Cache::Priority::BOTTOM));
|
|
587
|
+
EXPECT_OK(this->Insert('e', Cache::Priority::LOW));
|
|
588
|
+
EXPECT_OK(this->Insert('f', Cache::Priority::HIGH));
|
|
589
|
+
|
|
590
|
+
EXPECT_TRUE(this->Lookup('a', /*use*/ false));
|
|
591
|
+
EXPECT_TRUE(this->Lookup('b', /*use*/ false));
|
|
592
|
+
EXPECT_TRUE(this->Lookup('c', /*use*/ false));
|
|
593
|
+
EXPECT_TRUE(this->Lookup('d', /*use*/ false));
|
|
594
|
+
EXPECT_TRUE(this->Lookup('e', /*use*/ false));
|
|
595
|
+
EXPECT_TRUE(this->Lookup('f', /*use*/ false));
|
|
585
596
|
|
|
586
597
|
// Ensure bottom are evicted first, even if new entries are low
|
|
587
|
-
EXPECT_OK(Insert('g', Cache::Priority::LOW));
|
|
588
|
-
EXPECT_OK(Insert('h', Cache::Priority::LOW));
|
|
589
|
-
|
|
590
|
-
EXPECT_FALSE(Lookup('a', /*use*/ false));
|
|
591
|
-
EXPECT_TRUE(Lookup('b', /*use*/ false));
|
|
592
|
-
EXPECT_TRUE(Lookup('c', /*use*/ false));
|
|
593
|
-
EXPECT_FALSE(Lookup('d', /*use*/ false));
|
|
594
|
-
EXPECT_TRUE(Lookup('e', /*use*/ false));
|
|
595
|
-
EXPECT_TRUE(Lookup('f', /*use*/ false));
|
|
598
|
+
EXPECT_OK(this->Insert('g', Cache::Priority::LOW));
|
|
599
|
+
EXPECT_OK(this->Insert('h', Cache::Priority::LOW));
|
|
600
|
+
|
|
601
|
+
EXPECT_FALSE(this->Lookup('a', /*use*/ false));
|
|
602
|
+
EXPECT_TRUE(this->Lookup('b', /*use*/ false));
|
|
603
|
+
EXPECT_TRUE(this->Lookup('c', /*use*/ false));
|
|
604
|
+
EXPECT_FALSE(this->Lookup('d', /*use*/ false));
|
|
605
|
+
EXPECT_TRUE(this->Lookup('e', /*use*/ false));
|
|
606
|
+
EXPECT_TRUE(this->Lookup('f', /*use*/ false));
|
|
596
607
|
// Mark g & h useful
|
|
597
|
-
EXPECT_TRUE(Lookup('g', /*use*/ true));
|
|
598
|
-
EXPECT_TRUE(Lookup('h', /*use*/ true));
|
|
608
|
+
EXPECT_TRUE(this->Lookup('g', /*use*/ true));
|
|
609
|
+
EXPECT_TRUE(this->Lookup('h', /*use*/ true));
|
|
599
610
|
|
|
600
611
|
// Then old LOW entries
|
|
601
|
-
EXPECT_OK(Insert('i', Cache::Priority::LOW));
|
|
602
|
-
EXPECT_OK(Insert('j', Cache::Priority::LOW));
|
|
612
|
+
EXPECT_OK(this->Insert('i', Cache::Priority::LOW));
|
|
613
|
+
EXPECT_OK(this->Insert('j', Cache::Priority::LOW));
|
|
603
614
|
|
|
604
|
-
EXPECT_FALSE(Lookup('b', /*use*/ false));
|
|
605
|
-
EXPECT_TRUE(Lookup('c', /*use*/ false));
|
|
606
|
-
EXPECT_FALSE(Lookup('e', /*use*/ false));
|
|
607
|
-
EXPECT_TRUE(Lookup('f', /*use*/ false));
|
|
615
|
+
EXPECT_FALSE(this->Lookup('b', /*use*/ false));
|
|
616
|
+
EXPECT_TRUE(this->Lookup('c', /*use*/ false));
|
|
617
|
+
EXPECT_FALSE(this->Lookup('e', /*use*/ false));
|
|
618
|
+
EXPECT_TRUE(this->Lookup('f', /*use*/ false));
|
|
608
619
|
// Mark g & h useful once again
|
|
609
|
-
EXPECT_TRUE(Lookup('g', /*use*/ true));
|
|
610
|
-
EXPECT_TRUE(Lookup('h', /*use*/ true));
|
|
611
|
-
EXPECT_TRUE(Lookup('i', /*use*/ false));
|
|
612
|
-
EXPECT_TRUE(Lookup('j', /*use*/ false));
|
|
620
|
+
EXPECT_TRUE(this->Lookup('g', /*use*/ true));
|
|
621
|
+
EXPECT_TRUE(this->Lookup('h', /*use*/ true));
|
|
622
|
+
EXPECT_TRUE(this->Lookup('i', /*use*/ false));
|
|
623
|
+
EXPECT_TRUE(this->Lookup('j', /*use*/ false));
|
|
613
624
|
|
|
614
625
|
// Then old HIGH entries
|
|
615
|
-
EXPECT_OK(Insert('k', Cache::Priority::LOW));
|
|
616
|
-
EXPECT_OK(Insert('l', Cache::Priority::LOW));
|
|
617
|
-
|
|
618
|
-
EXPECT_FALSE(Lookup('c', /*use*/ false));
|
|
619
|
-
EXPECT_FALSE(Lookup('f', /*use*/ false));
|
|
620
|
-
EXPECT_TRUE(Lookup('g', /*use*/ false));
|
|
621
|
-
EXPECT_TRUE(Lookup('h', /*use*/ false));
|
|
622
|
-
EXPECT_TRUE(Lookup('i', /*use*/ false));
|
|
623
|
-
EXPECT_TRUE(Lookup('j', /*use*/ false));
|
|
624
|
-
EXPECT_TRUE(Lookup('k', /*use*/ false));
|
|
625
|
-
EXPECT_TRUE(Lookup('l', /*use*/ false));
|
|
626
|
+
EXPECT_OK(this->Insert('k', Cache::Priority::LOW));
|
|
627
|
+
EXPECT_OK(this->Insert('l', Cache::Priority::LOW));
|
|
628
|
+
|
|
629
|
+
EXPECT_FALSE(this->Lookup('c', /*use*/ false));
|
|
630
|
+
EXPECT_FALSE(this->Lookup('f', /*use*/ false));
|
|
631
|
+
EXPECT_TRUE(this->Lookup('g', /*use*/ false));
|
|
632
|
+
EXPECT_TRUE(this->Lookup('h', /*use*/ false));
|
|
633
|
+
EXPECT_TRUE(this->Lookup('i', /*use*/ false));
|
|
634
|
+
EXPECT_TRUE(this->Lookup('j', /*use*/ false));
|
|
635
|
+
EXPECT_TRUE(this->Lookup('k', /*use*/ false));
|
|
636
|
+
EXPECT_TRUE(this->Lookup('l', /*use*/ false));
|
|
626
637
|
|
|
627
638
|
// Then the (roughly) least recently useful
|
|
628
|
-
EXPECT_OK(Insert('m', Cache::Priority::HIGH));
|
|
629
|
-
EXPECT_OK(Insert('n', Cache::Priority::HIGH));
|
|
639
|
+
EXPECT_OK(this->Insert('m', Cache::Priority::HIGH));
|
|
640
|
+
EXPECT_OK(this->Insert('n', Cache::Priority::HIGH));
|
|
630
641
|
|
|
631
|
-
EXPECT_TRUE(Lookup('g', /*use*/ false));
|
|
632
|
-
EXPECT_TRUE(Lookup('h', /*use*/ false));
|
|
633
|
-
EXPECT_FALSE(Lookup('i', /*use*/ false));
|
|
634
|
-
EXPECT_FALSE(Lookup('j', /*use*/ false));
|
|
635
|
-
EXPECT_TRUE(Lookup('k', /*use*/ false));
|
|
636
|
-
EXPECT_TRUE(Lookup('l', /*use*/ false));
|
|
642
|
+
EXPECT_TRUE(this->Lookup('g', /*use*/ false));
|
|
643
|
+
EXPECT_TRUE(this->Lookup('h', /*use*/ false));
|
|
644
|
+
EXPECT_FALSE(this->Lookup('i', /*use*/ false));
|
|
645
|
+
EXPECT_FALSE(this->Lookup('j', /*use*/ false));
|
|
646
|
+
EXPECT_TRUE(this->Lookup('k', /*use*/ false));
|
|
647
|
+
EXPECT_TRUE(this->Lookup('l', /*use*/ false));
|
|
637
648
|
|
|
638
649
|
// Now try changing capacity down
|
|
639
|
-
|
|
650
|
+
shard.SetCapacity(4);
|
|
640
651
|
// Insert to ensure evictions happen
|
|
641
|
-
EXPECT_OK(Insert('o', Cache::Priority::LOW));
|
|
642
|
-
EXPECT_OK(Insert('p', Cache::Priority::LOW));
|
|
643
|
-
|
|
644
|
-
EXPECT_FALSE(Lookup('g', /*use*/ false));
|
|
645
|
-
EXPECT_FALSE(Lookup('h', /*use*/ false));
|
|
646
|
-
EXPECT_FALSE(Lookup('k', /*use*/ false));
|
|
647
|
-
EXPECT_FALSE(Lookup('l', /*use*/ false));
|
|
648
|
-
EXPECT_TRUE(Lookup('m', /*use*/ false));
|
|
649
|
-
EXPECT_TRUE(Lookup('n', /*use*/ false));
|
|
650
|
-
EXPECT_TRUE(Lookup('o', /*use*/ false));
|
|
651
|
-
EXPECT_TRUE(Lookup('p', /*use*/ false));
|
|
652
|
+
EXPECT_OK(this->Insert('o', Cache::Priority::LOW));
|
|
653
|
+
EXPECT_OK(this->Insert('p', Cache::Priority::LOW));
|
|
654
|
+
|
|
655
|
+
EXPECT_FALSE(this->Lookup('g', /*use*/ false));
|
|
656
|
+
EXPECT_FALSE(this->Lookup('h', /*use*/ false));
|
|
657
|
+
EXPECT_FALSE(this->Lookup('k', /*use*/ false));
|
|
658
|
+
EXPECT_FALSE(this->Lookup('l', /*use*/ false));
|
|
659
|
+
EXPECT_TRUE(this->Lookup('m', /*use*/ false));
|
|
660
|
+
EXPECT_TRUE(this->Lookup('n', /*use*/ false));
|
|
661
|
+
EXPECT_TRUE(this->Lookup('o', /*use*/ false));
|
|
662
|
+
EXPECT_TRUE(this->Lookup('p', /*use*/ false));
|
|
652
663
|
|
|
653
664
|
// Now try changing capacity up
|
|
654
|
-
EXPECT_TRUE(Lookup('m', /*use*/ true));
|
|
655
|
-
EXPECT_TRUE(Lookup('n', /*use*/ true));
|
|
656
|
-
|
|
657
|
-
EXPECT_OK(Insert('q', Cache::Priority::HIGH));
|
|
658
|
-
EXPECT_OK(Insert('r', Cache::Priority::HIGH));
|
|
659
|
-
EXPECT_OK(Insert('s', Cache::Priority::HIGH));
|
|
660
|
-
EXPECT_OK(Insert('t', Cache::Priority::HIGH));
|
|
661
|
-
|
|
662
|
-
EXPECT_FALSE(Lookup('o', /*use*/ false));
|
|
663
|
-
EXPECT_FALSE(Lookup('p', /*use*/ false));
|
|
664
|
-
EXPECT_TRUE(Lookup('m', /*use*/ false));
|
|
665
|
-
EXPECT_TRUE(Lookup('n', /*use*/ false));
|
|
666
|
-
EXPECT_TRUE(Lookup('q', /*use*/ false));
|
|
667
|
-
EXPECT_TRUE(Lookup('r', /*use*/ false));
|
|
668
|
-
EXPECT_TRUE(Lookup('s', /*use*/ false));
|
|
669
|
-
EXPECT_TRUE(Lookup('t', /*use*/ false));
|
|
665
|
+
EXPECT_TRUE(this->Lookup('m', /*use*/ true));
|
|
666
|
+
EXPECT_TRUE(this->Lookup('n', /*use*/ true));
|
|
667
|
+
shard.SetCapacity(6);
|
|
668
|
+
EXPECT_OK(this->Insert('q', Cache::Priority::HIGH));
|
|
669
|
+
EXPECT_OK(this->Insert('r', Cache::Priority::HIGH));
|
|
670
|
+
EXPECT_OK(this->Insert('s', Cache::Priority::HIGH));
|
|
671
|
+
EXPECT_OK(this->Insert('t', Cache::Priority::HIGH));
|
|
672
|
+
|
|
673
|
+
EXPECT_FALSE(this->Lookup('o', /*use*/ false));
|
|
674
|
+
EXPECT_FALSE(this->Lookup('p', /*use*/ false));
|
|
675
|
+
EXPECT_TRUE(this->Lookup('m', /*use*/ false));
|
|
676
|
+
EXPECT_TRUE(this->Lookup('n', /*use*/ false));
|
|
677
|
+
EXPECT_TRUE(this->Lookup('q', /*use*/ false));
|
|
678
|
+
EXPECT_TRUE(this->Lookup('r', /*use*/ false));
|
|
679
|
+
EXPECT_TRUE(this->Lookup('s', /*use*/ false));
|
|
680
|
+
EXPECT_TRUE(this->Lookup('t', /*use*/ false));
|
|
670
681
|
}
|
|
671
682
|
}
|
|
672
683
|
|
|
@@ -682,113 +693,178 @@ const Cache::CacheItemHelper kDeleteCounterHelper{
|
|
|
682
693
|
} // namespace
|
|
683
694
|
|
|
684
695
|
// Testing calls to CorrectNearOverflow in Release
|
|
685
|
-
|
|
686
|
-
NewShard(6, /*strict_capacity_limit*/ false);
|
|
696
|
+
TYPED_TEST(ClockCacheTest, ClockCounterOverflowTest) {
|
|
697
|
+
this->NewShard(6, /*strict_capacity_limit*/ false);
|
|
698
|
+
auto& shard = *this->shard_;
|
|
699
|
+
using HandleImpl = typename ClockCacheTest<TypeParam>::Shard::HandleImpl;
|
|
700
|
+
|
|
687
701
|
HandleImpl* h;
|
|
688
702
|
DeleteCounter val;
|
|
689
|
-
UniqueId64x2 hkey = TestHashedKey('x');
|
|
690
|
-
ASSERT_OK(
|
|
691
|
-
|
|
703
|
+
UniqueId64x2 hkey = this->TestHashedKey('x');
|
|
704
|
+
ASSERT_OK(shard.Insert(this->TestKey(hkey), hkey, &val, &kDeleteCounterHelper,
|
|
705
|
+
1, &h, Cache::Priority::HIGH));
|
|
692
706
|
|
|
693
707
|
// Some large number outstanding
|
|
694
|
-
|
|
708
|
+
shard.TEST_RefN(h, 123456789);
|
|
695
709
|
// Simulate many lookup/ref + release, plenty to overflow counters
|
|
696
710
|
for (int i = 0; i < 10000; ++i) {
|
|
697
|
-
|
|
698
|
-
|
|
711
|
+
shard.TEST_RefN(h, 1234567);
|
|
712
|
+
shard.TEST_ReleaseN(h, 1234567);
|
|
699
713
|
}
|
|
700
714
|
// Mark it invisible (to reach a different CorrectNearOverflow() in Release)
|
|
701
|
-
|
|
715
|
+
shard.Erase(this->TestKey(hkey), hkey);
|
|
702
716
|
// Simulate many more lookup/ref + release (one-by-one would be too
|
|
703
717
|
// expensive for unit test)
|
|
704
718
|
for (int i = 0; i < 10000; ++i) {
|
|
705
|
-
|
|
706
|
-
|
|
719
|
+
shard.TEST_RefN(h, 1234567);
|
|
720
|
+
shard.TEST_ReleaseN(h, 1234567);
|
|
707
721
|
}
|
|
708
722
|
// Free all but last 1
|
|
709
|
-
|
|
723
|
+
shard.TEST_ReleaseN(h, 123456789);
|
|
710
724
|
// Still alive
|
|
711
725
|
ASSERT_EQ(val.deleted, 0);
|
|
712
726
|
// Free last ref, which will finalize erasure
|
|
713
|
-
|
|
727
|
+
shard.Release(h);
|
|
714
728
|
// Deleted
|
|
715
729
|
ASSERT_EQ(val.deleted, 1);
|
|
716
730
|
}
|
|
717
731
|
|
|
732
|
+
TYPED_TEST(ClockCacheTest, ClockTableFull) {
|
|
733
|
+
// Force clock cache table to fill up (not usually allowed) in order
|
|
734
|
+
// to test full probe sequence that is theoretically possible due to
|
|
735
|
+
// parallel operations
|
|
736
|
+
this->NewShard(6, /*strict_capacity_limit*/ false);
|
|
737
|
+
auto& shard = *this->shard_;
|
|
738
|
+
using HandleImpl = typename ClockCacheTest<TypeParam>::Shard::HandleImpl;
|
|
739
|
+
|
|
740
|
+
size_t size = shard.GetTableAddressCount();
|
|
741
|
+
ASSERT_LE(size + 3, 256); // for using char keys
|
|
742
|
+
// Modify occupancy and capacity limits to attempt insert on full
|
|
743
|
+
shard.TEST_MutableOccupancyLimit() = size + 100;
|
|
744
|
+
shard.SetCapacity(size + 100);
|
|
745
|
+
|
|
746
|
+
DeleteCounter val;
|
|
747
|
+
std::vector<HandleImpl*> handles;
|
|
748
|
+
// NOTE: the three extra insertions should create standalone entries
|
|
749
|
+
for (size_t i = 0; i < size + 3; ++i) {
|
|
750
|
+
UniqueId64x2 hkey = this->TestHashedKey(static_cast<char>(i));
|
|
751
|
+
ASSERT_OK(shard.Insert(this->TestKey(hkey), hkey, &val,
|
|
752
|
+
&kDeleteCounterHelper, 1, &handles.emplace_back(),
|
|
753
|
+
Cache::Priority::HIGH));
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
for (size_t i = 0; i < size + 3; ++i) {
|
|
757
|
+
UniqueId64x2 hkey = this->TestHashedKey(static_cast<char>(i));
|
|
758
|
+
HandleImpl* h = shard.Lookup(this->TestKey(hkey), hkey);
|
|
759
|
+
if (i < size) {
|
|
760
|
+
ASSERT_NE(h, nullptr);
|
|
761
|
+
shard.Release(h);
|
|
762
|
+
} else {
|
|
763
|
+
// Standalone entries not visible by lookup
|
|
764
|
+
ASSERT_EQ(h, nullptr);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
for (size_t i = 0; i < size + 3; ++i) {
|
|
769
|
+
ASSERT_NE(handles[i], nullptr);
|
|
770
|
+
shard.Release(handles[i]);
|
|
771
|
+
if (i < size) {
|
|
772
|
+
// Everything still in cache
|
|
773
|
+
ASSERT_EQ(val.deleted, 0);
|
|
774
|
+
} else {
|
|
775
|
+
// Standalone entries freed on release
|
|
776
|
+
ASSERT_EQ(val.deleted, i + 1 - size);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
for (size_t i = size + 3; i > 0; --i) {
|
|
781
|
+
UniqueId64x2 hkey = this->TestHashedKey(static_cast<char>(i - 1));
|
|
782
|
+
shard.Erase(this->TestKey(hkey), hkey);
|
|
783
|
+
if (i - 1 > size) {
|
|
784
|
+
ASSERT_EQ(val.deleted, 3);
|
|
785
|
+
} else {
|
|
786
|
+
ASSERT_EQ(val.deleted, 3 + size - (i - 1));
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
718
791
|
// This test is mostly to exercise some corner case logic, by forcing two
|
|
719
792
|
// keys to have the same hash, and more
|
|
720
|
-
|
|
721
|
-
NewShard(6, /*strict_capacity_limit*/ false);
|
|
793
|
+
TYPED_TEST(ClockCacheTest, CollidingInsertEraseTest) {
|
|
794
|
+
this->NewShard(6, /*strict_capacity_limit*/ false);
|
|
795
|
+
auto& shard = *this->shard_;
|
|
796
|
+
using HandleImpl = typename ClockCacheTest<TypeParam>::Shard::HandleImpl;
|
|
797
|
+
|
|
722
798
|
DeleteCounter val;
|
|
723
|
-
UniqueId64x2 hkey1 = TestHashedKey('x');
|
|
724
|
-
Slice key1 = TestKey(hkey1);
|
|
725
|
-
UniqueId64x2 hkey2 = TestHashedKey('y');
|
|
726
|
-
Slice key2 = TestKey(hkey2);
|
|
727
|
-
UniqueId64x2 hkey3 = TestHashedKey('z');
|
|
728
|
-
Slice key3 = TestKey(hkey3);
|
|
799
|
+
UniqueId64x2 hkey1 = this->TestHashedKey('x');
|
|
800
|
+
Slice key1 = this->TestKey(hkey1);
|
|
801
|
+
UniqueId64x2 hkey2 = this->TestHashedKey('y');
|
|
802
|
+
Slice key2 = this->TestKey(hkey2);
|
|
803
|
+
UniqueId64x2 hkey3 = this->TestHashedKey('z');
|
|
804
|
+
Slice key3 = this->TestKey(hkey3);
|
|
729
805
|
HandleImpl* h1;
|
|
730
|
-
ASSERT_OK(
|
|
731
|
-
|
|
806
|
+
ASSERT_OK(shard.Insert(key1, hkey1, &val, &kDeleteCounterHelper, 1, &h1,
|
|
807
|
+
Cache::Priority::HIGH));
|
|
732
808
|
HandleImpl* h2;
|
|
733
|
-
ASSERT_OK(
|
|
734
|
-
|
|
809
|
+
ASSERT_OK(shard.Insert(key2, hkey2, &val, &kDeleteCounterHelper, 1, &h2,
|
|
810
|
+
Cache::Priority::HIGH));
|
|
735
811
|
HandleImpl* h3;
|
|
736
|
-
ASSERT_OK(
|
|
737
|
-
|
|
812
|
+
ASSERT_OK(shard.Insert(key3, hkey3, &val, &kDeleteCounterHelper, 1, &h3,
|
|
813
|
+
Cache::Priority::HIGH));
|
|
738
814
|
|
|
739
815
|
// Can repeatedly lookup+release despite the hash collision
|
|
740
816
|
HandleImpl* tmp_h;
|
|
741
817
|
for (bool erase_if_last_ref : {true, false}) { // but not last ref
|
|
742
|
-
tmp_h =
|
|
818
|
+
tmp_h = shard.Lookup(key1, hkey1);
|
|
743
819
|
ASSERT_EQ(h1, tmp_h);
|
|
744
|
-
ASSERT_FALSE(
|
|
820
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
745
821
|
|
|
746
|
-
tmp_h =
|
|
822
|
+
tmp_h = shard.Lookup(key2, hkey2);
|
|
747
823
|
ASSERT_EQ(h2, tmp_h);
|
|
748
|
-
ASSERT_FALSE(
|
|
824
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
749
825
|
|
|
750
|
-
tmp_h =
|
|
826
|
+
tmp_h = shard.Lookup(key3, hkey3);
|
|
751
827
|
ASSERT_EQ(h3, tmp_h);
|
|
752
|
-
ASSERT_FALSE(
|
|
828
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
753
829
|
}
|
|
754
830
|
|
|
755
831
|
// Make h1 invisible
|
|
756
|
-
|
|
832
|
+
shard.Erase(key1, hkey1);
|
|
757
833
|
// Redundant erase
|
|
758
|
-
|
|
834
|
+
shard.Erase(key1, hkey1);
|
|
759
835
|
|
|
760
836
|
// All still alive
|
|
761
837
|
ASSERT_EQ(val.deleted, 0);
|
|
762
838
|
|
|
763
839
|
// Invisible to Lookup
|
|
764
|
-
tmp_h =
|
|
840
|
+
tmp_h = shard.Lookup(key1, hkey1);
|
|
765
841
|
ASSERT_EQ(nullptr, tmp_h);
|
|
766
842
|
|
|
767
843
|
// Can still find h2, h3
|
|
768
844
|
for (bool erase_if_last_ref : {true, false}) { // but not last ref
|
|
769
|
-
tmp_h =
|
|
845
|
+
tmp_h = shard.Lookup(key2, hkey2);
|
|
770
846
|
ASSERT_EQ(h2, tmp_h);
|
|
771
|
-
ASSERT_FALSE(
|
|
847
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
772
848
|
|
|
773
|
-
tmp_h =
|
|
849
|
+
tmp_h = shard.Lookup(key3, hkey3);
|
|
774
850
|
ASSERT_EQ(h3, tmp_h);
|
|
775
|
-
ASSERT_FALSE(
|
|
851
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
776
852
|
}
|
|
777
853
|
|
|
778
854
|
// Also Insert with invisible entry there
|
|
779
|
-
ASSERT_OK(
|
|
780
|
-
|
|
781
|
-
tmp_h =
|
|
855
|
+
ASSERT_OK(shard.Insert(key1, hkey1, &val, &kDeleteCounterHelper, 1, nullptr,
|
|
856
|
+
Cache::Priority::HIGH));
|
|
857
|
+
tmp_h = shard.Lookup(key1, hkey1);
|
|
782
858
|
// Found but distinct handle
|
|
783
859
|
ASSERT_NE(nullptr, tmp_h);
|
|
784
860
|
ASSERT_NE(h1, tmp_h);
|
|
785
|
-
ASSERT_TRUE(
|
|
861
|
+
ASSERT_TRUE(shard.Release(tmp_h, /*erase_if_last_ref*/ true));
|
|
786
862
|
|
|
787
863
|
// tmp_h deleted
|
|
788
864
|
ASSERT_EQ(val.deleted--, 1);
|
|
789
865
|
|
|
790
866
|
// Release last ref on h1 (already invisible)
|
|
791
|
-
ASSERT_TRUE(
|
|
867
|
+
ASSERT_TRUE(shard.Release(h1, /*erase_if_last_ref*/ false));
|
|
792
868
|
|
|
793
869
|
// h1 deleted
|
|
794
870
|
ASSERT_EQ(val.deleted--, 1);
|
|
@@ -796,57 +872,57 @@ TEST_F(ClockCacheTest, CollidingInsertEraseTest) {
|
|
|
796
872
|
|
|
797
873
|
// Can still find h2, h3
|
|
798
874
|
for (bool erase_if_last_ref : {true, false}) { // but not last ref
|
|
799
|
-
tmp_h =
|
|
875
|
+
tmp_h = shard.Lookup(key2, hkey2);
|
|
800
876
|
ASSERT_EQ(h2, tmp_h);
|
|
801
|
-
ASSERT_FALSE(
|
|
877
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
802
878
|
|
|
803
|
-
tmp_h =
|
|
879
|
+
tmp_h = shard.Lookup(key3, hkey3);
|
|
804
880
|
ASSERT_EQ(h3, tmp_h);
|
|
805
|
-
ASSERT_FALSE(
|
|
881
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
806
882
|
}
|
|
807
883
|
|
|
808
884
|
// Release last ref on h2
|
|
809
|
-
ASSERT_FALSE(
|
|
885
|
+
ASSERT_FALSE(shard.Release(h2, /*erase_if_last_ref*/ false));
|
|
810
886
|
|
|
811
887
|
// h2 still not deleted (unreferenced in cache)
|
|
812
888
|
ASSERT_EQ(val.deleted, 0);
|
|
813
889
|
|
|
814
890
|
// Can still find it
|
|
815
|
-
tmp_h =
|
|
891
|
+
tmp_h = shard.Lookup(key2, hkey2);
|
|
816
892
|
ASSERT_EQ(h2, tmp_h);
|
|
817
893
|
|
|
818
894
|
// Release last ref on h2, with erase
|
|
819
|
-
ASSERT_TRUE(
|
|
895
|
+
ASSERT_TRUE(shard.Release(h2, /*erase_if_last_ref*/ true));
|
|
820
896
|
|
|
821
897
|
// h2 deleted
|
|
822
898
|
ASSERT_EQ(val.deleted--, 1);
|
|
823
|
-
tmp_h =
|
|
899
|
+
tmp_h = shard.Lookup(key2, hkey2);
|
|
824
900
|
ASSERT_EQ(nullptr, tmp_h);
|
|
825
901
|
|
|
826
902
|
// Can still find h3
|
|
827
903
|
for (bool erase_if_last_ref : {true, false}) { // but not last ref
|
|
828
|
-
tmp_h =
|
|
904
|
+
tmp_h = shard.Lookup(key3, hkey3);
|
|
829
905
|
ASSERT_EQ(h3, tmp_h);
|
|
830
|
-
ASSERT_FALSE(
|
|
906
|
+
ASSERT_FALSE(shard.Release(tmp_h, erase_if_last_ref));
|
|
831
907
|
}
|
|
832
908
|
|
|
833
909
|
// Release last ref on h3, without erase
|
|
834
|
-
ASSERT_FALSE(
|
|
910
|
+
ASSERT_FALSE(shard.Release(h3, /*erase_if_last_ref*/ false));
|
|
835
911
|
|
|
836
912
|
// h3 still not deleted (unreferenced in cache)
|
|
837
913
|
ASSERT_EQ(val.deleted, 0);
|
|
838
914
|
|
|
839
915
|
// Explicit erase
|
|
840
|
-
|
|
916
|
+
shard.Erase(key3, hkey3);
|
|
841
917
|
|
|
842
918
|
// h3 deleted
|
|
843
919
|
ASSERT_EQ(val.deleted--, 1);
|
|
844
|
-
tmp_h =
|
|
920
|
+
tmp_h = shard.Lookup(key3, hkey3);
|
|
845
921
|
ASSERT_EQ(nullptr, tmp_h);
|
|
846
922
|
}
|
|
847
923
|
|
|
848
924
|
// This uses the public API to effectively test CalcHashBits etc.
|
|
849
|
-
|
|
925
|
+
TYPED_TEST(ClockCacheTest, TableSizesTest) {
|
|
850
926
|
for (size_t est_val_size : {1U, 5U, 123U, 2345U, 345678U}) {
|
|
851
927
|
SCOPED_TRACE("est_val_size = " + std::to_string(est_val_size));
|
|
852
928
|
for (double est_count : {1.1, 2.2, 511.9, 512.1, 2345.0}) {
|
|
@@ -859,8 +935,10 @@ TEST_F(ClockCacheTest, TableSizesTest) {
|
|
|
859
935
|
/*memory_allocator*/ nullptr, kDontChargeCacheMetadata)
|
|
860
936
|
.MakeSharedCache();
|
|
861
937
|
// Table sizes are currently only powers of two
|
|
862
|
-
EXPECT_GE(cache->GetTableAddressCount(),
|
|
863
|
-
|
|
938
|
+
EXPECT_GE(cache->GetTableAddressCount(),
|
|
939
|
+
est_count / FixedHyperClockTable::kLoadFactor);
|
|
940
|
+
EXPECT_LE(cache->GetTableAddressCount(),
|
|
941
|
+
est_count / FixedHyperClockTable::kLoadFactor * 2.0);
|
|
864
942
|
EXPECT_EQ(cache->GetUsage(), 0);
|
|
865
943
|
|
|
866
944
|
// kFullChargeMetaData
|
|
@@ -877,9 +955,10 @@ TEST_F(ClockCacheTest, TableSizesTest) {
|
|
|
877
955
|
double est_count_after_meta =
|
|
878
956
|
(capacity - cache->GetUsage()) * 1.0 / est_val_size;
|
|
879
957
|
EXPECT_GE(cache->GetTableAddressCount(),
|
|
880
|
-
est_count_after_meta / kLoadFactor);
|
|
881
|
-
EXPECT_LE(
|
|
882
|
-
|
|
958
|
+
est_count_after_meta / FixedHyperClockTable::kLoadFactor);
|
|
959
|
+
EXPECT_LE(
|
|
960
|
+
cache->GetTableAddressCount(),
|
|
961
|
+
est_count_after_meta / FixedHyperClockTable::kLoadFactor * 2.0);
|
|
883
962
|
}
|
|
884
963
|
}
|
|
885
964
|
}
|
|
@@ -917,7 +996,8 @@ class TestSecondaryCache : public SecondaryCache {
|
|
|
917
996
|
void ResetInjectFailure() { inject_failure_ = false; }
|
|
918
997
|
|
|
919
998
|
Status Insert(const Slice& key, Cache::ObjectPtr value,
|
|
920
|
-
const Cache::CacheItemHelper* helper
|
|
999
|
+
const Cache::CacheItemHelper* helper,
|
|
1000
|
+
bool /*force_insert*/) override {
|
|
921
1001
|
if (inject_failure_) {
|
|
922
1002
|
return Status::Corruption("Insertion Data Corrupted");
|
|
923
1003
|
}
|
|
@@ -1367,7 +1447,7 @@ TEST_P(BasicSecondaryCacheTest, FullCapacityTest) {
|
|
|
1367
1447
|
k2.AsSlice(),
|
|
1368
1448
|
GetHelper(CacheEntryRole::kDataBlock, /*secondary_compatible=*/false),
|
|
1369
1449
|
/*context*/ this, Cache::Priority::LOW);
|
|
1370
|
-
if (strict_capacity_limit ||
|
|
1450
|
+
if (strict_capacity_limit || IsHyperClock()) {
|
|
1371
1451
|
ASSERT_NE(handle2, nullptr);
|
|
1372
1452
|
cache->Release(handle2);
|
|
1373
1453
|
ASSERT_EQ(secondary_cache->num_inserts(), 1u);
|
|
@@ -1392,12 +1472,12 @@ TEST_P(BasicSecondaryCacheTest, FullCapacityTest) {
|
|
|
1392
1472
|
// CORRECTION: this is not quite right. block_1 can be inserted into the block
|
|
1393
1473
|
// cache because strict_capacity_limit=false, but it is removed from the cache
|
|
1394
1474
|
// in Release() because of being over-capacity, without demoting to secondary
|
|
1395
|
-
// cache.
|
|
1396
|
-
// so can demote the over-capacity item to secondary cache. Also, we
|
|
1397
|
-
// add support for demotion in Release, but that currently causes too
|
|
1398
|
-
// unit test churn.
|
|
1475
|
+
// cache. FixedHyperClockCache doesn't check capacity on release (for
|
|
1476
|
+
// efficiency) so can demote the over-capacity item to secondary cache. Also, we
|
|
1477
|
+
// intend to add support for demotion in Release, but that currently causes too
|
|
1478
|
+
// much unit test churn.
|
|
1399
1479
|
TEST_P(DBSecondaryCacheTest, TestSecondaryCacheCorrectness1) {
|
|
1400
|
-
if (
|
|
1480
|
+
if (IsHyperClock()) {
|
|
1401
1481
|
// See CORRECTION above
|
|
1402
1482
|
ROCKSDB_GTEST_BYPASS("Test depends on LRUCache-specific behaviors");
|
|
1403
1483
|
return;
|
|
@@ -1495,7 +1575,7 @@ TEST_P(DBSecondaryCacheTest, TestSecondaryCacheCorrectness1) {
|
|
|
1495
1575
|
// insert and cache block_1 in the block cache (this is the different place
|
|
1496
1576
|
// from TestSecondaryCacheCorrectness1)
|
|
1497
1577
|
TEST_P(DBSecondaryCacheTest, TestSecondaryCacheCorrectness2) {
|
|
1498
|
-
if (
|
|
1578
|
+
if (IsHyperClock()) {
|
|
1499
1579
|
ROCKSDB_GTEST_BYPASS("Test depends on LRUCache-specific behaviors");
|
|
1500
1580
|
return;
|
|
1501
1581
|
}
|
|
@@ -1683,7 +1763,7 @@ TEST_P(DBSecondaryCacheTest, SecondaryCacheIntensiveTesting) {
|
|
|
1683
1763
|
// if we try to insert block_1 to the block cache, it will always fails. Only
|
|
1684
1764
|
// block_2 will be successfully inserted into the block cache.
|
|
1685
1765
|
TEST_P(DBSecondaryCacheTest, SecondaryCacheFailureTest) {
|
|
1686
|
-
if (
|
|
1766
|
+
if (IsHyperClock()) {
|
|
1687
1767
|
ROCKSDB_GTEST_BYPASS("Test depends on LRUCache-specific behaviors");
|
|
1688
1768
|
return;
|
|
1689
1769
|
}
|
|
@@ -1793,7 +1873,7 @@ TEST_P(BasicSecondaryCacheTest, BasicWaitAllTest) {
|
|
|
1793
1873
|
str.length()));
|
|
1794
1874
|
}
|
|
1795
1875
|
// Force all entries to be evicted to the secondary cache
|
|
1796
|
-
if (
|
|
1876
|
+
if (IsHyperClock()) {
|
|
1797
1877
|
// HCC doesn't respond immediately to SetCapacity
|
|
1798
1878
|
for (int i = 9000; i < 9030; ++i) {
|
|
1799
1879
|
ASSERT_OK(cache->Insert(ock.WithOffset(i).AsSlice(), nullptr,
|
|
@@ -1848,7 +1928,7 @@ TEST_P(BasicSecondaryCacheTest, BasicWaitAllTest) {
|
|
|
1848
1928
|
// a sync point callback in TestSecondaryCache::Lookup. We then control the
|
|
1849
1929
|
// lookup result by setting the ResultMap.
|
|
1850
1930
|
TEST_P(DBSecondaryCacheTest, TestSecondaryCacheMultiGet) {
|
|
1851
|
-
if (
|
|
1931
|
+
if (IsHyperClock()) {
|
|
1852
1932
|
ROCKSDB_GTEST_BYPASS("Test depends on LRUCache-specific behaviors");
|
|
1853
1933
|
return;
|
|
1854
1934
|
}
|
|
@@ -2349,7 +2429,7 @@ TEST_P(DBSecondaryCacheTest, TestSecondaryCacheOptionBasic) {
|
|
|
2349
2429
|
// with new options, which set the lowest_used_cache_tier to
|
|
2350
2430
|
// kNonVolatileBlockTier. So secondary cache will be used.
|
|
2351
2431
|
TEST_P(DBSecondaryCacheTest, TestSecondaryCacheOptionChange) {
|
|
2352
|
-
if (
|
|
2432
|
+
if (IsHyperClock()) {
|
|
2353
2433
|
ROCKSDB_GTEST_BYPASS("Test depends on LRUCache-specific behaviors");
|
|
2354
2434
|
return;
|
|
2355
2435
|
}
|
|
@@ -2444,7 +2524,7 @@ TEST_P(DBSecondaryCacheTest, TestSecondaryCacheOptionChange) {
|
|
|
2444
2524
|
// Two DB test. We create 2 DBs sharing the same block cache and secondary
|
|
2445
2525
|
// cache. We diable the secondary cache option for DB2.
|
|
2446
2526
|
TEST_P(DBSecondaryCacheTest, TestSecondaryCacheOptionTwoDB) {
|
|
2447
|
-
if (
|
|
2527
|
+
if (IsHyperClock()) {
|
|
2448
2528
|
ROCKSDB_GTEST_BYPASS("Test depends on LRUCache-specific behaviors");
|
|
2449
2529
|
return;
|
|
2450
2530
|
}
|