@nxtedition/rocksdb 7.1.20 → 7.1.21
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 +13 -6
- package/deps/rocksdb/rocksdb/Makefile +1 -1
- package/deps/rocksdb/rocksdb/TARGETS +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
- package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
- package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
- package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
- package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
- package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
- package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
- package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
- package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
- package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
- package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
- package/deps/rocksdb/rocksdb/src.mk +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
- package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
- package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
- package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
- package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
- package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
- package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
- package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
- package/index.js +12 -4
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -121,20 +121,45 @@ Compaction* FIFOCompactionPicker::PickTTLCompaction(
|
|
|
121
121
|
return c;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
// The size-based compaction picker for FIFO.
|
|
125
|
+
//
|
|
126
|
+
// When the entire column family size exceeds max_table_files_size, FIFO will
|
|
127
|
+
// try to delete the oldest sst file(s) until the resulting column family size
|
|
128
|
+
// is smaller than max_table_files_size.
|
|
129
|
+
//
|
|
130
|
+
// This function also takes care the case where a DB is migrating from level /
|
|
131
|
+
// universal compaction to FIFO compaction. During the migration, the column
|
|
132
|
+
// family will also have non-L0 files while FIFO can only create L0 files.
|
|
133
|
+
// In this case, this function will first purge the sst files in the bottom-
|
|
134
|
+
// most non-empty level first, and the DB will eventually converge to the
|
|
135
|
+
// regular FIFO case where there're only L0 files. Note that during the
|
|
136
|
+
// migration case, the purge order will only be an approximation of "FIFO"
|
|
137
|
+
// as entries inside lower-level files might sometimes be newer than some
|
|
138
|
+
// entries inside upper-level files.
|
|
124
139
|
Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
125
140
|
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
126
141
|
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
127
142
|
LogBuffer* log_buffer) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
uint64_t total_size =
|
|
143
|
+
// compute the total size and identify the last non-empty level
|
|
144
|
+
int last_level = 0;
|
|
145
|
+
uint64_t total_size = 0;
|
|
146
|
+
for (int level = 0; level < vstorage->num_levels(); ++level) {
|
|
147
|
+
auto level_size = GetTotalFilesSize(vstorage->LevelFiles(level));
|
|
148
|
+
total_size += level_size;
|
|
149
|
+
if (level_size > 0) {
|
|
150
|
+
last_level = level;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const std::vector<FileMetaData*>& last_level_files =
|
|
154
|
+
vstorage->LevelFiles(last_level);
|
|
131
155
|
|
|
132
|
-
if (
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// total size not exceeded
|
|
156
|
+
if (last_level == 0 &&
|
|
157
|
+
total_size <=
|
|
158
|
+
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
|
|
159
|
+
// total size not exceeded, try to find intra level 0 compaction if enabled
|
|
160
|
+
const std::vector<FileMetaData*>& level0_files = vstorage->LevelFiles(0);
|
|
136
161
|
if (mutable_cf_options.compaction_options_fifo.allow_compaction &&
|
|
137
|
-
|
|
162
|
+
level0_files.size() > 0) {
|
|
138
163
|
CompactionInputFiles comp_inputs;
|
|
139
164
|
// try to prevent same files from being compacted multiple times, which
|
|
140
165
|
// could produce large files that may never TTL-expire. Achieve this by
|
|
@@ -146,7 +171,7 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
|
146
171
|
static_cast<uint64_t>(mutable_cf_options.write_buffer_size),
|
|
147
172
|
1.1));
|
|
148
173
|
if (FindIntraL0Compaction(
|
|
149
|
-
|
|
174
|
+
level0_files,
|
|
150
175
|
mutable_cf_options
|
|
151
176
|
.level0_file_num_compaction_trigger /* min_files_to_compact */
|
|
152
177
|
,
|
|
@@ -187,27 +212,58 @@ Compaction* FIFOCompactionPicker::PickSizeCompaction(
|
|
|
187
212
|
|
|
188
213
|
std::vector<CompactionInputFiles> inputs;
|
|
189
214
|
inputs.emplace_back();
|
|
190
|
-
inputs[0].level =
|
|
215
|
+
inputs[0].level = last_level;
|
|
191
216
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
217
|
+
if (last_level == 0) {
|
|
218
|
+
// In L0, right-most files are the oldest files.
|
|
219
|
+
for (auto ritr = last_level_files.rbegin(); ritr != last_level_files.rend();
|
|
220
|
+
++ritr) {
|
|
221
|
+
auto f = *ritr;
|
|
222
|
+
total_size -= f->fd.file_size;
|
|
223
|
+
inputs[0].files.push_back(f);
|
|
224
|
+
char tmp_fsize[16];
|
|
225
|
+
AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
|
|
226
|
+
ROCKS_LOG_BUFFER(log_buffer,
|
|
227
|
+
"[%s] FIFO compaction: picking file %" PRIu64
|
|
228
|
+
" with size %s for deletion",
|
|
229
|
+
cf_name.c_str(), f->fd.GetNumber(), tmp_fsize);
|
|
230
|
+
if (total_size <=
|
|
231
|
+
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
} else {
|
|
236
|
+
// If the last level is non-L0, we actually don't know which file is
|
|
237
|
+
// logically the oldest since the file creation time only represents
|
|
238
|
+
// when this file was compacted to this level, which is independent
|
|
239
|
+
// to when the entries in this file were first inserted.
|
|
240
|
+
//
|
|
241
|
+
// As a result, we delete files from the left instead. This means the sst
|
|
242
|
+
// file with the smallest key will be deleted first. This design decision
|
|
243
|
+
// better serves a major type of FIFO use cases where smaller keys are
|
|
244
|
+
// associated with older data.
|
|
245
|
+
for (const auto& f : last_level_files) {
|
|
246
|
+
total_size -= f->fd.file_size;
|
|
247
|
+
inputs[0].files.push_back(f);
|
|
248
|
+
char tmp_fsize[16];
|
|
249
|
+
AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
|
|
250
|
+
ROCKS_LOG_BUFFER(log_buffer,
|
|
251
|
+
"[%s] FIFO compaction: picking file %" PRIu64
|
|
252
|
+
" with size %s for deletion",
|
|
253
|
+
cf_name.c_str(), f->fd.GetNumber(), tmp_fsize);
|
|
254
|
+
if (total_size <=
|
|
255
|
+
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
205
258
|
}
|
|
206
259
|
}
|
|
207
260
|
|
|
208
261
|
Compaction* c = new Compaction(
|
|
209
262
|
vstorage, ioptions_, mutable_cf_options, mutable_db_options,
|
|
210
|
-
std::move(inputs),
|
|
263
|
+
std::move(inputs), last_level,
|
|
264
|
+
/* target_file_size */ 0,
|
|
265
|
+
/* max_compaction_bytes */ 0,
|
|
266
|
+
/* output_path_id */ 0, kNoCompression,
|
|
211
267
|
mutable_cf_options.compression_opts, Temperature::kUnknown,
|
|
212
268
|
/* max_subcompactions */ 0, {}, /* is manual */ false,
|
|
213
269
|
/* trim_ts */ "", vstorage->CompactionScore(0),
|
|
@@ -224,6 +280,13 @@ Compaction* FIFOCompactionPicker::PickCompactionToWarm(
|
|
|
224
280
|
return nullptr;
|
|
225
281
|
}
|
|
226
282
|
|
|
283
|
+
// PickCompactionToWarm is only triggered if there is no non-L0 files.
|
|
284
|
+
for (int level = 1; level < vstorage->num_levels(); ++level) {
|
|
285
|
+
if (GetTotalFilesSize(vstorage->LevelFiles(level)) > 0) {
|
|
286
|
+
return nullptr;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
227
290
|
const int kLevel0 = 0;
|
|
228
291
|
const std::vector<FileMetaData*>& level_files = vstorage->LevelFiles(kLevel0);
|
|
229
292
|
|
|
@@ -327,8 +390,6 @@ Compaction* FIFOCompactionPicker::PickCompaction(
|
|
|
327
390
|
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
328
391
|
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
329
392
|
LogBuffer* log_buffer, SequenceNumber /*earliest_memtable_seqno*/) {
|
|
330
|
-
assert(vstorage->num_levels() == 1);
|
|
331
|
-
|
|
332
393
|
Compaction* c = nullptr;
|
|
333
394
|
if (mutable_cf_options.ttl > 0) {
|
|
334
395
|
c = PickTTLCompaction(cf_name, mutable_cf_options, mutable_db_options,
|
|
@@ -254,6 +254,25 @@ void LevelCompactionBuilder::SetupInitialFiles() {
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
// TTL Compaction
|
|
257
|
+
if (ioptions_.compaction_pri == kRoundRobin &&
|
|
258
|
+
!vstorage_->ExpiredTtlFiles().empty()) {
|
|
259
|
+
auto expired_files = vstorage_->ExpiredTtlFiles();
|
|
260
|
+
// the expired files list should already be sorted by level
|
|
261
|
+
start_level_ = expired_files.front().first;
|
|
262
|
+
#ifndef NDEBUG
|
|
263
|
+
for (const auto& file : expired_files) {
|
|
264
|
+
assert(start_level_ <= file.first);
|
|
265
|
+
}
|
|
266
|
+
#endif
|
|
267
|
+
if (start_level_ > 0) {
|
|
268
|
+
output_level_ = start_level_ + 1;
|
|
269
|
+
if (PickFileToCompact()) {
|
|
270
|
+
compaction_reason_ = CompactionReason::kRoundRobinTtl;
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
257
276
|
PickFileToCompact(vstorage_->ExpiredTtlFiles(), true);
|
|
258
277
|
if (!start_level_inputs_.empty()) {
|
|
259
278
|
compaction_reason_ = CompactionReason::kTtl;
|
|
@@ -318,7 +337,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
|
|
|
318
337
|
// Constraint 3 (pre-calculate the ideal max bytes to compact)
|
|
319
338
|
for (auto f : level_files) {
|
|
320
339
|
if (!f->being_compacted) {
|
|
321
|
-
start_lvl_bytes_no_compacting += f->
|
|
340
|
+
start_lvl_bytes_no_compacting += f->fd.GetFileSize();
|
|
322
341
|
}
|
|
323
342
|
}
|
|
324
343
|
if (start_lvl_bytes_no_compacting >
|
|
@@ -341,7 +360,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
|
|
|
341
360
|
}
|
|
342
361
|
}
|
|
343
362
|
// Constraint 3
|
|
344
|
-
if (start_level_inputs_[0]->
|
|
363
|
+
if (start_level_inputs_[0]->fd.GetFileSize() >=
|
|
345
364
|
start_lvl_max_bytes_to_compact) {
|
|
346
365
|
return;
|
|
347
366
|
}
|
|
@@ -368,7 +387,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
|
|
|
368
387
|
|
|
369
388
|
curr_bytes_to_compact = 0;
|
|
370
389
|
for (auto start_lvl_f : tmp_start_level_inputs.files) {
|
|
371
|
-
curr_bytes_to_compact += start_lvl_f->
|
|
390
|
+
curr_bytes_to_compact += start_lvl_f->fd.GetFileSize();
|
|
372
391
|
}
|
|
373
392
|
|
|
374
393
|
// Check whether any output level files are locked
|
|
@@ -385,7 +404,7 @@ void LevelCompactionBuilder::SetupOtherFilesWithRoundRobinExpansion() {
|
|
|
385
404
|
|
|
386
405
|
uint64_t start_lvl_curr_bytes_to_compact = curr_bytes_to_compact;
|
|
387
406
|
for (auto output_lvl_f : output_level_inputs.files) {
|
|
388
|
-
curr_bytes_to_compact += output_lvl_f->
|
|
407
|
+
curr_bytes_to_compact += output_lvl_f->fd.GetFileSize();
|
|
389
408
|
}
|
|
390
409
|
if (curr_bytes_to_compact > mutable_cf_options_.max_compaction_bytes) {
|
|
391
410
|
// Constraint 2
|
|
@@ -1340,6 +1340,7 @@ TEST_F(CompactionPickerTest, CompactionPriMinOverlapping4) {
|
|
|
1340
1340
|
ioptions_.compaction_pri = kMinOverlappingRatio;
|
|
1341
1341
|
mutable_cf_options_.max_bytes_for_level_base = 10000000;
|
|
1342
1342
|
mutable_cf_options_.max_bytes_for_level_multiplier = 10;
|
|
1343
|
+
mutable_cf_options_.ignore_max_compaction_bytes_for_input = false;
|
|
1343
1344
|
|
|
1344
1345
|
// file 7 and 8 over lap with the same file, but file 8 is smaller so
|
|
1345
1346
|
// it will be picked.
|
|
@@ -2358,6 +2359,7 @@ TEST_F(CompactionPickerTest, IsBottommostLevelTest) {
|
|
|
2358
2359
|
TEST_F(CompactionPickerTest, MaxCompactionBytesHit) {
|
|
2359
2360
|
mutable_cf_options_.max_bytes_for_level_base = 1000000u;
|
|
2360
2361
|
mutable_cf_options_.max_compaction_bytes = 800000u;
|
|
2362
|
+
mutable_cf_options_.ignore_max_compaction_bytes_for_input = false;
|
|
2361
2363
|
ioptions_.level_compaction_dynamic_level_bytes = false;
|
|
2362
2364
|
NewVersionStorage(6, kCompactionStyleLevel);
|
|
2363
2365
|
// A compaction should be triggered and pick file 2 and 5.
|
|
@@ -2384,6 +2386,7 @@ TEST_F(CompactionPickerTest, MaxCompactionBytesHit) {
|
|
|
2384
2386
|
TEST_F(CompactionPickerTest, MaxCompactionBytesNotHit) {
|
|
2385
2387
|
mutable_cf_options_.max_bytes_for_level_base = 800000u;
|
|
2386
2388
|
mutable_cf_options_.max_compaction_bytes = 1000000u;
|
|
2389
|
+
mutable_cf_options_.ignore_max_compaction_bytes_for_input = false;
|
|
2387
2390
|
ioptions_.level_compaction_dynamic_level_bytes = false;
|
|
2388
2391
|
NewVersionStorage(6, kCompactionStyleLevel);
|
|
2389
2392
|
// A compaction should be triggered and pick file 2 and 5.
|
|
@@ -3656,6 +3659,63 @@ TEST_P(PerKeyPlacementCompactionPickerTest, NormalCompactionOverlapUniversal) {
|
|
|
3656
3659
|
input_files, 5));
|
|
3657
3660
|
}
|
|
3658
3661
|
|
|
3662
|
+
TEST_P(PerKeyPlacementCompactionPickerTest, PenultimateOverlapUniversal) {
|
|
3663
|
+
// This test is make sure the Tiered compaction would lock whole range of
|
|
3664
|
+
// both output level and penultimate level
|
|
3665
|
+
if (enable_per_key_placement_) {
|
|
3666
|
+
ioptions_.preclude_last_level_data_seconds = 10000;
|
|
3667
|
+
}
|
|
3668
|
+
|
|
3669
|
+
int num_levels = ioptions_.num_levels;
|
|
3670
|
+
ioptions_.compaction_style = kCompactionStyleUniversal;
|
|
3671
|
+
UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
|
|
3672
|
+
NewVersionStorage(num_levels, kCompactionStyleUniversal);
|
|
3673
|
+
|
|
3674
|
+
// L4: [200, 220] [230, 250] [360, 380]
|
|
3675
|
+
// L5:
|
|
3676
|
+
// L6: [101, 351]
|
|
3677
|
+
Add(4, 40U, "200", "220", 60000000U);
|
|
3678
|
+
Add(4, 41U, "230", "250", 60000000U);
|
|
3679
|
+
Add(4, 42U, "360", "380", 60000000U);
|
|
3680
|
+
Add(6, 50U, "101", "351", 60000000U);
|
|
3681
|
+
UpdateVersionStorageInfo();
|
|
3682
|
+
|
|
3683
|
+
// the existing compaction is the 1st L4 file + L6 file
|
|
3684
|
+
// then compaction of the 2nd L4 file to L5 (penultimate level) is overlapped
|
|
3685
|
+
// when the tiered compaction feature is on.
|
|
3686
|
+
CompactionOptions comp_options;
|
|
3687
|
+
std::unordered_set<uint64_t> input_set;
|
|
3688
|
+
input_set.insert(40);
|
|
3689
|
+
input_set.insert(50);
|
|
3690
|
+
std::vector<CompactionInputFiles> input_files;
|
|
3691
|
+
ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
|
|
3692
|
+
&input_files, &input_set, vstorage_.get(), comp_options));
|
|
3693
|
+
|
|
3694
|
+
std::unique_ptr<Compaction> comp1(universal_compaction_picker.CompactFiles(
|
|
3695
|
+
comp_options, input_files, 6, vstorage_.get(), mutable_cf_options_,
|
|
3696
|
+
mutable_db_options_, 0));
|
|
3697
|
+
|
|
3698
|
+
input_set.clear();
|
|
3699
|
+
input_files.clear();
|
|
3700
|
+
input_set.insert(41);
|
|
3701
|
+
ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
|
|
3702
|
+
&input_files, &input_set, vstorage_.get(), comp_options));
|
|
3703
|
+
|
|
3704
|
+
ASSERT_EQ(enable_per_key_placement_,
|
|
3705
|
+
universal_compaction_picker.FilesRangeOverlapWithCompaction(
|
|
3706
|
+
input_files, 5));
|
|
3707
|
+
|
|
3708
|
+
// compacting the 3rd L4 file is always safe:
|
|
3709
|
+
input_set.clear();
|
|
3710
|
+
input_files.clear();
|
|
3711
|
+
input_set.insert(42);
|
|
3712
|
+
ASSERT_OK(universal_compaction_picker.GetCompactionInputsFromFileNumbers(
|
|
3713
|
+
&input_files, &input_set, vstorage_.get(), comp_options));
|
|
3714
|
+
|
|
3715
|
+
ASSERT_FALSE(universal_compaction_picker.FilesRangeOverlapWithCompaction(
|
|
3716
|
+
input_files, 5));
|
|
3717
|
+
}
|
|
3718
|
+
|
|
3659
3719
|
INSTANTIATE_TEST_CASE_P(PerKeyPlacementCompactionPickerTest,
|
|
3660
3720
|
PerKeyPlacementCompactionPickerTest, ::testing::Bool());
|
|
3661
3721
|
|
|
@@ -3664,6 +3724,7 @@ INSTANTIATE_TEST_CASE_P(PerKeyPlacementCompactionPickerTest,
|
|
|
3664
3724
|
} // namespace ROCKSDB_NAMESPACE
|
|
3665
3725
|
|
|
3666
3726
|
int main(int argc, char** argv) {
|
|
3727
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
3667
3728
|
::testing::InitGoogleTest(&argc, argv);
|
|
3668
3729
|
return RUN_ALL_TESTS();
|
|
3669
3730
|
}
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
#include "db/db_test_util.h"
|
|
12
12
|
#include "port/stack_trace.h"
|
|
13
13
|
#include "rocksdb/listener.h"
|
|
14
|
+
#include "rocksdb/utilities/debug.h"
|
|
15
|
+
#include "test_util/mock_time_env.h"
|
|
14
16
|
|
|
15
17
|
namespace ROCKSDB_NAMESPACE {
|
|
16
18
|
|
|
@@ -416,36 +418,18 @@ TEST_P(TieredCompactionTest, RangeBasedTieredStorageUniversal) {
|
|
|
416
418
|
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
|
|
417
419
|
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
418
420
|
|
|
419
|
-
// Add 2 keys in higher level, but in separated files,
|
|
420
|
-
//
|
|
421
|
+
// Add 2 keys in higher level, but in separated files, all keys can be moved
|
|
422
|
+
// up if it's hot
|
|
421
423
|
ASSERT_OK(Put(Key(0), "value" + std::to_string(0)));
|
|
422
424
|
ASSERT_OK(Flush());
|
|
423
425
|
ASSERT_OK(Put(Key(50), "value" + std::to_string(0)));
|
|
424
426
|
ASSERT_OK(Flush());
|
|
425
|
-
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
|
|
426
|
-
ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
|
|
427
|
-
|
|
428
|
-
// Add an SST with a key range cover all the data we want to move from the
|
|
429
|
-
// last level to the penultimate level
|
|
430
|
-
ASSERT_OK(Put(Key(0), "value" + std::to_string(0)));
|
|
431
|
-
ASSERT_OK(Put(Key(99), "value" + std::to_string(0)));
|
|
432
|
-
ASSERT_OK(Flush());
|
|
433
|
-
|
|
434
|
-
ResetAllStats(expect_stats, expect_pl_stats);
|
|
435
|
-
|
|
436
427
|
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
|
|
437
428
|
ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
|
|
429
|
+
|
|
438
430
|
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
439
431
|
ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
|
|
440
432
|
|
|
441
|
-
last_stats.Add(kBasicCompStats);
|
|
442
|
-
last_stats.ResetCompactionReason(CompactionReason::kManualCompaction);
|
|
443
|
-
last_stats.bytes_read_output_level = kHasValue;
|
|
444
|
-
last_stats.num_input_files_in_output_level = kHasValue;
|
|
445
|
-
expect_pl_stats.Add(kBasicPerKeyPlacementCompStats);
|
|
446
|
-
expect_pl_stats.ResetCompactionReason(CompactionReason::kManualCompaction);
|
|
447
|
-
VerifyCompactionStats(expect_stats, expect_pl_stats);
|
|
448
|
-
|
|
449
433
|
// change to only 1 key cold, to test compaction could stop even it matches
|
|
450
434
|
// size amp compaction threshold
|
|
451
435
|
{
|
|
@@ -1215,6 +1199,295 @@ TEST_P(TieredCompactionTest, RangeBasedTieredStorageLevel) {
|
|
|
1215
1199
|
INSTANTIATE_TEST_CASE_P(TieredCompactionTest, TieredCompactionTest,
|
|
1216
1200
|
testing::Bool());
|
|
1217
1201
|
|
|
1202
|
+
class PrecludeLastLevelTest : public DBTestBase {
|
|
1203
|
+
public:
|
|
1204
|
+
PrecludeLastLevelTest()
|
|
1205
|
+
: DBTestBase("preclude_last_level_test", /*env_do_fsync=*/false) {
|
|
1206
|
+
mock_clock_ = std::make_shared<MockSystemClock>(env_->GetSystemClock());
|
|
1207
|
+
mock_env_ = std::make_unique<CompositeEnvWrapper>(env_, mock_clock_);
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
protected:
|
|
1211
|
+
std::unique_ptr<Env> mock_env_;
|
|
1212
|
+
std::shared_ptr<MockSystemClock> mock_clock_;
|
|
1213
|
+
|
|
1214
|
+
void SetUp() override {
|
|
1215
|
+
mock_clock_->InstallTimedWaitFixCallback();
|
|
1216
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1217
|
+
"DBImpl::StartPeriodicTaskScheduler:Init", [&](void* arg) {
|
|
1218
|
+
auto periodic_task_scheduler_ptr =
|
|
1219
|
+
reinterpret_cast<PeriodicTaskScheduler*>(arg);
|
|
1220
|
+
periodic_task_scheduler_ptr->TEST_OverrideTimer(mock_clock_.get());
|
|
1221
|
+
});
|
|
1222
|
+
mock_clock_->SetCurrentTime(0);
|
|
1223
|
+
}
|
|
1224
|
+
};
|
|
1225
|
+
|
|
1226
|
+
TEST_F(PrecludeLastLevelTest, MigrationFromPreserveTimeManualCompaction) {
|
|
1227
|
+
const int kNumTrigger = 4;
|
|
1228
|
+
const int kNumLevels = 7;
|
|
1229
|
+
const int kNumKeys = 100;
|
|
1230
|
+
const int kKeyPerSec = 10;
|
|
1231
|
+
|
|
1232
|
+
Options options = CurrentOptions();
|
|
1233
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1234
|
+
options.preserve_internal_time_seconds = 10000;
|
|
1235
|
+
options.env = mock_env_.get();
|
|
1236
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1237
|
+
options.num_levels = kNumLevels;
|
|
1238
|
+
DestroyAndReopen(options);
|
|
1239
|
+
|
|
1240
|
+
// pass some time first, otherwise the first a few keys write time are going
|
|
1241
|
+
// to be zero, and internally zero has special meaning: kUnknownSeqnoTime
|
|
1242
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1243
|
+
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
|
|
1244
|
+
|
|
1245
|
+
int sst_num = 0;
|
|
1246
|
+
// Write files that are overlap and enough to trigger compaction
|
|
1247
|
+
for (; sst_num < kNumTrigger; sst_num++) {
|
|
1248
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1249
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
|
|
1250
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1251
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
|
|
1252
|
+
});
|
|
1253
|
+
}
|
|
1254
|
+
ASSERT_OK(Flush());
|
|
1255
|
+
}
|
|
1256
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1257
|
+
|
|
1258
|
+
// all data is pushed to the last level
|
|
1259
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1260
|
+
|
|
1261
|
+
// enable preclude feature
|
|
1262
|
+
options.preclude_last_level_data_seconds = 10000;
|
|
1263
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1264
|
+
Reopen(options);
|
|
1265
|
+
|
|
1266
|
+
// all data is hot, even they're in the last level
|
|
1267
|
+
ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1268
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1269
|
+
|
|
1270
|
+
// Generate a sstable and trigger manual compaction
|
|
1271
|
+
ASSERT_OK(Put(Key(10), "value"));
|
|
1272
|
+
ASSERT_OK(Flush());
|
|
1273
|
+
|
|
1274
|
+
CompactRangeOptions cro;
|
|
1275
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
1276
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
1277
|
+
|
|
1278
|
+
// all data is moved up to the penultimate level
|
|
1279
|
+
ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
|
|
1280
|
+
ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1281
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1282
|
+
|
|
1283
|
+
// close explicitly, because the env is local variable which will be released
|
|
1284
|
+
// first.
|
|
1285
|
+
Close();
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
TEST_F(PrecludeLastLevelTest, MigrationFromPreserveTimeAutoCompaction) {
|
|
1289
|
+
const int kNumTrigger = 4;
|
|
1290
|
+
const int kNumLevels = 7;
|
|
1291
|
+
const int kNumKeys = 100;
|
|
1292
|
+
const int kKeyPerSec = 10;
|
|
1293
|
+
|
|
1294
|
+
Options options = CurrentOptions();
|
|
1295
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1296
|
+
options.preserve_internal_time_seconds = 10000;
|
|
1297
|
+
options.env = mock_env_.get();
|
|
1298
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1299
|
+
options.num_levels = kNumLevels;
|
|
1300
|
+
DestroyAndReopen(options);
|
|
1301
|
+
|
|
1302
|
+
// pass some time first, otherwise the first a few keys write time are going
|
|
1303
|
+
// to be zero, and internally zero has special meaning: kUnknownSeqnoTime
|
|
1304
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1305
|
+
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
|
|
1306
|
+
|
|
1307
|
+
int sst_num = 0;
|
|
1308
|
+
// Write files that are overlap and enough to trigger compaction
|
|
1309
|
+
for (; sst_num < kNumTrigger; sst_num++) {
|
|
1310
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1311
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
|
|
1312
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1313
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
|
|
1314
|
+
});
|
|
1315
|
+
}
|
|
1316
|
+
ASSERT_OK(Flush());
|
|
1317
|
+
}
|
|
1318
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1319
|
+
|
|
1320
|
+
// all data is pushed to the last level
|
|
1321
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1322
|
+
|
|
1323
|
+
// enable preclude feature
|
|
1324
|
+
options.preclude_last_level_data_seconds = 10000;
|
|
1325
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1326
|
+
// make sure it won't trigger Size Amp compaction, unlike normal Size Amp
|
|
1327
|
+
// compaction which is typically a last level compaction, when tiered Storage
|
|
1328
|
+
// ("preclude_last_level") is enabled, size amp won't include the last level.
|
|
1329
|
+
// As the last level would be in cold tier and the size would not be a
|
|
1330
|
+
// problem, which also avoid frequent hot to cold storage compaction.
|
|
1331
|
+
options.compaction_options_universal.max_size_amplification_percent = 400;
|
|
1332
|
+
Reopen(options);
|
|
1333
|
+
|
|
1334
|
+
// all data is hot, even they're in the last level
|
|
1335
|
+
ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1336
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1337
|
+
|
|
1338
|
+
// Write more data, but still all hot until the 10th SST, as:
|
|
1339
|
+
// write a key every 10 seconds, 100 keys per SST, each SST takes 1000 seconds
|
|
1340
|
+
// The preclude_last_level_data_seconds is 10k
|
|
1341
|
+
Random rnd(301);
|
|
1342
|
+
for (; sst_num < kNumTrigger * 2 - 1; sst_num++) {
|
|
1343
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1344
|
+
// the value needs to be big enough to trigger full compaction
|
|
1345
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), rnd.RandomString(100)));
|
|
1346
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1347
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1350
|
+
ASSERT_OK(Flush());
|
|
1351
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
// all data is moved up to the penultimate level
|
|
1355
|
+
ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
|
|
1356
|
+
ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1357
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1358
|
+
|
|
1359
|
+
// close explicitly, because the env is local variable which will be released
|
|
1360
|
+
// first.
|
|
1361
|
+
Close();
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
TEST_F(PrecludeLastLevelTest, MigrationFromPreserveTimePartial) {
|
|
1365
|
+
const int kNumTrigger = 4;
|
|
1366
|
+
const int kNumLevels = 7;
|
|
1367
|
+
const int kNumKeys = 100;
|
|
1368
|
+
const int kKeyPerSec = 10;
|
|
1369
|
+
|
|
1370
|
+
Options options = CurrentOptions();
|
|
1371
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1372
|
+
options.preserve_internal_time_seconds = 2000;
|
|
1373
|
+
options.env = mock_env_.get();
|
|
1374
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1375
|
+
options.num_levels = kNumLevels;
|
|
1376
|
+
DestroyAndReopen(options);
|
|
1377
|
+
|
|
1378
|
+
// pass some time first, otherwise the first a few keys write time are going
|
|
1379
|
+
// to be zero, and internally zero has special meaning: kUnknownSeqnoTime
|
|
1380
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1381
|
+
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
|
|
1382
|
+
|
|
1383
|
+
int sst_num = 0;
|
|
1384
|
+
// Write files that are overlap and enough to trigger compaction
|
|
1385
|
+
for (; sst_num < kNumTrigger; sst_num++) {
|
|
1386
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1387
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
|
|
1388
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1389
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
|
|
1390
|
+
});
|
|
1391
|
+
}
|
|
1392
|
+
ASSERT_OK(Flush());
|
|
1393
|
+
}
|
|
1394
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1395
|
+
|
|
1396
|
+
// all data is pushed to the last level
|
|
1397
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1398
|
+
|
|
1399
|
+
std::vector<KeyVersion> key_versions;
|
|
1400
|
+
ASSERT_OK(GetAllKeyVersions(db_, Slice(), Slice(),
|
|
1401
|
+
std::numeric_limits<size_t>::max(),
|
|
1402
|
+
&key_versions));
|
|
1403
|
+
|
|
1404
|
+
// make sure there're more than 300 keys and first 100 keys are having seqno
|
|
1405
|
+
// zeroed out, the last 100 key seqno not zeroed out
|
|
1406
|
+
ASSERT_GT(key_versions.size(), 300);
|
|
1407
|
+
for (int i = 0; i < 100; i++) {
|
|
1408
|
+
ASSERT_EQ(key_versions[i].sequence, 0);
|
|
1409
|
+
}
|
|
1410
|
+
auto rit = key_versions.rbegin();
|
|
1411
|
+
for (int i = 0; i < 100; i++) {
|
|
1412
|
+
ASSERT_GT(rit->sequence, 0);
|
|
1413
|
+
rit++;
|
|
1414
|
+
}
|
|
1415
|
+
|
|
1416
|
+
// enable preclude feature
|
|
1417
|
+
options.preclude_last_level_data_seconds = 2000;
|
|
1418
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1419
|
+
Reopen(options);
|
|
1420
|
+
|
|
1421
|
+
// Generate a sstable and trigger manual compaction
|
|
1422
|
+
ASSERT_OK(Put(Key(10), "value"));
|
|
1423
|
+
ASSERT_OK(Flush());
|
|
1424
|
+
|
|
1425
|
+
CompactRangeOptions cro;
|
|
1426
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
1427
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
1428
|
+
|
|
1429
|
+
// some data are moved up, some are not
|
|
1430
|
+
ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
|
|
1431
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1432
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1433
|
+
|
|
1434
|
+
Close();
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
TEST_F(PrecludeLastLevelTest, SmallPrecludeTime) {
|
|
1438
|
+
const int kNumTrigger = 4;
|
|
1439
|
+
const int kNumLevels = 7;
|
|
1440
|
+
const int kNumKeys = 100;
|
|
1441
|
+
|
|
1442
|
+
Options options = CurrentOptions();
|
|
1443
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1444
|
+
options.preclude_last_level_data_seconds = 60;
|
|
1445
|
+
options.preserve_internal_time_seconds = 0;
|
|
1446
|
+
options.env = mock_env_.get();
|
|
1447
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1448
|
+
options.num_levels = kNumLevels;
|
|
1449
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1450
|
+
DestroyAndReopen(options);
|
|
1451
|
+
|
|
1452
|
+
Random rnd(301);
|
|
1453
|
+
|
|
1454
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1455
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(rnd.Uniform(10) + 1));
|
|
1456
|
+
});
|
|
1457
|
+
|
|
1458
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1459
|
+
ASSERT_OK(Put(Key(i), rnd.RandomString(100)));
|
|
1460
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1461
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(rnd.Uniform(2)));
|
|
1462
|
+
});
|
|
1463
|
+
}
|
|
1464
|
+
ASSERT_OK(Flush());
|
|
1465
|
+
|
|
1466
|
+
TablePropertiesCollection tables_props;
|
|
1467
|
+
ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
|
|
1468
|
+
ASSERT_EQ(tables_props.size(), 1);
|
|
1469
|
+
ASSERT_FALSE(tables_props.begin()->second->seqno_to_time_mapping.empty());
|
|
1470
|
+
SeqnoToTimeMapping tp_mapping;
|
|
1471
|
+
ASSERT_OK(
|
|
1472
|
+
tp_mapping.Add(tables_props.begin()->second->seqno_to_time_mapping));
|
|
1473
|
+
ASSERT_OK(tp_mapping.Sort());
|
|
1474
|
+
ASSERT_FALSE(tp_mapping.Empty());
|
|
1475
|
+
auto seqs = tp_mapping.TEST_GetInternalMapping();
|
|
1476
|
+
ASSERT_FALSE(seqs.empty());
|
|
1477
|
+
|
|
1478
|
+
// Wait more than preclude_last_level time, then make sure all the data is
|
|
1479
|
+
// compacted to the last level even there's no write (no seqno -> time
|
|
1480
|
+
// information was flushed to any SST).
|
|
1481
|
+
mock_clock_->MockSleepForSeconds(100);
|
|
1482
|
+
|
|
1483
|
+
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
|
|
1484
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1485
|
+
ASSERT_EQ(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1486
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1487
|
+
|
|
1488
|
+
Close();
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1218
1491
|
#endif // !defined(ROCKSDB_LITE)
|
|
1219
1492
|
|
|
1220
1493
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -673,6 +673,7 @@ TEST_P(ComparatorDBTest, SeparatorSuccessorRandomizeTest) {
|
|
|
673
673
|
} // namespace ROCKSDB_NAMESPACE
|
|
674
674
|
|
|
675
675
|
int main(int argc, char** argv) {
|
|
676
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
676
677
|
::testing::InitGoogleTest(&argc, argv);
|
|
677
678
|
return RUN_ALL_TESTS();
|
|
678
679
|
}
|
|
@@ -345,6 +345,7 @@ TEST_F(CuckooTableDBTest, AdaptiveTable) {
|
|
|
345
345
|
|
|
346
346
|
int main(int argc, char** argv) {
|
|
347
347
|
if (ROCKSDB_NAMESPACE::port::kLittleEndian) {
|
|
348
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
348
349
|
::testing::InitGoogleTest(&argc, argv);
|
|
349
350
|
return RUN_ALL_TESTS();
|
|
350
351
|
} else {
|