@nxtedition/rocksdb 15.4.0 → 15.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +24 -19
- package/cache.js +1 -1
- package/chained-batch.js +12 -3
- package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
- package/deps/rocksdb/rocksdb/BUCK +42 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
- package/deps/rocksdb/rocksdb/Makefile +59 -32
- package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
- package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
- package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
- package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
- package/deps/rocksdb/rocksdb/db/builder.h +7 -0
- package/deps/rocksdb/rocksdb/db/c.cc +373 -57
- package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
- package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
- package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
- package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
- package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
- package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
- package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
- package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
- package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
- package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
- package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
- package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
- package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
- package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
- package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
- package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
- package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
- package/deps/rocksdb/rocksdb/env/env.cc +1 -0
- package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
- package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
- package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
- package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
- package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
- package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
- package/deps/rocksdb/rocksdb/folly.mk +22 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
- package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
- package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
- package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
- package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
- package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
- package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
- package/deps/rocksdb/rocksdb/options/options.cc +5 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
- package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
- package/deps/rocksdb/rocksdb/port/lang.h +4 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
- package/deps/rocksdb/rocksdb/src.mk +12 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
- package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
- package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
- package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
- package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
- package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
- package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
- package/deps/rocksdb/rocksdb/table/format.cc +27 -15
- package/deps/rocksdb/rocksdb/table/format.h +41 -15
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
- package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
- package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
- package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
- package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
- package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
- package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
- package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
- package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
- package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
- package/deps/rocksdb/rocksdb/util/coding.h +14 -27
- package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
- package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
- package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
- package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
- package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
- package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
- package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
- package/deps/rocksdb/rocksdb/util/math.h +3 -1
- package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
- package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
- package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
- package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
- package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
- package/deps/rocksdb/rocksdb/util/status.cc +3 -1
- package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
- package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
- package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
- package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
- package/deps/rocksdb/rocksdb.gyp +7 -0
- package/index.js +11 -2
- package/iterator.js +15 -7
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
#include "db/compaction/compaction_picker_fifo.h"
|
|
11
11
|
|
|
12
|
+
#include <algorithm>
|
|
12
13
|
#include <cinttypes>
|
|
13
14
|
#include <string>
|
|
14
15
|
#include <vector>
|
|
@@ -31,6 +32,29 @@ uint64_t GetTotalFilesSize(const std::vector<FileMetaData*>& files) {
|
|
|
31
32
|
}
|
|
32
33
|
return total_size;
|
|
33
34
|
}
|
|
35
|
+
|
|
36
|
+
// Compute effective data size and capacity limit for FIFO compaction.
|
|
37
|
+
// When max_data_files_size > 0 (blob-aware mode), the effective size includes
|
|
38
|
+
// both SST and blob file sizes, and the limit is max_data_files_size.
|
|
39
|
+
// Otherwise, only SST sizes are used with max_table_files_size as the limit.
|
|
40
|
+
void GetEffectiveSizeAndLimit(const CompactionOptionsFIFO& fifo_opts,
|
|
41
|
+
uint64_t total_sst_size, uint64_t total_blob_size,
|
|
42
|
+
uint64_t* effective_size,
|
|
43
|
+
uint64_t* effective_max) {
|
|
44
|
+
*effective_size = total_sst_size;
|
|
45
|
+
*effective_max = fifo_opts.max_table_files_size;
|
|
46
|
+
if (fifo_opts.max_data_files_size > 0) {
|
|
47
|
+
*effective_size += total_blob_size;
|
|
48
|
+
*effective_max = fifo_opts.max_data_files_size;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Return the effective capacity limit for FIFO compaction.
|
|
53
|
+
// Convenience wrapper when only the limit is needed (e.g., PickTTLCompaction).
|
|
54
|
+
uint64_t GetEffectiveMax(const CompactionOptionsFIFO& fifo_opts) {
|
|
55
|
+
return fifo_opts.max_data_files_size > 0 ? fifo_opts.max_data_files_size
|
|
56
|
+
: fifo_opts.max_table_files_size;
|
|
57
|
+
}
|
|
34
58
|
} // anonymous namespace
|
|
35
59
|
|
|
36
60
|
bool FIFOCompactionPicker::NeedsCompaction(
|
|
@@ -78,10 +102,10 @@ Compaction* FIFOCompactionPicker::PickTTLCompaction(
|
|
|
78
102
|
for (auto ritr = level_files.rbegin(); ritr != level_files.rend(); ++ritr) {
|
|
79
103
|
FileMetaData* f = *ritr;
|
|
80
104
|
assert(f);
|
|
81
|
-
|
|
105
|
+
TableReader* reader = f->fd.pinned_reader.Get();
|
|
106
|
+
if (reader != nullptr && reader->GetTableProperties() != nullptr) {
|
|
82
107
|
uint64_t newest_key_time = f->TryGetNewestKeyTime();
|
|
83
|
-
uint64_t creation_time =
|
|
84
|
-
f->fd.table_reader->GetTableProperties()->creation_time;
|
|
108
|
+
uint64_t creation_time = reader->GetTableProperties()->creation_time;
|
|
85
109
|
uint64_t est_newest_key_time = newest_key_time == kUnknownNewestKeyTime
|
|
86
110
|
? creation_time
|
|
87
111
|
: newest_key_time;
|
|
@@ -98,10 +122,43 @@ Compaction* FIFOCompactionPicker::PickTTLCompaction(
|
|
|
98
122
|
// Return a nullptr and proceed to size-based FIFO compaction if:
|
|
99
123
|
// 1. there are no files older than ttl OR
|
|
100
124
|
// 2. there are a few files older than ttl, but deleting them will not bring
|
|
101
|
-
// the total size to be less than
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
125
|
+
// the total size to be less than the size threshold.
|
|
126
|
+
uint64_t effective_max =
|
|
127
|
+
GetEffectiveMax(mutable_cf_options.compaction_options_fifo);
|
|
128
|
+
// Estimate the effective remaining data after dropping TTL-expired SSTs.
|
|
129
|
+
// Each dropped SST also frees a proportional share of blob data.
|
|
130
|
+
//
|
|
131
|
+
// In multi-level FIFO (migration), we must use total SST across ALL levels
|
|
132
|
+
// as the reference, because total_blob covers all levels. Using only L0
|
|
133
|
+
// SST would inflate the blob estimate.
|
|
134
|
+
uint64_t effective_remaining = total_size;
|
|
135
|
+
if (mutable_cf_options.compaction_options_fifo.max_data_files_size > 0) {
|
|
136
|
+
uint64_t total_blob = vstorage->GetBlobStats().total_file_size;
|
|
137
|
+
// Compute total SST across all levels so the reference scope matches
|
|
138
|
+
// total_blob's scope (all levels).
|
|
139
|
+
uint64_t total_sst_all_levels = GetTotalFilesSize(level_files);
|
|
140
|
+
for (int level = 1; level < vstorage->num_levels(); ++level) {
|
|
141
|
+
total_sst_all_levels += GetTotalFilesSize(vstorage->LevelFiles(level));
|
|
142
|
+
}
|
|
143
|
+
// remaining_sst_all = total_sst_all - dropped_l0_sst
|
|
144
|
+
// total_size is the remaining L0 SST after removing expired files;
|
|
145
|
+
// original L0 SST minus remaining L0 SST = dropped.
|
|
146
|
+
uint64_t original_l0_sst = GetTotalFilesSize(level_files);
|
|
147
|
+
uint64_t dropped_sst = original_l0_sst - total_size;
|
|
148
|
+
uint64_t remaining_sst_all = total_sst_all_levels - dropped_sst;
|
|
149
|
+
// Proportional blob estimate: each SST byte "owns" a proportional
|
|
150
|
+
// share of blob bytes. Both reference sizes must come from the same
|
|
151
|
+
// scope (all levels) to avoid inflated estimates.
|
|
152
|
+
if (total_sst_all_levels > 0 && total_blob > 0) {
|
|
153
|
+
effective_remaining =
|
|
154
|
+
remaining_sst_all +
|
|
155
|
+
static_cast<uint64_t>(static_cast<double>(remaining_sst_all) /
|
|
156
|
+
total_sst_all_levels * total_blob);
|
|
157
|
+
} else {
|
|
158
|
+
effective_remaining = remaining_sst_all;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (inputs[0].files.empty() || effective_remaining > effective_max) {
|
|
105
162
|
return nullptr;
|
|
106
163
|
}
|
|
107
164
|
|
|
@@ -109,8 +166,9 @@ Compaction* FIFOCompactionPicker::PickTTLCompaction(
|
|
|
109
166
|
assert(f);
|
|
110
167
|
uint64_t newest_key_time = f->TryGetNewestKeyTime();
|
|
111
168
|
uint64_t creation_time = 0;
|
|
112
|
-
|
|
113
|
-
|
|
169
|
+
TableReader* reader = f->fd.pinned_reader.Get();
|
|
170
|
+
if (reader != nullptr && reader->GetTableProperties() != nullptr) {
|
|
171
|
+
creation_time = reader->GetTableProperties()->creation_time;
|
|
114
172
|
}
|
|
115
173
|
uint64_t est_newest_key_time = newest_key_time == kUnknownNewestKeyTime
|
|
116
174
|
? creation_time
|
|
@@ -151,7 +209,9 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
|
151
209
|
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
152
210
|
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
153
211
|
LogBuffer* log_buffer) {
|
|
154
|
-
|
|
212
|
+
const auto& fifo_opts = mutable_cf_options.compaction_options_fifo;
|
|
213
|
+
|
|
214
|
+
// compute the total SST size and identify the last non-empty level
|
|
155
215
|
int last_level = 0;
|
|
156
216
|
uint64_t total_size = 0;
|
|
157
217
|
for (int level = 0; level < vstorage->num_levels(); ++level) {
|
|
@@ -164,52 +224,13 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
|
164
224
|
const std::vector<FileMetaData*>& last_level_files =
|
|
165
225
|
vstorage->LevelFiles(last_level);
|
|
166
226
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (mutable_cf_options.compaction_options_fifo.allow_compaction &&
|
|
173
|
-
level0_files.size() > 0) {
|
|
174
|
-
CompactionInputFiles comp_inputs;
|
|
175
|
-
// try to prevent same files from being compacted multiple times, which
|
|
176
|
-
// could produce large files that may never TTL-expire. Achieve this by
|
|
177
|
-
// disallowing compactions with files larger than memtable (inflate its
|
|
178
|
-
// size by 10% to account for uncompressed L0 files that may have size
|
|
179
|
-
// slightly greater than memtable size limit).
|
|
180
|
-
size_t max_compact_bytes_per_del_file =
|
|
181
|
-
static_cast<size_t>(MultiplyCheckOverflow(
|
|
182
|
-
static_cast<uint64_t>(mutable_cf_options.write_buffer_size),
|
|
183
|
-
1.1));
|
|
184
|
-
if (FindIntraL0Compaction(
|
|
185
|
-
level0_files,
|
|
186
|
-
mutable_cf_options
|
|
187
|
-
.level0_file_num_compaction_trigger /* min_files_to_compact */
|
|
188
|
-
,
|
|
189
|
-
max_compact_bytes_per_del_file,
|
|
190
|
-
mutable_cf_options.max_compaction_bytes, &comp_inputs)) {
|
|
191
|
-
Compaction* c = new Compaction(
|
|
192
|
-
vstorage, ioptions_, mutable_cf_options, mutable_db_options,
|
|
193
|
-
{comp_inputs}, 0, 16 * 1024 * 1024 /* output file size limit */,
|
|
194
|
-
0 /* max compaction bytes, not applicable */,
|
|
195
|
-
0 /* output path ID */, mutable_cf_options.compression,
|
|
196
|
-
mutable_cf_options.compression_opts, Temperature::kUnknown,
|
|
197
|
-
0 /* max_subcompactions */, {},
|
|
198
|
-
/* earliest_snapshot */ std::nullopt,
|
|
199
|
-
/* snapshot_checker */ nullptr,
|
|
200
|
-
CompactionReason::kFIFOReduceNumFiles,
|
|
201
|
-
/* trim_ts */ "", vstorage->CompactionScore(0),
|
|
202
|
-
/* l0_files_might_overlap */ true);
|
|
203
|
-
return c;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
227
|
+
// Compute effective size and limit for comparison.
|
|
228
|
+
uint64_t effective_size, effective_max;
|
|
229
|
+
GetEffectiveSizeAndLimit(fifo_opts, total_size,
|
|
230
|
+
vstorage->GetBlobStats().total_file_size,
|
|
231
|
+
&effective_size, &effective_max);
|
|
206
232
|
|
|
207
|
-
|
|
208
|
-
log_buffer,
|
|
209
|
-
"[%s] FIFO compaction: nothing to do. Total size %" PRIu64
|
|
210
|
-
", max size %" PRIu64 "\n",
|
|
211
|
-
cf_name.c_str(), total_size,
|
|
212
|
-
mutable_cf_options.compaction_options_fifo.max_table_files_size);
|
|
233
|
+
if (last_level == 0 && effective_size <= effective_max) {
|
|
213
234
|
return nullptr;
|
|
214
235
|
}
|
|
215
236
|
|
|
@@ -227,11 +248,29 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
|
227
248
|
inputs[0].level = last_level;
|
|
228
249
|
|
|
229
250
|
if (last_level == 0) {
|
|
251
|
+
// When using blob-aware sizing, use proportional estimation (same
|
|
252
|
+
// principle as EstimateTotalDataForSST): each SST "owns"
|
|
253
|
+
// effective_size / num_files of total data. This is an approximation
|
|
254
|
+
// — individual SSTs may reference different amounts of blob data,
|
|
255
|
+
// but uniform distribution is a reasonable estimate for FIFO dropping.
|
|
256
|
+
uint64_t remaining_size = effective_size;
|
|
257
|
+
const uint64_t num_files = last_level_files.size();
|
|
258
|
+
// Proportional estimate of data per file (SST + blob).
|
|
259
|
+
// Use max(1) to prevent stalling when effective_size < num_files.
|
|
260
|
+
const uint64_t data_per_file =
|
|
261
|
+
(fifo_opts.max_data_files_size > 0 && num_files > 0)
|
|
262
|
+
? std::max(effective_size / num_files, uint64_t{1})
|
|
263
|
+
: 0;
|
|
264
|
+
|
|
230
265
|
// In L0, right-most files are the oldest files.
|
|
231
266
|
for (auto ritr = last_level_files.rbegin(); ritr != last_level_files.rend();
|
|
232
267
|
++ritr) {
|
|
233
268
|
auto f = *ritr;
|
|
234
|
-
|
|
269
|
+
if (fifo_opts.max_data_files_size > 0) {
|
|
270
|
+
remaining_size -= std::min(remaining_size, data_per_file);
|
|
271
|
+
} else {
|
|
272
|
+
remaining_size -= std::min(remaining_size, f->fd.file_size);
|
|
273
|
+
}
|
|
235
274
|
inputs[0].files.push_back(f);
|
|
236
275
|
char tmp_fsize[16];
|
|
237
276
|
AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
|
|
@@ -239,13 +278,11 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
|
239
278
|
"[%s] FIFO compaction: picking file %" PRIu64
|
|
240
279
|
" with size %s for deletion",
|
|
241
280
|
cf_name.c_str(), f->fd.GetNumber(), tmp_fsize);
|
|
242
|
-
if (
|
|
243
|
-
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
|
|
281
|
+
if (remaining_size <= effective_max) {
|
|
244
282
|
break;
|
|
245
283
|
}
|
|
246
284
|
}
|
|
247
|
-
} else if (
|
|
248
|
-
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
|
|
285
|
+
} else if (effective_size > effective_max) {
|
|
249
286
|
// If the last level is non-L0, we actually don't know which file is
|
|
250
287
|
// logically the oldest since the file creation time only represents
|
|
251
288
|
// when this file was compacted to this level, which is independent
|
|
@@ -255,34 +292,36 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
|
255
292
|
// file with the smallest key will be deleted first. This design decision
|
|
256
293
|
// better serves a major type of FIFO use cases where smaller keys are
|
|
257
294
|
// associated with older data.
|
|
295
|
+
const uint64_t num_files = last_level_files.size();
|
|
296
|
+
// Proportional estimate of data per file (SST + blob), same as L0 path.
|
|
297
|
+
const uint64_t data_per_file =
|
|
298
|
+
(fifo_opts.max_data_files_size > 0 && num_files > 0)
|
|
299
|
+
? std::max(effective_size / num_files, uint64_t{1})
|
|
300
|
+
: 0;
|
|
258
301
|
for (const auto& f : last_level_files) {
|
|
259
302
|
if (f->being_compacted) {
|
|
260
303
|
continue;
|
|
261
304
|
}
|
|
262
|
-
|
|
305
|
+
if (fifo_opts.max_data_files_size > 0) {
|
|
306
|
+
effective_size -= std::min(effective_size, data_per_file);
|
|
307
|
+
} else {
|
|
308
|
+
effective_size -= std::min(effective_size, f->fd.file_size);
|
|
309
|
+
}
|
|
263
310
|
inputs[0].files.push_back(f);
|
|
264
311
|
char tmp_fsize[16];
|
|
265
312
|
AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
|
|
266
|
-
ROCKS_LOG_BUFFER(
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
if (total_size <=
|
|
275
|
-
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
|
|
313
|
+
ROCKS_LOG_BUFFER(log_buffer,
|
|
314
|
+
"[%s] FIFO compaction: picking file %" PRIu64
|
|
315
|
+
" with size %s for deletion under total size %" PRIu64
|
|
316
|
+
" vs max size %" PRIu64,
|
|
317
|
+
cf_name.c_str(), f->fd.GetNumber(), tmp_fsize,
|
|
318
|
+
effective_size, effective_max);
|
|
319
|
+
|
|
320
|
+
if (effective_size <= effective_max) {
|
|
276
321
|
break;
|
|
277
322
|
}
|
|
278
323
|
}
|
|
279
324
|
} else {
|
|
280
|
-
ROCKS_LOG_BUFFER(
|
|
281
|
-
log_buffer,
|
|
282
|
-
"[%s] FIFO compaction: nothing to do. Total size %" PRIu64
|
|
283
|
-
", max size %" PRIu64 "\n",
|
|
284
|
-
cf_name.c_str(), total_size,
|
|
285
|
-
mutable_cf_options.compaction_options_fifo.max_table_files_size);
|
|
286
325
|
return nullptr;
|
|
287
326
|
}
|
|
288
327
|
|
|
@@ -419,12 +458,282 @@ Compaction* FIFOCompactionPicker::PickTemperatureChangeCompaction(
|
|
|
419
458
|
return c;
|
|
420
459
|
}
|
|
421
460
|
|
|
461
|
+
Compaction* FIFOCompactionPicker::PickIntraL0Compaction(
|
|
462
|
+
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
463
|
+
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
464
|
+
LogBuffer* log_buffer) {
|
|
465
|
+
const auto& fifo_opts = mutable_cf_options.compaction_options_fifo;
|
|
466
|
+
|
|
467
|
+
if (!fifo_opts.allow_compaction) {
|
|
468
|
+
return nullptr;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
const std::vector<FileMetaData*>& level0_files = vstorage->LevelFiles(0);
|
|
472
|
+
if (level0_files.empty()) {
|
|
473
|
+
return nullptr;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (fifo_opts.use_kv_ratio_compaction) {
|
|
477
|
+
if (fifo_opts.max_data_files_size == 0) {
|
|
478
|
+
ROCKS_LOG_BUFFER(
|
|
479
|
+
log_buffer,
|
|
480
|
+
"[%s] FIFO kv-ratio compaction: skipping — "
|
|
481
|
+
"max_data_files_size is 0, cannot compute target file size. ",
|
|
482
|
+
cf_name.c_str());
|
|
483
|
+
} else if (fifo_opts.max_data_files_size < fifo_opts.max_table_files_size) {
|
|
484
|
+
ROCKS_LOG_BUFFER(log_buffer,
|
|
485
|
+
"[%s] FIFO kv-ratio compaction: skipping — "
|
|
486
|
+
"max_data_files_size (%" PRIu64
|
|
487
|
+
") < max_table_files_size "
|
|
488
|
+
"(%" PRIu64 ").",
|
|
489
|
+
cf_name.c_str(), fifo_opts.max_data_files_size,
|
|
490
|
+
fifo_opts.max_table_files_size);
|
|
491
|
+
} else {
|
|
492
|
+
return PickRatioBasedIntraL0Compaction(cf_name, mutable_cf_options,
|
|
493
|
+
mutable_db_options, vstorage,
|
|
494
|
+
log_buffer);
|
|
495
|
+
}
|
|
496
|
+
ROCKS_LOG_BUFFER(
|
|
497
|
+
log_buffer, "[%s] FIFO: falling back to cost-based intra-L0 compaction",
|
|
498
|
+
cf_name.c_str());
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Old intra-L0 path: merge small files using PickCostBasedIntraL0Compaction.
|
|
502
|
+
// Minimum files to compact follows level0_file_num_compaction_trigger.
|
|
503
|
+
// Try to prevent same files from being compacted multiple times, which
|
|
504
|
+
// could produce large files that may never TTL-expire. Achieve this by
|
|
505
|
+
// disallowing compactions with files larger than memtable (inflate its
|
|
506
|
+
// size by 10% to account for uncompressed L0 files that may have size
|
|
507
|
+
// slightly greater than memtable size limit).
|
|
508
|
+
|
|
509
|
+
CompactionInputFiles comp_inputs;
|
|
510
|
+
size_t max_compact_bytes_per_del_file =
|
|
511
|
+
static_cast<size_t>(MultiplyCheckOverflow(
|
|
512
|
+
static_cast<uint64_t>(mutable_cf_options.write_buffer_size), 1.1));
|
|
513
|
+
if (PickCostBasedIntraL0Compaction(
|
|
514
|
+
level0_files,
|
|
515
|
+
mutable_cf_options
|
|
516
|
+
.level0_file_num_compaction_trigger /* min_files_to_compact */,
|
|
517
|
+
max_compact_bytes_per_del_file,
|
|
518
|
+
mutable_cf_options.max_compaction_bytes, &comp_inputs)) {
|
|
519
|
+
Compaction* c = new Compaction(
|
|
520
|
+
vstorage, ioptions_, mutable_cf_options, mutable_db_options,
|
|
521
|
+
{comp_inputs}, 0, 16 * 1024 * 1024 /* output file size limit */,
|
|
522
|
+
0 /* max compaction bytes, not applicable */, 0 /* output path ID */,
|
|
523
|
+
mutable_cf_options.compression, mutable_cf_options.compression_opts,
|
|
524
|
+
Temperature::kUnknown, 0 /* max_subcompactions */, {},
|
|
525
|
+
/* earliest_snapshot */ std::nullopt,
|
|
526
|
+
/* snapshot_checker */ nullptr, CompactionReason::kFIFOReduceNumFiles,
|
|
527
|
+
/* trim_ts */ "", vstorage->CompactionScore(0),
|
|
528
|
+
/* l0_files_might_overlap */ true);
|
|
529
|
+
return c;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return nullptr;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
Compaction* FIFOCompactionPicker::PickRatioBasedIntraL0Compaction(
|
|
536
|
+
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
537
|
+
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
538
|
+
LogBuffer* log_buffer) {
|
|
539
|
+
const auto& fifo_opts = mutable_cf_options.compaction_options_fifo;
|
|
540
|
+
assert(fifo_opts.use_kv_ratio_compaction);
|
|
541
|
+
assert(fifo_opts.max_data_files_size > 0);
|
|
542
|
+
|
|
543
|
+
// During migration from level/universal compaction to FIFO, non-L0 levels
|
|
544
|
+
// may still contain files. The ratio-based algorithm only operates on L0,
|
|
545
|
+
// so skip it until PickSizeCompaction has drained all non-L0 levels.
|
|
546
|
+
// Once levels collapse to L0-only, this algorithm will kick in.
|
|
547
|
+
for (int level = 1; level < vstorage->num_levels(); ++level) {
|
|
548
|
+
if (!vstorage->LevelFiles(level).empty()) {
|
|
549
|
+
ROCKS_LOG_BUFFER(log_buffer,
|
|
550
|
+
"[%s] FIFO kv-ratio compaction: skipping — non-L0 "
|
|
551
|
+
"level %d still has %" ROCKSDB_PRIszt
|
|
552
|
+
" files (migration in progress)",
|
|
553
|
+
cf_name.c_str(), level,
|
|
554
|
+
vstorage->LevelFiles(level).size());
|
|
555
|
+
return nullptr;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
if (!level0_compactions_in_progress_.empty()) {
|
|
560
|
+
return nullptr;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
const std::vector<FileMetaData*>& level0_files = vstorage->LevelFiles(0);
|
|
564
|
+
if (mutable_cf_options.level0_file_num_compaction_trigger <= 1) {
|
|
565
|
+
// trigger <= 0 is invalid; trigger == 1 means compact after every flush,
|
|
566
|
+
// which doesn't make sense for tiered merging (the tier boundary loop
|
|
567
|
+
// divides by trigger, so trigger == 1 would cause an infinite loop).
|
|
568
|
+
return nullptr;
|
|
569
|
+
}
|
|
570
|
+
const size_t trigger = static_cast<size_t>(
|
|
571
|
+
mutable_cf_options.level0_file_num_compaction_trigger);
|
|
572
|
+
if (level0_files.size() < trigger) {
|
|
573
|
+
return nullptr;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Determine the target compacted file size.
|
|
577
|
+
//
|
|
578
|
+
// When max_compaction_bytes > 0 (explicitly set by user), use it directly
|
|
579
|
+
// as the target. This allows users to override the auto-calculated value.
|
|
580
|
+
//
|
|
581
|
+
// When max_compaction_bytes == 0 (default), auto-calculate from the data
|
|
582
|
+
// capacity and observed SST/blob ratio:
|
|
583
|
+
// target = max_data_files_size * sst_ratio / trigger
|
|
584
|
+
//
|
|
585
|
+
// This is recomputed on every PickCompaction call. The computation is
|
|
586
|
+
// trivial (sum file sizes + arithmetic) and PickCompaction is only called
|
|
587
|
+
// once per flush or compaction completion, so no caching is needed.
|
|
588
|
+
uint64_t target = 0;
|
|
589
|
+
if (mutable_cf_options.max_compaction_bytes > 0) {
|
|
590
|
+
// User explicitly set max_compaction_bytes — use it as target
|
|
591
|
+
target = mutable_cf_options.max_compaction_bytes;
|
|
592
|
+
} else {
|
|
593
|
+
// Auto-calculate from capacity and observed SST/blob ratio
|
|
594
|
+
uint64_t total_sst = GetTotalFilesSize(level0_files);
|
|
595
|
+
uint64_t total_blob = vstorage->GetBlobStats().total_file_size;
|
|
596
|
+
uint64_t total_data = total_sst + total_blob;
|
|
597
|
+
|
|
598
|
+
if (total_data == 0 || total_sst == 0) {
|
|
599
|
+
return nullptr;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// Compute sst_ratio (inverse of EstimateTotalDataForSST's proportion):
|
|
603
|
+
// when no blob files exist, sst_ratio is 1.0 and the target becomes
|
|
604
|
+
// max_data_files_size / trigger, which is large. The algorithm will
|
|
605
|
+
// naturally not find small enough files to compact.
|
|
606
|
+
double sst_ratio =
|
|
607
|
+
(total_blob > 0) ? static_cast<double>(total_sst) / total_data : 1.0;
|
|
608
|
+
|
|
609
|
+
uint64_t total_sst_at_cap =
|
|
610
|
+
static_cast<uint64_t>(fifo_opts.max_data_files_size * sst_ratio);
|
|
611
|
+
target = total_sst_at_cap / trigger;
|
|
612
|
+
|
|
613
|
+
ROCKS_LOG_BUFFER(log_buffer,
|
|
614
|
+
"[%s] FIFO ratio-based compaction: sst_ratio=%.4f, "
|
|
615
|
+
"target_file_size=%" PRIu64,
|
|
616
|
+
cf_name.c_str(), sst_ratio, target);
|
|
617
|
+
}
|
|
618
|
+
if (target == 0) {
|
|
619
|
+
return nullptr;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Tiered size-based file selection.
|
|
623
|
+
//
|
|
624
|
+
// Tier boundaries form a geometric sequence descending from target:
|
|
625
|
+
// ..., target/trigger^2, target/trigger, target
|
|
626
|
+
// For each boundary (smallest first), find contiguous L0 files with
|
|
627
|
+
// size < boundary. If their accumulated bytes >= boundary, merge them.
|
|
628
|
+
// The output (~boundary bytes) advances to the next tier. Files that
|
|
629
|
+
// reach target are "graduated" and never compacted again.
|
|
630
|
+
//
|
|
631
|
+
// Trade-off: write amplification vs L0 file count.
|
|
632
|
+
//
|
|
633
|
+
// Write amp: O(log(target/flush) / log(trigger)) per byte, instead of
|
|
634
|
+
// O(target / (trigger * flush)) from flat merging. Each byte is
|
|
635
|
+
// rewritten once per tier crossing.
|
|
636
|
+
//
|
|
637
|
+
// L0 file count: trigger + k * (trigger - 1) at steady state, where
|
|
638
|
+
// k = ceil(log(target/flush) / log(trigger)). This is higher than
|
|
639
|
+
// the original trigger target because intermediate tier files
|
|
640
|
+
// accumulate while waiting for the next tier merge. The trade-off
|
|
641
|
+
// is explicit: more L0 files in exchange for logarithmic (instead
|
|
642
|
+
// of linear) write amplification.
|
|
643
|
+
|
|
644
|
+
// Build tier boundaries from smallest to largest.
|
|
645
|
+
// Stop at 10KB minimum — SST files of most workloads are larger than
|
|
646
|
+
// this, so lower boundaries would only waste CPU scanning L0 files.
|
|
647
|
+
// Files smaller than the lowest boundary simply merge at that boundary.
|
|
648
|
+
static constexpr uint64_t kMinTierBoundary = 10 * 1024; // 10KB
|
|
649
|
+
std::vector<uint64_t> boundaries;
|
|
650
|
+
for (uint64_t b = target; b >= kMinTierBoundary; b /= trigger) {
|
|
651
|
+
boundaries.push_back(b);
|
|
652
|
+
}
|
|
653
|
+
if (boundaries.empty()) {
|
|
654
|
+
// target itself is below kMinTierBoundary — use target as the
|
|
655
|
+
// sole boundary so we can still compact at the target size.
|
|
656
|
+
boundaries.push_back(target);
|
|
657
|
+
}
|
|
658
|
+
std::reverse(boundaries.begin(), boundaries.end());
|
|
659
|
+
|
|
660
|
+
// For each tier boundary (smallest first), scan L0 for mergeable batches.
|
|
661
|
+
// L0 files are stored newest-first; oldest is at the end.
|
|
662
|
+
for (const uint64_t boundary : boundaries) {
|
|
663
|
+
for (size_t scan = level0_files.size(); scan > 0;) {
|
|
664
|
+
// Skip files >= boundary (they belong to higher tiers) or in-progress
|
|
665
|
+
if (level0_files[scan - 1]->fd.file_size >= boundary ||
|
|
666
|
+
level0_files[scan - 1]->being_compacted) {
|
|
667
|
+
--scan;
|
|
668
|
+
continue;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// Found a file < boundary — collect contiguous batch
|
|
672
|
+
std::vector<FileMetaData*> batch;
|
|
673
|
+
uint64_t accumulated = 0;
|
|
674
|
+
size_t pos = scan;
|
|
675
|
+
while (pos > 0 && level0_files[pos - 1]->fd.file_size < boundary &&
|
|
676
|
+
!level0_files[pos - 1]->being_compacted) {
|
|
677
|
+
// Don't let output exceed 2x boundary (prevent tier-skipping)
|
|
678
|
+
if (accumulated >= boundary &&
|
|
679
|
+
accumulated + level0_files[pos - 1]->fd.file_size > boundary * 2) {
|
|
680
|
+
break;
|
|
681
|
+
}
|
|
682
|
+
batch.push_back(level0_files[pos - 1]);
|
|
683
|
+
accumulated += level0_files[pos - 1]->fd.file_size;
|
|
684
|
+
--pos;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// Viable: >= 2 files and accumulated >= boundary
|
|
688
|
+
if (batch.size() >= 2 && accumulated >= boundary) {
|
|
689
|
+
CompactionInputFiles comp_inputs;
|
|
690
|
+
comp_inputs.level = 0;
|
|
691
|
+
comp_inputs.files = std::move(batch);
|
|
692
|
+
|
|
693
|
+
ROCKS_LOG_BUFFER(
|
|
694
|
+
log_buffer,
|
|
695
|
+
"[%s] FIFO kv-ratio compaction: picking %" ROCKSDB_PRIszt
|
|
696
|
+
" files (%" PRIu64 " bytes) at tier boundary %" PRIu64
|
|
697
|
+
" for intra-L0 compaction, target=%" PRIu64,
|
|
698
|
+
cf_name.c_str(), comp_inputs.files.size(), accumulated, boundary,
|
|
699
|
+
target);
|
|
700
|
+
|
|
701
|
+
Compaction* c = new Compaction(
|
|
702
|
+
vstorage, ioptions_, mutable_cf_options, mutable_db_options,
|
|
703
|
+
{comp_inputs}, 0, boundary /* output file size limit */,
|
|
704
|
+
0 /* max compaction bytes, not applicable */,
|
|
705
|
+
0 /* output path ID */, mutable_cf_options.compression,
|
|
706
|
+
mutable_cf_options.compression_opts, Temperature::kUnknown,
|
|
707
|
+
0 /* max_subcompactions */, {},
|
|
708
|
+
/* earliest_snapshot */ std::nullopt,
|
|
709
|
+
/* snapshot_checker */ nullptr,
|
|
710
|
+
CompactionReason::kFIFOReduceNumFiles,
|
|
711
|
+
/* trim_ts */ "", vstorage->CompactionScore(0),
|
|
712
|
+
/* l0_files_might_overlap */ true);
|
|
713
|
+
return c;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// This batch wasn't enough — advance past it
|
|
717
|
+
scan = pos;
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
return nullptr;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// The full_history_ts_low parameter is used to control bottommost file marking
|
|
725
|
+
// for compaction when user-defined timestamps (UDT) are enabled.
|
|
726
|
+
|
|
727
|
+
// TODO leverage full_history_ts_low for FIFO compaction, by trigggerring
|
|
728
|
+
// compaction early for data that has already expired to achieve the goal of TTL
|
|
729
|
+
// enforced compliance.
|
|
422
730
|
Compaction* FIFOCompactionPicker::PickCompaction(
|
|
423
731
|
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
424
732
|
const MutableDBOptions& mutable_db_options,
|
|
425
733
|
const std::vector<SequenceNumber>& /* existing_snapshots */,
|
|
426
734
|
const SnapshotChecker* /* snapshot_checker */, VersionStorageInfo* vstorage,
|
|
427
|
-
LogBuffer* log_buffer,
|
|
735
|
+
LogBuffer* log_buffer, const std::string& /* full_history_ts_low */,
|
|
736
|
+
bool /* require_max_output_level*/) {
|
|
428
737
|
Compaction* c = nullptr;
|
|
429
738
|
if (mutable_cf_options.ttl > 0) {
|
|
430
739
|
c = PickTTLCompaction(cf_name, mutable_cf_options, mutable_db_options,
|
|
@@ -434,10 +743,22 @@ Compaction* FIFOCompactionPicker::PickCompaction(
|
|
|
434
743
|
c = PickSizeCompaction(cf_name, mutable_cf_options, mutable_db_options,
|
|
435
744
|
vstorage, log_buffer);
|
|
436
745
|
}
|
|
746
|
+
// Intra-L0 compaction merges small files to reduce file count.
|
|
747
|
+
// It runs after size-based dropping: if PickSizeCompaction dropped files,
|
|
748
|
+
// it returned non-null and we skip this. Otherwise, we try to reduce
|
|
749
|
+
// L0 file count by merging small files together.
|
|
750
|
+
if (c == nullptr) {
|
|
751
|
+
c = PickIntraL0Compaction(cf_name, mutable_cf_options, mutable_db_options,
|
|
752
|
+
vstorage, log_buffer);
|
|
753
|
+
}
|
|
437
754
|
if (c == nullptr) {
|
|
438
755
|
c = PickTemperatureChangeCompaction(
|
|
439
756
|
cf_name, mutable_cf_options, mutable_db_options, vstorage, log_buffer);
|
|
440
757
|
}
|
|
758
|
+
if (c == nullptr) {
|
|
759
|
+
ROCKS_LOG_BUFFER(log_buffer, "[%s] FIFO compaction: no compaction picked",
|
|
760
|
+
cf_name.c_str());
|
|
761
|
+
}
|
|
441
762
|
RegisterCompaction(c);
|
|
442
763
|
return c;
|
|
443
764
|
}
|
|
@@ -449,7 +770,8 @@ Compaction* FIFOCompactionPicker::PickCompactionForCompactRange(
|
|
|
449
770
|
const CompactRangeOptions& /*compact_range_options*/,
|
|
450
771
|
const InternalKey* /*begin*/, const InternalKey* /*end*/,
|
|
451
772
|
InternalKey** compaction_end, bool* /*manual_conflict*/,
|
|
452
|
-
uint64_t /*max_file_num_to_ignore*/, const std::string& /*trim_ts
|
|
773
|
+
uint64_t /*max_file_num_to_ignore*/, const std::string& /*trim_ts*/,
|
|
774
|
+
const std::string& full_history_ts_low) {
|
|
453
775
|
#ifdef NDEBUG
|
|
454
776
|
(void)input_level;
|
|
455
777
|
(void)output_level;
|
|
@@ -458,10 +780,10 @@ Compaction* FIFOCompactionPicker::PickCompactionForCompactRange(
|
|
|
458
780
|
assert(output_level == 0);
|
|
459
781
|
*compaction_end = nullptr;
|
|
460
782
|
LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, ioptions_.logger);
|
|
461
|
-
Compaction* c =
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
783
|
+
Compaction* c = PickCompaction(
|
|
784
|
+
cf_name, mutable_cf_options, mutable_db_options,
|
|
785
|
+
/*existing_snapshots*/ {}, /*snapshot_checker*/ nullptr, vstorage,
|
|
786
|
+
&log_buffer, full_history_ts_low, /* require_max_output_level */ false);
|
|
465
787
|
log_buffer.FlushBufferToLog();
|
|
466
788
|
return c;
|
|
467
789
|
}
|
|
@@ -24,6 +24,7 @@ class FIFOCompactionPicker : public CompactionPicker {
|
|
|
24
24
|
const std::vector<SequenceNumber>& /* existing_snapshots */,
|
|
25
25
|
const SnapshotChecker* /* snapshot_checker */,
|
|
26
26
|
VersionStorageInfo* version, LogBuffer* log_buffer,
|
|
27
|
+
const std::string& /* full_history_ts_low */,
|
|
27
28
|
bool /* require_max_output_level*/ = false) override;
|
|
28
29
|
|
|
29
30
|
Compaction* PickCompactionForCompactRange(
|
|
@@ -33,7 +34,8 @@ class FIFOCompactionPicker : public CompactionPicker {
|
|
|
33
34
|
const CompactRangeOptions& compact_range_options,
|
|
34
35
|
const InternalKey* begin, const InternalKey* end,
|
|
35
36
|
InternalKey** compaction_end, bool* manual_conflict,
|
|
36
|
-
uint64_t max_file_num_to_ignore, const std::string& trim_ts
|
|
37
|
+
uint64_t max_file_num_to_ignore, const std::string& trim_ts,
|
|
38
|
+
const std::string& full_history_ts_low) override;
|
|
37
39
|
|
|
38
40
|
// The maximum allowed output level. Always returns 0.
|
|
39
41
|
int MaxOutputLevel() const override { return 0; }
|
|
@@ -53,6 +55,28 @@ class FIFOCompactionPicker : public CompactionPicker {
|
|
|
53
55
|
VersionStorageInfo* version,
|
|
54
56
|
LogBuffer* log_buffer);
|
|
55
57
|
|
|
58
|
+
// Intra-L0 compaction: merges small L0 files to reduce file count.
|
|
59
|
+
// Dispatches between two strategies based on configuration:
|
|
60
|
+
// - use_kv_ratio_compaction = true: PickRatioBasedIntraL0Compaction
|
|
61
|
+
// (BlobDB-optimized)
|
|
62
|
+
// - use_kv_ratio_compaction = false: PickCostBasedIntraL0Compaction
|
|
63
|
+
// (original)
|
|
64
|
+
// Only active when allow_compaction = true.
|
|
65
|
+
Compaction* PickIntraL0Compaction(const std::string& cf_name,
|
|
66
|
+
const MutableCFOptions& mutable_cf_options,
|
|
67
|
+
const MutableDBOptions& mutable_db_options,
|
|
68
|
+
VersionStorageInfo* vstorage,
|
|
69
|
+
LogBuffer* log_buffer);
|
|
70
|
+
|
|
71
|
+
// Capacity-derived intra-L0 compaction for BlobDB workloads.
|
|
72
|
+
// Uses the observed SST/blob ratio to compute a target file size,
|
|
73
|
+
// producing uniform files for predictable FIFO trimming.
|
|
74
|
+
// Called from PickIntraL0Compaction when use_kv_ratio_compaction = true.
|
|
75
|
+
Compaction* PickRatioBasedIntraL0Compaction(
|
|
76
|
+
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
77
|
+
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
78
|
+
LogBuffer* log_buffer);
|
|
79
|
+
|
|
56
80
|
// Will pick one file to compact at a time, starting from the oldest file.
|
|
57
81
|
Compaction* PickTemperatureChangeCompaction(
|
|
58
82
|
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|