@nxtedition/rocksdb 7.1.29 → 7.1.31
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 +34 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -2
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +15 -23
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +4 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -1
- package/deps/rocksdb/rocksdb/crash_test.mk +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +15 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +78 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +32 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +47 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +3 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +105 -166
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +46 -15
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +47 -26
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +17 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +11 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +12 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +337 -103
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +524 -1
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +164 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +1 -1
- package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
- package/deps/rocksdb/rocksdb/db/memtable.cc +16 -23
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +30 -0
- package/deps/rocksdb/rocksdb/db/merge_helper.h +9 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +29 -9
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +10 -7
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +12 -8
- package/deps/rocksdb/rocksdb/db/version_set.cc +11 -6
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +142 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +59 -53
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +7 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +0 -2
- package/deps/rocksdb/rocksdb/env/env.cc +16 -19
- package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -1
- package/deps/rocksdb/rocksdb/env/env_chroot.cc +20 -20
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +62 -60
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
- package/deps/rocksdb/rocksdb/env/env_test.cc +179 -176
- package/deps/rocksdb/rocksdb/env/file_system.cc +3 -4
- package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -2
- package/deps/rocksdb/rocksdb/env/io_posix.h +1 -2
- package/deps/rocksdb/rocksdb/env/mock_env.h +1 -0
- package/deps/rocksdb/rocksdb/env/mock_env_test.cc +4 -4
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +6 -5
- package/deps/rocksdb/rocksdb/file/delete_scheduler.h +2 -5
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +6 -7
- package/deps/rocksdb/rocksdb/file/file_util.cc +1 -1
- package/deps/rocksdb/rocksdb/file/filename.cc +16 -17
- package/deps/rocksdb/rocksdb/file/filename.h +4 -5
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +492 -496
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +1 -3
- package/deps/rocksdb/rocksdb/file/read_write_util.cc +1 -0
- package/deps/rocksdb/rocksdb/file/read_write_util.h +1 -0
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +6 -8
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/block_cache_trace_writer.h +4 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +166 -167
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +12 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +0 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +4 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +3 -3
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +3 -7
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +20 -23
- package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/logging/event_logger.cc +1 -3
- package/deps/rocksdb/rocksdb/logging/event_logger.h +4 -5
- package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +2 -1
- package/deps/rocksdb/rocksdb/logging/log_buffer.cc +2 -3
- package/deps/rocksdb/rocksdb/logging/log_buffer.h +3 -2
- package/deps/rocksdb/rocksdb/logging/logging.h +3 -3
- package/deps/rocksdb/rocksdb/memory/allocator.h +1 -0
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +1 -1
- package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +2 -0
- package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -0
- package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +17 -20
- package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +13 -15
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +11 -10
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +3 -3
- package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +2 -2
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +30 -28
- package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +4 -6
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +73 -70
- package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +1 -1
- package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +21 -23
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +24 -38
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +10 -17
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +19 -19
- package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +22 -30
- package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +4 -6
- package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +4 -12
- package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -3
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +12 -14
- package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +2 -3
- package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -3
- package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
- package/deps/rocksdb/rocksdb/monitoring/statistics.h +7 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +12 -22
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +7 -10
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
- package/deps/rocksdb/rocksdb/port/lang.h +3 -1
- package/deps/rocksdb/rocksdb/port/likely.h +2 -2
- package/deps/rocksdb/rocksdb/port/mmap.h +2 -2
- package/deps/rocksdb/rocksdb/port/port_dirent.h +2 -2
- package/deps/rocksdb/rocksdb/port/port_posix.cc +32 -27
- package/deps/rocksdb/rocksdb/port/port_posix.h +31 -30
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -1
- package/deps/rocksdb/rocksdb/port/sys_time.h +1 -1
- package/deps/rocksdb/rocksdb/port/win/io_win.h +6 -7
- package/deps/rocksdb/rocksdb/port/win/port_win.h +12 -20
- package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +5 -4
- package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -5
- package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -4
- package/deps/rocksdb/rocksdb/port/win/win_thread.cc +30 -49
- package/deps/rocksdb/rocksdb/port/win/win_thread.h +5 -5
- package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -62
- package/deps/rocksdb/rocksdb/port/win/xpress_win.h +2 -2
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +4 -3
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -30
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +4 -5
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -6
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +1 -0
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -6
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +90 -80
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +5 -4
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +63 -69
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +58 -57
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +3 -3
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +35 -30
- package/deps/rocksdb/rocksdb/table/get_context.cc +16 -10
- package/deps/rocksdb/rocksdb/table/iter_heap.h +2 -0
- package/deps/rocksdb/rocksdb/table/iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -3
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +31 -16
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -6
- package/deps/rocksdb/rocksdb/table/multiget_context.h +5 -6
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +1 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +1 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +7 -10
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +2 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +4 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +2 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +10 -21
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +14 -12
- package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +2 -5
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -3
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +0 -6
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +0 -33
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -6
- package/deps/rocksdb/rocksdb/table/table_properties.cc +24 -37
- package/deps/rocksdb/rocksdb/table/table_reader.h +3 -2
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +9 -8
- package/deps/rocksdb/rocksdb/table/table_test.cc +77 -82
- package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/two_level_iterator.h +1 -1
- package/deps/rocksdb/rocksdb/test_util/sync_point.cc +8 -18
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +2 -2
- package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +4 -3
- package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +13 -18
- package/deps/rocksdb/rocksdb/test_util/testharness.cc +1 -2
- package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -7
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +3 -4
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +1 -1
- package/deps/rocksdb/rocksdb/tools/blob_dump.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -7
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +3 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +296 -314
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +6 -6
- package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +57 -64
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +6 -5
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +1 -2
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +10 -10
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/write_stress.cc +6 -3
- package/deps/rocksdb/rocksdb/util/aligned_buffer.h +12 -31
- package/deps/rocksdb/rocksdb/util/autovector.h +3 -6
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +12 -12
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +8 -12
- package/deps/rocksdb/rocksdb/util/coding.cc +1 -0
- package/deps/rocksdb/rocksdb/util/coding.h +17 -15
- package/deps/rocksdb/rocksdb/util/coding_test.cc +14 -15
- package/deps/rocksdb/rocksdb/util/comparator.cc +4 -4
- package/deps/rocksdb/rocksdb/util/compression.h +6 -3
- package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +5 -8
- package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +1 -1
- package/deps/rocksdb/rocksdb/util/crc32c.cc +202 -297
- package/deps/rocksdb/rocksdb/util/crc32c.h +2 -3
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +2 -0
- package/deps/rocksdb/rocksdb/util/crc32c_test.cc +39 -54
- package/deps/rocksdb/rocksdb/util/defer.h +2 -1
- package/deps/rocksdb/rocksdb/util/defer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/util/duplicate_detector.h +2 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +1 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +24 -29
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +4 -4
- package/deps/rocksdb/rocksdb/util/hash_test.cc +2 -2
- package/deps/rocksdb/rocksdb/util/heap.h +5 -4
- package/deps/rocksdb/rocksdb/util/heap_test.cc +15 -25
- package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
- package/deps/rocksdb/rocksdb/util/murmurhash.cc +7 -2
- package/deps/rocksdb/rocksdb/util/murmurhash.h +4 -3
- package/deps/rocksdb/rocksdb/util/mutexlock.h +5 -11
- package/deps/rocksdb/rocksdb/util/random.cc +1 -0
- package/deps/rocksdb/rocksdb/util/random.h +2 -4
- package/deps/rocksdb/rocksdb/util/random_test.cc +2 -1
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +4 -3
- package/deps/rocksdb/rocksdb/util/slice.cc +1 -1
- package/deps/rocksdb/rocksdb/util/slice_test.cc +1 -2
- package/deps/rocksdb/rocksdb/util/status.cc +2 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +2 -0
- package/deps/rocksdb/rocksdb/util/thread_list_test.cc +64 -76
- package/deps/rocksdb/rocksdb/util/thread_local.cc +18 -32
- package/deps/rocksdb/rocksdb/util/thread_local.h +2 -3
- package/deps/rocksdb/rocksdb/util/thread_operation.h +34 -43
- package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +54 -73
- package/deps/rocksdb/rocksdb/util/threadpool_imp.h +18 -18
- package/deps/rocksdb/rocksdb/util/timer.h +4 -9
- package/deps/rocksdb/rocksdb/util/timer_queue.h +1 -0
- package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/xxhash.cc +1 -2
- package/deps/rocksdb/rocksdb/util/xxhash.h +7 -4
- package/deps/rocksdb/rocksdb/util/xxph3.h +3 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +16 -24
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +106 -104
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +3 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +6 -6
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +3 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +11 -15
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +12 -12
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +56 -55
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +91 -74
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +17 -34
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +21 -45
- package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +74 -97
- package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +17 -18
- package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +3 -4
- package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +19 -19
- package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +19 -18
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +7 -10
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +3 -4
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +10 -15
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +5 -3
- package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +4 -5
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -13
- package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +7 -9
- package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +4 -5
- package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +2 -4
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +39 -50
- package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/merge_operators.h +4 -3
- package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +5 -7
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +5 -4
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +3 -6
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +3 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +18 -13
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +1 -3
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +15 -14
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +14 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +4 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +3 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +5 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +5 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +3 -4
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +2 -6
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +80 -79
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +9 -17
- package/index.js +4 -0
- package/package.json +2 -2
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -293,7 +293,7 @@ bool UniversalCompactionPicker::NeedsCompaction(
|
|
|
293
293
|
Compaction* UniversalCompactionPicker::PickCompaction(
|
|
294
294
|
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
295
295
|
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
296
|
-
LogBuffer* log_buffer, SequenceNumber /*
|
|
296
|
+
LogBuffer* log_buffer, const SequenceNumber /* earliest_mem_seqno */) {
|
|
297
297
|
UniversalCompactionBuilder builder(ioptions_, icmp_, cf_name,
|
|
298
298
|
mutable_cf_options, mutable_db_options,
|
|
299
299
|
vstorage, this, log_buffer);
|
|
@@ -308,9 +308,10 @@ void UniversalCompactionBuilder::SortedRun::Dump(char* out_buf,
|
|
|
308
308
|
if (file->fd.GetPathId() == 0 || !print_path) {
|
|
309
309
|
snprintf(out_buf, out_buf_size, "file %" PRIu64, file->fd.GetNumber());
|
|
310
310
|
} else {
|
|
311
|
-
snprintf(out_buf, out_buf_size,
|
|
312
|
-
|
|
313
|
-
|
|
311
|
+
snprintf(out_buf, out_buf_size,
|
|
312
|
+
"file %" PRIu64
|
|
313
|
+
"(path "
|
|
314
|
+
"%" PRIu32 ")",
|
|
314
315
|
file->fd.GetNumber(), file->fd.GetPathId());
|
|
315
316
|
}
|
|
316
317
|
} else {
|
|
@@ -743,6 +744,13 @@ Compaction* UniversalCompactionBuilder::PickCompactionToReduceSortedRuns(
|
|
|
743
744
|
grandparents = vstorage_->LevelFiles(sorted_runs_[first_index_after].level);
|
|
744
745
|
}
|
|
745
746
|
|
|
747
|
+
if (output_level != 0 &&
|
|
748
|
+
picker_->FilesRangeOverlapWithCompaction(
|
|
749
|
+
inputs, output_level,
|
|
750
|
+
Compaction::EvaluatePenultimateLevel(vstorage_, ioptions_,
|
|
751
|
+
start_level, output_level))) {
|
|
752
|
+
return nullptr;
|
|
753
|
+
}
|
|
746
754
|
CompactionReason compaction_reason;
|
|
747
755
|
if (max_number_of_files_to_compact == UINT_MAX) {
|
|
748
756
|
compaction_reason = CompactionReason::kUniversalSizeRatio;
|
|
@@ -1081,6 +1089,24 @@ Compaction* UniversalCompactionBuilder::PickIncrementalForReduceSizeAmp(
|
|
|
1081
1089
|
inputs.push_back(second_last_level_inputs);
|
|
1082
1090
|
inputs.push_back(bottom_level_inputs);
|
|
1083
1091
|
|
|
1092
|
+
int start_level = Compaction::kInvalidLevel;
|
|
1093
|
+
for (const auto& in : inputs) {
|
|
1094
|
+
if (!in.empty()) {
|
|
1095
|
+
// inputs should already be sorted by level
|
|
1096
|
+
start_level = in.level;
|
|
1097
|
+
break;
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
// intra L0 compactions outputs could have overlap
|
|
1102
|
+
if (output_level != 0 &&
|
|
1103
|
+
picker_->FilesRangeOverlapWithCompaction(
|
|
1104
|
+
inputs, output_level,
|
|
1105
|
+
Compaction::EvaluatePenultimateLevel(vstorage_, ioptions_,
|
|
1106
|
+
start_level, output_level))) {
|
|
1107
|
+
return nullptr;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1084
1110
|
// TODO support multi paths?
|
|
1085
1111
|
uint32_t path_id = 0;
|
|
1086
1112
|
return new Compaction(
|
|
@@ -1210,7 +1236,10 @@ Compaction* UniversalCompactionBuilder::PickDeleteTriggeredCompaction() {
|
|
|
1210
1236
|
if (!output_level_inputs.empty()) {
|
|
1211
1237
|
inputs.push_back(output_level_inputs);
|
|
1212
1238
|
}
|
|
1213
|
-
if (picker_->FilesRangeOverlapWithCompaction(
|
|
1239
|
+
if (picker_->FilesRangeOverlapWithCompaction(
|
|
1240
|
+
inputs, output_level,
|
|
1241
|
+
Compaction::EvaluatePenultimateLevel(
|
|
1242
|
+
vstorage_, ioptions_, start_level, output_level))) {
|
|
1214
1243
|
return nullptr;
|
|
1215
1244
|
}
|
|
1216
1245
|
|
|
@@ -1312,6 +1341,15 @@ Compaction* UniversalCompactionBuilder::PickCompactionWithSortedRunRange(
|
|
|
1312
1341
|
output_level = sorted_runs_[end_index + 1].level - 1;
|
|
1313
1342
|
}
|
|
1314
1343
|
|
|
1344
|
+
// intra L0 compactions outputs could have overlap
|
|
1345
|
+
if (output_level != 0 &&
|
|
1346
|
+
picker_->FilesRangeOverlapWithCompaction(
|
|
1347
|
+
inputs, output_level,
|
|
1348
|
+
Compaction::EvaluatePenultimateLevel(vstorage_, ioptions_,
|
|
1349
|
+
start_level, output_level))) {
|
|
1350
|
+
return nullptr;
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1315
1353
|
// We never check size for
|
|
1316
1354
|
// compaction_options_universal.compression_size_percent,
|
|
1317
1355
|
// because we always compact all the files, so always compress.
|
|
@@ -21,8 +21,7 @@ class UniversalCompactionPicker : public CompactionPicker {
|
|
|
21
21
|
virtual Compaction* PickCompaction(
|
|
22
22
|
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
|
|
23
23
|
const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
|
|
24
|
-
LogBuffer* log_buffer,
|
|
25
|
-
SequenceNumber earliest_memtable_seqno = kMaxSequenceNumber) override;
|
|
24
|
+
LogBuffer* log_buffer, const SequenceNumber earliest_mem_seqno) override;
|
|
26
25
|
virtual int MaxOutputLevel() const override { return NumberLevels() - 1; }
|
|
27
26
|
|
|
28
27
|
virtual bool NeedsCompaction(
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
#include "db/db_test_util.h"
|
|
12
12
|
#include "port/stack_trace.h"
|
|
13
|
+
#include "rocksdb/iostats_context.h"
|
|
13
14
|
#include "rocksdb/listener.h"
|
|
14
15
|
#include "rocksdb/utilities/debug.h"
|
|
15
16
|
#include "test_util/mock_time_env.h"
|
|
@@ -416,7 +417,7 @@ TEST_P(TieredCompactionTest, RangeBasedTieredStorageUniversal) {
|
|
|
416
417
|
// No data is moved from cold tier to hot tier because no input files from L5
|
|
417
418
|
// or higher, it's not safe to move data to output_to_penultimate_level level.
|
|
418
419
|
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
|
|
419
|
-
ASSERT_EQ("0,0,0,0,0,
|
|
420
|
+
ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
|
|
420
421
|
|
|
421
422
|
// Add 2 keys in higher level, but in separated files, all keys can be moved
|
|
422
423
|
// up if it's hot
|
|
@@ -1488,6 +1489,528 @@ TEST_F(PrecludeLastLevelTest, SmallPrecludeTime) {
|
|
|
1488
1489
|
Close();
|
|
1489
1490
|
}
|
|
1490
1491
|
|
|
1492
|
+
TEST_F(PrecludeLastLevelTest, LastLevelOnlyCompactionPartial) {
|
|
1493
|
+
const int kNumTrigger = 4;
|
|
1494
|
+
const int kNumLevels = 7;
|
|
1495
|
+
const int kNumKeys = 100;
|
|
1496
|
+
const int kKeyPerSec = 10;
|
|
1497
|
+
|
|
1498
|
+
Options options = CurrentOptions();
|
|
1499
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1500
|
+
options.preserve_internal_time_seconds = 2000;
|
|
1501
|
+
options.env = mock_env_.get();
|
|
1502
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1503
|
+
options.num_levels = kNumLevels;
|
|
1504
|
+
DestroyAndReopen(options);
|
|
1505
|
+
|
|
1506
|
+
// pass some time first, otherwise the first a few keys write time are going
|
|
1507
|
+
// to be zero, and internally zero has special meaning: kUnknownSeqnoTime
|
|
1508
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1509
|
+
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
|
|
1510
|
+
|
|
1511
|
+
int sst_num = 0;
|
|
1512
|
+
// Write files that are overlap and enough to trigger compaction
|
|
1513
|
+
for (; sst_num < kNumTrigger; sst_num++) {
|
|
1514
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1515
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
|
|
1516
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1517
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
|
|
1518
|
+
});
|
|
1519
|
+
}
|
|
1520
|
+
ASSERT_OK(Flush());
|
|
1521
|
+
}
|
|
1522
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1523
|
+
|
|
1524
|
+
// all data is pushed to the last level
|
|
1525
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1526
|
+
|
|
1527
|
+
// enable preclude feature
|
|
1528
|
+
options.preclude_last_level_data_seconds = 2000;
|
|
1529
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1530
|
+
Reopen(options);
|
|
1531
|
+
|
|
1532
|
+
CompactRangeOptions cro;
|
|
1533
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
1534
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
1535
|
+
|
|
1536
|
+
// some data are moved up, some are not
|
|
1537
|
+
ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
|
|
1538
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1539
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1540
|
+
|
|
1541
|
+
std::vector<KeyVersion> key_versions;
|
|
1542
|
+
ASSERT_OK(GetAllKeyVersions(db_, Slice(), Slice(),
|
|
1543
|
+
std::numeric_limits<size_t>::max(),
|
|
1544
|
+
&key_versions));
|
|
1545
|
+
|
|
1546
|
+
// make sure there're more than 300 keys and first 100 keys are having seqno
|
|
1547
|
+
// zeroed out, the last 100 key seqno not zeroed out
|
|
1548
|
+
ASSERT_GT(key_versions.size(), 300);
|
|
1549
|
+
for (int i = 0; i < 100; i++) {
|
|
1550
|
+
ASSERT_EQ(key_versions[i].sequence, 0);
|
|
1551
|
+
}
|
|
1552
|
+
auto rit = key_versions.rbegin();
|
|
1553
|
+
for (int i = 0; i < 100; i++) {
|
|
1554
|
+
ASSERT_GT(rit->sequence, 0);
|
|
1555
|
+
rit++;
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
Close();
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
class PrecludeLastLevelTestWithParms
|
|
1562
|
+
: public PrecludeLastLevelTest,
|
|
1563
|
+
public testing::WithParamInterface<bool> {
|
|
1564
|
+
public:
|
|
1565
|
+
PrecludeLastLevelTestWithParms() : PrecludeLastLevelTest() {}
|
|
1566
|
+
};
|
|
1567
|
+
|
|
1568
|
+
TEST_P(PrecludeLastLevelTestWithParms, LastLevelOnlyCompactionNoPreclude) {
|
|
1569
|
+
const int kNumTrigger = 4;
|
|
1570
|
+
const int kNumLevels = 7;
|
|
1571
|
+
const int kNumKeys = 100;
|
|
1572
|
+
const int kKeyPerSec = 10;
|
|
1573
|
+
|
|
1574
|
+
bool enable_preclude_last_level = GetParam();
|
|
1575
|
+
|
|
1576
|
+
Options options = CurrentOptions();
|
|
1577
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1578
|
+
options.preserve_internal_time_seconds = 2000;
|
|
1579
|
+
options.env = mock_env_.get();
|
|
1580
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1581
|
+
options.num_levels = kNumLevels;
|
|
1582
|
+
DestroyAndReopen(options);
|
|
1583
|
+
|
|
1584
|
+
// pass some time first, otherwise the first a few keys write time are going
|
|
1585
|
+
// to be zero, and internally zero has special meaning: kUnknownSeqnoTime
|
|
1586
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1587
|
+
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
|
|
1588
|
+
|
|
1589
|
+
Random rnd(301);
|
|
1590
|
+
int sst_num = 0;
|
|
1591
|
+
// Write files that are overlap and enough to trigger compaction
|
|
1592
|
+
for (; sst_num < kNumTrigger; sst_num++) {
|
|
1593
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1594
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), rnd.RandomString(100)));
|
|
1595
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1596
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
|
|
1597
|
+
});
|
|
1598
|
+
}
|
|
1599
|
+
ASSERT_OK(Flush());
|
|
1600
|
+
}
|
|
1601
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1602
|
+
|
|
1603
|
+
// all data is pushed to the last level
|
|
1604
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1605
|
+
|
|
1606
|
+
std::atomic_bool is_manual_compaction_running = false;
|
|
1607
|
+
std::atomic_bool verified_compaction_order = false;
|
|
1608
|
+
|
|
1609
|
+
// Make sure the manual compaction is in progress and try to trigger a
|
|
1610
|
+
// SizeRatio compaction by flushing 4 files to L0. The compaction will try to
|
|
1611
|
+
// compact 4 files at L0 to L5 (the last empty level).
|
|
1612
|
+
// If the preclude_last_feature is enabled, the auto triggered compaction
|
|
1613
|
+
// cannot be picked. Otherwise, the auto triggered compaction can run in
|
|
1614
|
+
// parallel with the last level compaction.
|
|
1615
|
+
// L0: [a] [b] [c] [d]
|
|
1616
|
+
// L5: (locked if preclude_last_level is enabled)
|
|
1617
|
+
// L6: [z] (locked: manual compaction in progress)
|
|
1618
|
+
// TODO: in this case, L0 files should just be compacted to L4, so the 2
|
|
1619
|
+
// compactions won't be overlapped.
|
|
1620
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1621
|
+
"CompactionJob::ProcessKeyValueCompaction()::Processing", [&](void* arg) {
|
|
1622
|
+
auto compaction = static_cast<Compaction*>(arg);
|
|
1623
|
+
if (compaction->is_manual_compaction()) {
|
|
1624
|
+
is_manual_compaction_running = true;
|
|
1625
|
+
TEST_SYNC_POINT(
|
|
1626
|
+
"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
|
|
1627
|
+
"ManualCompaction1");
|
|
1628
|
+
TEST_SYNC_POINT(
|
|
1629
|
+
"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
|
|
1630
|
+
"ManualCompaction2");
|
|
1631
|
+
is_manual_compaction_running = false;
|
|
1632
|
+
}
|
|
1633
|
+
});
|
|
1634
|
+
|
|
1635
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1636
|
+
"UniversalCompactionBuilder::PickCompaction:Return", [&](void* arg) {
|
|
1637
|
+
auto compaction = static_cast<Compaction*>(arg);
|
|
1638
|
+
if (enable_preclude_last_level && is_manual_compaction_running) {
|
|
1639
|
+
ASSERT_TRUE(compaction == nullptr);
|
|
1640
|
+
verified_compaction_order = true;
|
|
1641
|
+
} else {
|
|
1642
|
+
ASSERT_TRUE(compaction != nullptr);
|
|
1643
|
+
verified_compaction_order = true;
|
|
1644
|
+
}
|
|
1645
|
+
if (!compaction || !compaction->is_manual_compaction()) {
|
|
1646
|
+
TEST_SYNC_POINT(
|
|
1647
|
+
"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
|
|
1648
|
+
"AutoCompactionPicked");
|
|
1649
|
+
}
|
|
1650
|
+
});
|
|
1651
|
+
|
|
1652
|
+
SyncPoint::GetInstance()->LoadDependency({
|
|
1653
|
+
{"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
|
|
1654
|
+
"ManualCompaction1",
|
|
1655
|
+
"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:StartWrite"},
|
|
1656
|
+
{"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
|
|
1657
|
+
"AutoCompactionPicked",
|
|
1658
|
+
"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
|
|
1659
|
+
"ManualCompaction2"},
|
|
1660
|
+
});
|
|
1661
|
+
|
|
1662
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1663
|
+
|
|
1664
|
+
// only enable if the Parameter is true
|
|
1665
|
+
if (enable_preclude_last_level) {
|
|
1666
|
+
options.preclude_last_level_data_seconds = 2000;
|
|
1667
|
+
}
|
|
1668
|
+
options.max_background_jobs = 8;
|
|
1669
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1670
|
+
Reopen(options);
|
|
1671
|
+
|
|
1672
|
+
auto manual_compaction_thread = port::Thread([this]() {
|
|
1673
|
+
CompactRangeOptions cro;
|
|
1674
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
1675
|
+
cro.exclusive_manual_compaction = false;
|
|
1676
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
1677
|
+
});
|
|
1678
|
+
|
|
1679
|
+
TEST_SYNC_POINT(
|
|
1680
|
+
"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:StartWrite");
|
|
1681
|
+
auto stop_token =
|
|
1682
|
+
dbfull()->TEST_write_controler().GetCompactionPressureToken();
|
|
1683
|
+
|
|
1684
|
+
for (; sst_num < kNumTrigger * 2; sst_num++) {
|
|
1685
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
1686
|
+
// the value needs to be big enough to trigger full compaction
|
|
1687
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
|
|
1688
|
+
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
1689
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
|
|
1690
|
+
});
|
|
1691
|
+
}
|
|
1692
|
+
ASSERT_OK(Flush());
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
manual_compaction_thread.join();
|
|
1696
|
+
|
|
1697
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1698
|
+
|
|
1699
|
+
if (enable_preclude_last_level) {
|
|
1700
|
+
ASSERT_NE("0,0,0,0,0,1,1", FilesPerLevel());
|
|
1701
|
+
} else {
|
|
1702
|
+
ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
|
|
1703
|
+
}
|
|
1704
|
+
ASSERT_TRUE(verified_compaction_order);
|
|
1705
|
+
|
|
1706
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1707
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
1708
|
+
stop_token.reset();
|
|
1709
|
+
|
|
1710
|
+
Close();
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1713
|
+
INSTANTIATE_TEST_CASE_P(PrecludeLastLevelTestWithParms,
|
|
1714
|
+
PrecludeLastLevelTestWithParms, testing::Bool());
|
|
1715
|
+
|
|
1716
|
+
// partition the SST into 3 ranges [0, 19] [20, 39] [40, ...]
|
|
1717
|
+
class ThreeRangesPartitioner : public SstPartitioner {
|
|
1718
|
+
public:
|
|
1719
|
+
const char* Name() const override { return "SingleKeySstPartitioner"; }
|
|
1720
|
+
|
|
1721
|
+
PartitionerResult ShouldPartition(
|
|
1722
|
+
const PartitionerRequest& request) override {
|
|
1723
|
+
if ((cmp->CompareWithoutTimestamp(*request.current_user_key,
|
|
1724
|
+
DBTestBase::Key(20)) >= 0 &&
|
|
1725
|
+
cmp->CompareWithoutTimestamp(*request.prev_user_key,
|
|
1726
|
+
DBTestBase::Key(20)) < 0) ||
|
|
1727
|
+
(cmp->CompareWithoutTimestamp(*request.current_user_key,
|
|
1728
|
+
DBTestBase::Key(40)) >= 0 &&
|
|
1729
|
+
cmp->CompareWithoutTimestamp(*request.prev_user_key,
|
|
1730
|
+
DBTestBase::Key(40)) < 0)) {
|
|
1731
|
+
return kRequired;
|
|
1732
|
+
} else {
|
|
1733
|
+
return kNotRequired;
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
bool CanDoTrivialMove(const Slice& /*smallest_user_key*/,
|
|
1738
|
+
const Slice& /*largest_user_key*/) override {
|
|
1739
|
+
return false;
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
const Comparator* cmp = BytewiseComparator();
|
|
1743
|
+
};
|
|
1744
|
+
|
|
1745
|
+
class ThreeRangesPartitionerFactory : public SstPartitionerFactory {
|
|
1746
|
+
public:
|
|
1747
|
+
static const char* kClassName() {
|
|
1748
|
+
return "TombstoneTestSstPartitionerFactory";
|
|
1749
|
+
}
|
|
1750
|
+
const char* Name() const override { return kClassName(); }
|
|
1751
|
+
|
|
1752
|
+
std::unique_ptr<SstPartitioner> CreatePartitioner(
|
|
1753
|
+
const SstPartitioner::Context& /* context */) const override {
|
|
1754
|
+
return std::unique_ptr<SstPartitioner>(new ThreeRangesPartitioner());
|
|
1755
|
+
}
|
|
1756
|
+
};
|
|
1757
|
+
|
|
1758
|
+
TEST_F(PrecludeLastLevelTest, PartialPenultimateLevelCompaction) {
|
|
1759
|
+
const int kNumTrigger = 4;
|
|
1760
|
+
const int kNumLevels = 7;
|
|
1761
|
+
const int kKeyPerSec = 10;
|
|
1762
|
+
|
|
1763
|
+
Options options = CurrentOptions();
|
|
1764
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1765
|
+
options.env = mock_env_.get();
|
|
1766
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1767
|
+
options.preserve_internal_time_seconds = 10000;
|
|
1768
|
+
options.num_levels = kNumLevels;
|
|
1769
|
+
DestroyAndReopen(options);
|
|
1770
|
+
|
|
1771
|
+
// pass some time first, otherwise the first a few keys write time are going
|
|
1772
|
+
// to be zero, and internally zero has special meaning: kUnknownSeqnoTime
|
|
1773
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1774
|
+
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
|
|
1775
|
+
|
|
1776
|
+
Random rnd(301);
|
|
1777
|
+
|
|
1778
|
+
for (int i = 0; i < 300; i++) {
|
|
1779
|
+
ASSERT_OK(Put(Key(i), rnd.RandomString(100)));
|
|
1780
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1781
|
+
[&] { mock_clock_->MockSleepForSeconds(kKeyPerSec); });
|
|
1782
|
+
}
|
|
1783
|
+
ASSERT_OK(Flush());
|
|
1784
|
+
CompactRangeOptions cro;
|
|
1785
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
1786
|
+
|
|
1787
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
1788
|
+
|
|
1789
|
+
// make sure all data is compacted to the last level
|
|
1790
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1791
|
+
|
|
1792
|
+
// Create 3 L5 files
|
|
1793
|
+
auto factory = std::make_shared<ThreeRangesPartitionerFactory>();
|
|
1794
|
+
options.sst_partitioner_factory = factory;
|
|
1795
|
+
|
|
1796
|
+
Reopen(options);
|
|
1797
|
+
|
|
1798
|
+
for (int i = 0; i < kNumTrigger - 1; i++) {
|
|
1799
|
+
for (int j = 0; j < 100; j++) {
|
|
1800
|
+
ASSERT_OK(Put(Key(i * 100 + j), rnd.RandomString(10)));
|
|
1801
|
+
}
|
|
1802
|
+
ASSERT_OK(Flush());
|
|
1803
|
+
}
|
|
1804
|
+
|
|
1805
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
1806
|
+
|
|
1807
|
+
// L5: [0,19] [20,39] [40,299]
|
|
1808
|
+
// L6: [0, 299]
|
|
1809
|
+
ASSERT_EQ("0,0,0,0,0,3,1", FilesPerLevel());
|
|
1810
|
+
|
|
1811
|
+
// enable tiered storage feature
|
|
1812
|
+
options.preclude_last_level_data_seconds = 10000;
|
|
1813
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1814
|
+
options.statistics = CreateDBStatistics();
|
|
1815
|
+
Reopen(options);
|
|
1816
|
+
|
|
1817
|
+
ColumnFamilyMetaData meta;
|
|
1818
|
+
db_->GetColumnFamilyMetaData(&meta);
|
|
1819
|
+
ASSERT_EQ(meta.levels[5].files.size(), 3);
|
|
1820
|
+
ASSERT_EQ(meta.levels[6].files.size(), 1);
|
|
1821
|
+
ASSERT_EQ(meta.levels[6].files[0].smallestkey, Key(0));
|
|
1822
|
+
ASSERT_EQ(meta.levels[6].files[0].largestkey, Key(299));
|
|
1823
|
+
|
|
1824
|
+
std::string file_path = meta.levels[5].files[1].db_path;
|
|
1825
|
+
std::vector<std::string> files;
|
|
1826
|
+
// pick 3rd file @L5 + file@L6 for compaction
|
|
1827
|
+
files.push_back(file_path + "/" + meta.levels[5].files[2].name);
|
|
1828
|
+
files.push_back(file_path + "/" + meta.levels[6].files[0].name);
|
|
1829
|
+
ASSERT_OK(db_->CompactFiles(CompactionOptions(), files, 6));
|
|
1830
|
+
|
|
1831
|
+
// The compaction only moved partial of the hot data to hot tier, range[0,39]
|
|
1832
|
+
// is unsafe to move up, otherwise, they will be overlapped with the existing
|
|
1833
|
+
// files@L5.
|
|
1834
|
+
// The output should be:
|
|
1835
|
+
// L5: [0,19] [20,39] [40,299] <-- Temperature::kUnknown
|
|
1836
|
+
// L6: [0,19] [20,39] <-- Temperature::kCold
|
|
1837
|
+
// L6 file is split because of the customized partitioner
|
|
1838
|
+
ASSERT_EQ("0,0,0,0,0,3,2", FilesPerLevel());
|
|
1839
|
+
|
|
1840
|
+
// even all the data is hot, but not all data are moved to the hot tier
|
|
1841
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
|
|
1842
|
+
ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
|
|
1843
|
+
|
|
1844
|
+
db_->GetColumnFamilyMetaData(&meta);
|
|
1845
|
+
ASSERT_EQ(meta.levels[5].files.size(), 3);
|
|
1846
|
+
ASSERT_EQ(meta.levels[6].files.size(), 2);
|
|
1847
|
+
for (const auto& file : meta.levels[5].files) {
|
|
1848
|
+
ASSERT_EQ(file.temperature, Temperature::kUnknown);
|
|
1849
|
+
}
|
|
1850
|
+
for (const auto& file : meta.levels[6].files) {
|
|
1851
|
+
ASSERT_EQ(file.temperature, Temperature::kCold);
|
|
1852
|
+
}
|
|
1853
|
+
ASSERT_EQ(meta.levels[6].files[0].smallestkey, Key(0));
|
|
1854
|
+
ASSERT_EQ(meta.levels[6].files[0].largestkey, Key(19));
|
|
1855
|
+
ASSERT_EQ(meta.levels[6].files[1].smallestkey, Key(20));
|
|
1856
|
+
ASSERT_EQ(meta.levels[6].files[1].largestkey, Key(39));
|
|
1857
|
+
|
|
1858
|
+
Close();
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
struct TestPropertiesCollector : public TablePropertiesCollector {
|
|
1862
|
+
Status AddUserKey(const Slice& key, const Slice& /*value*/,
|
|
1863
|
+
EntryType /*type*/, SequenceNumber /*seq*/,
|
|
1864
|
+
uint64_t /*file_size*/) override {
|
|
1865
|
+
if (cmp->Compare(key, DBTestBase::Key(100)) == 0) {
|
|
1866
|
+
has_key_100 = true;
|
|
1867
|
+
}
|
|
1868
|
+
if (cmp->Compare(key, DBTestBase::Key(200)) == 0) {
|
|
1869
|
+
has_key_200 = true;
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1872
|
+
return Status::OK();
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
const char* Name() const override { return "TestTablePropertiesCollector"; }
|
|
1876
|
+
|
|
1877
|
+
UserCollectedProperties GetReadableProperties() const override {
|
|
1878
|
+
UserCollectedProperties ret;
|
|
1879
|
+
return ret;
|
|
1880
|
+
}
|
|
1881
|
+
|
|
1882
|
+
Status Finish(UserCollectedProperties* /*properties*/) override {
|
|
1883
|
+
// The LSM tree would be like:
|
|
1884
|
+
// L5: [0,19] [20,39] [40,299]
|
|
1885
|
+
// L6: [0, 299]
|
|
1886
|
+
// the 3rd file @L5 has both 100 and 200, which will be marked for
|
|
1887
|
+
// compaction
|
|
1888
|
+
// Also avoid marking flushed SST for compaction, which won't have both 100
|
|
1889
|
+
// and 200
|
|
1890
|
+
if (has_key_100 && has_key_200) {
|
|
1891
|
+
need_compact_ = true;
|
|
1892
|
+
} else {
|
|
1893
|
+
need_compact_ = false;
|
|
1894
|
+
}
|
|
1895
|
+
has_key_100 = false;
|
|
1896
|
+
has_key_200 = false;
|
|
1897
|
+
return Status::OK();
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
bool NeedCompact() const override { return need_compact_; }
|
|
1901
|
+
|
|
1902
|
+
const Comparator* cmp = BytewiseComparator();
|
|
1903
|
+
|
|
1904
|
+
private:
|
|
1905
|
+
bool has_key_100 = false;
|
|
1906
|
+
bool has_key_200 = false;
|
|
1907
|
+
|
|
1908
|
+
bool need_compact_ = false;
|
|
1909
|
+
};
|
|
1910
|
+
|
|
1911
|
+
class TestPropertiesCollectorFactory : public TablePropertiesCollectorFactory {
|
|
1912
|
+
public:
|
|
1913
|
+
TablePropertiesCollector* CreateTablePropertiesCollector(
|
|
1914
|
+
TablePropertiesCollectorFactory::Context /*context*/) override {
|
|
1915
|
+
return new TestPropertiesCollector;
|
|
1916
|
+
}
|
|
1917
|
+
const char* Name() const override { return "TestTablePropertiesCollector"; }
|
|
1918
|
+
};
|
|
1919
|
+
|
|
1920
|
+
TEST_F(PrecludeLastLevelTest, PartialPenultimateLevelCompactionWithRangeDel) {
|
|
1921
|
+
const int kNumTrigger = 4;
|
|
1922
|
+
const int kNumLevels = 7;
|
|
1923
|
+
const int kKeyPerSec = 10;
|
|
1924
|
+
|
|
1925
|
+
Options options = CurrentOptions();
|
|
1926
|
+
options.compaction_style = kCompactionStyleUniversal;
|
|
1927
|
+
options.env = mock_env_.get();
|
|
1928
|
+
options.level0_file_num_compaction_trigger = kNumTrigger;
|
|
1929
|
+
options.preserve_internal_time_seconds = 10000;
|
|
1930
|
+
options.num_levels = kNumLevels;
|
|
1931
|
+
// set a small max_compaction_bytes to avoid input level expansion
|
|
1932
|
+
options.max_compaction_bytes = 30000;
|
|
1933
|
+
options.ignore_max_compaction_bytes_for_input = false;
|
|
1934
|
+
DestroyAndReopen(options);
|
|
1935
|
+
|
|
1936
|
+
// pass some time first, otherwise the first a few keys write time are going
|
|
1937
|
+
// to be zero, and internally zero has special meaning: kUnknownSeqnoTime
|
|
1938
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1939
|
+
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
|
|
1940
|
+
|
|
1941
|
+
Random rnd(301);
|
|
1942
|
+
|
|
1943
|
+
for (int i = 0; i < 300; i++) {
|
|
1944
|
+
ASSERT_OK(Put(Key(i), rnd.RandomString(100)));
|
|
1945
|
+
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
1946
|
+
[&] { mock_clock_->MockSleepForSeconds(kKeyPerSec); });
|
|
1947
|
+
}
|
|
1948
|
+
ASSERT_OK(Flush());
|
|
1949
|
+
CompactRangeOptions cro;
|
|
1950
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
1951
|
+
|
|
1952
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
1953
|
+
|
|
1954
|
+
// make sure all data is compacted to the last level
|
|
1955
|
+
ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
|
|
1956
|
+
|
|
1957
|
+
// Create 3 L5 files
|
|
1958
|
+
auto factory = std::make_shared<ThreeRangesPartitionerFactory>();
|
|
1959
|
+
options.sst_partitioner_factory = factory;
|
|
1960
|
+
|
|
1961
|
+
// the user defined properties_collector will mark the 3rd file for compaction
|
|
1962
|
+
auto collector_factory = std::make_shared<TestPropertiesCollectorFactory>();
|
|
1963
|
+
options.table_properties_collector_factories.resize(1);
|
|
1964
|
+
options.table_properties_collector_factories[0] = collector_factory;
|
|
1965
|
+
// enable tiered storage feature
|
|
1966
|
+
options.preclude_last_level_data_seconds = 10000;
|
|
1967
|
+
options.last_level_temperature = Temperature::kCold;
|
|
1968
|
+
Reopen(options);
|
|
1969
|
+
|
|
1970
|
+
for (int i = 0; i < kNumTrigger - 2; i++) {
|
|
1971
|
+
for (int j = 0; j < 100; j++) {
|
|
1972
|
+
ASSERT_OK(Put(Key(i * 100 + j), rnd.RandomString(10)));
|
|
1973
|
+
}
|
|
1974
|
+
ASSERT_OK(Flush());
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
// make sure there is one and only one compaction supports per-key placement
|
|
1978
|
+
// but has the penultimate level output disabled.
|
|
1979
|
+
std::atomic_int per_key_comp_num = 0;
|
|
1980
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1981
|
+
"UniversalCompactionBuilder::PickCompaction:Return", [&](void* arg) {
|
|
1982
|
+
auto compaction = static_cast<Compaction*>(arg);
|
|
1983
|
+
if (compaction->SupportsPerKeyPlacement()) {
|
|
1984
|
+
ASSERT_EQ(compaction->GetPenultimateOutputRangeType(),
|
|
1985
|
+
Compaction::PenultimateOutputRangeType::kDisabled);
|
|
1986
|
+
per_key_comp_num++;
|
|
1987
|
+
}
|
|
1988
|
+
});
|
|
1989
|
+
|
|
1990
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1991
|
+
|
|
1992
|
+
for (int j = 0; j < 100; j++) {
|
|
1993
|
+
ASSERT_OK(Put(Key(200 + j), rnd.RandomString(10)));
|
|
1994
|
+
}
|
|
1995
|
+
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
|
|
1996
|
+
Key(32), Key(40)));
|
|
1997
|
+
ASSERT_OK(Flush());
|
|
1998
|
+
|
|
1999
|
+
// Before the per-key placement compaction, the LSM tress should be like:
|
|
2000
|
+
// L5: [0,19] [20,40] [40,299]
|
|
2001
|
+
// L6: [0, 299]
|
|
2002
|
+
// The 2nd file @L5 has the largest key 40 because of range del
|
|
2003
|
+
|
|
2004
|
+
ASSERT_OK(dbfull()->WaitForCompact(true));
|
|
2005
|
+
|
|
2006
|
+
ASSERT_EQ(per_key_comp_num, 1);
|
|
2007
|
+
|
|
2008
|
+
// the compaction won't move any data to the penultimate level
|
|
2009
|
+
ASSERT_EQ("0,0,0,0,0,2,3", FilesPerLevel());
|
|
2010
|
+
|
|
2011
|
+
Close();
|
|
2012
|
+
}
|
|
2013
|
+
|
|
1491
2014
|
#endif // !defined(ROCKSDB_LITE)
|
|
1492
2015
|
|
|
1493
2016
|
} // namespace ROCKSDB_NAMESPACE
|