@nxtedition/rocksdb 15.4.0 → 15.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +24 -19
- package/cache.js +1 -1
- package/chained-batch.js +12 -3
- package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
- package/deps/rocksdb/rocksdb/BUCK +42 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
- package/deps/rocksdb/rocksdb/Makefile +59 -32
- package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
- package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
- package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
- package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
- package/deps/rocksdb/rocksdb/db/builder.h +7 -0
- package/deps/rocksdb/rocksdb/db/c.cc +373 -57
- package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
- package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
- package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
- package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
- package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
- package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
- package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
- package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
- package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
- package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
- package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
- package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
- package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
- package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
- package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
- package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
- package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
- package/deps/rocksdb/rocksdb/env/env.cc +1 -0
- package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
- package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
- package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
- package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
- package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
- package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
- package/deps/rocksdb/rocksdb/folly.mk +22 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
- package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
- package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
- package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
- package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
- package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
- package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
- package/deps/rocksdb/rocksdb/options/options.cc +5 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
- package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
- package/deps/rocksdb/rocksdb/port/lang.h +4 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
- package/deps/rocksdb/rocksdb/src.mk +12 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
- package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
- package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
- package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
- package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
- package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
- package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
- package/deps/rocksdb/rocksdb/table/format.cc +27 -15
- package/deps/rocksdb/rocksdb/table/format.h +41 -15
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
- package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
- package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
- package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
- package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
- package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
- package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
- package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
- package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
- package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
- package/deps/rocksdb/rocksdb/util/coding.h +14 -27
- package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
- package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
- package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
- package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
- package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
- package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
- package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
- package/deps/rocksdb/rocksdb/util/math.h +3 -1
- package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
- package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
- package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
- package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
- package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
- package/deps/rocksdb/rocksdb/util/status.cc +3 -1
- package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
- package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
- package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
- package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
- package/deps/rocksdb/rocksdb.gyp +7 -0
- package/index.js +11 -2
- package/iterator.js +15 -7
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
|
@@ -7,9 +7,13 @@
|
|
|
7
7
|
// Use of this source code is governed by a BSD-style license that can be
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
|
|
10
|
+
#include <set>
|
|
11
|
+
|
|
12
|
+
#include "db/column_family.h"
|
|
10
13
|
#include "db/compaction/compaction.h"
|
|
11
14
|
#include "db/db_test_util.h"
|
|
12
15
|
#include "port/stack_trace.h"
|
|
16
|
+
#include "rocksdb/sst_file_reader.h"
|
|
13
17
|
#include "test_util/testutil.h"
|
|
14
18
|
|
|
15
19
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -48,6 +52,122 @@ class TimestampCompatibleCompactionTest : public DBTestBase {
|
|
|
48
52
|
}
|
|
49
53
|
return value;
|
|
50
54
|
}
|
|
55
|
+
|
|
56
|
+
// Helper to get all files with their level and timestamps
|
|
57
|
+
std::vector<std::tuple<int, std::string, std::string>>
|
|
58
|
+
GetAllFileTimestamps() {
|
|
59
|
+
std::vector<std::tuple<int, std::string, std::string>> results;
|
|
60
|
+
ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
|
|
61
|
+
auto* cfd = static_cast_with_check<ColumnFamilyHandleImpl>(cfh)->cfd();
|
|
62
|
+
auto* vstorage = cfd->current()->storage_info();
|
|
63
|
+
|
|
64
|
+
for (int level = 0; level < cfd->NumberLevels(); level++) {
|
|
65
|
+
for (auto* file : vstorage->LevelFiles(level)) {
|
|
66
|
+
results.emplace_back(level, file->min_timestamp, file->max_timestamp);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return results;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Helper to compute overall min/max timestamps across all files
|
|
73
|
+
// Returns {min_ts, max_ts} as uint64_t values
|
|
74
|
+
// Asserts that all files have non-empty timestamps
|
|
75
|
+
std::pair<uint64_t, uint64_t> GetOverallTimestampRange() {
|
|
76
|
+
auto files = GetAllFileTimestamps();
|
|
77
|
+
EXPECT_GE(files.size(), 1U);
|
|
78
|
+
|
|
79
|
+
uint64_t overall_min = UINT64_MAX;
|
|
80
|
+
uint64_t overall_max = 0;
|
|
81
|
+
for (const auto& [level, min_ts, max_ts] : files) {
|
|
82
|
+
EXPECT_FALSE(min_ts.empty()) << "min_timestamp empty at level " << level;
|
|
83
|
+
EXPECT_FALSE(max_ts.empty()) << "max_timestamp empty at level " << level;
|
|
84
|
+
|
|
85
|
+
if (!min_ts.empty() && !max_ts.empty()) {
|
|
86
|
+
uint64_t file_min = DecodeFixed64(min_ts.data());
|
|
87
|
+
uint64_t file_max = DecodeFixed64(max_ts.data());
|
|
88
|
+
overall_min = std::min(overall_min, file_min);
|
|
89
|
+
overall_max = std::max(overall_max, file_max);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return {overall_min, overall_max};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Helper to verify timestamp range matches expected values, including after
|
|
96
|
+
// reopen
|
|
97
|
+
void VerifyTimestampRangeWithPersistence(const Options& options,
|
|
98
|
+
uint64_t expected_min,
|
|
99
|
+
uint64_t expected_max) {
|
|
100
|
+
// Verify before reopen
|
|
101
|
+
auto [min_ts, max_ts] = GetOverallTimestampRange();
|
|
102
|
+
ASSERT_EQ(expected_min, min_ts);
|
|
103
|
+
ASSERT_EQ(expected_max, max_ts);
|
|
104
|
+
|
|
105
|
+
size_t file_count_before = GetAllFileTimestamps().size();
|
|
106
|
+
|
|
107
|
+
// Verify manifest persistence by reopening
|
|
108
|
+
Reopen(options);
|
|
109
|
+
|
|
110
|
+
// Verify after reopen
|
|
111
|
+
auto [reopened_min_ts, reopened_max_ts] = GetOverallTimestampRange();
|
|
112
|
+
ASSERT_EQ(expected_min, reopened_min_ts);
|
|
113
|
+
ASSERT_EQ(expected_max, reopened_max_ts);
|
|
114
|
+
ASSERT_EQ(file_count_before, GetAllFileTimestamps().size());
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Helper to create common options for UDT tests with level compaction
|
|
118
|
+
Options CreateTimestampOptions(bool disable_auto_compactions = false) {
|
|
119
|
+
Options options = CurrentOptions();
|
|
120
|
+
options.env = env_;
|
|
121
|
+
options.compaction_style = kCompactionStyleLevel;
|
|
122
|
+
options.num_levels = 4;
|
|
123
|
+
options.persist_user_defined_timestamps = true;
|
|
124
|
+
options.comparator = test::BytewiseComparatorWithU64TsWrapper();
|
|
125
|
+
options.disable_auto_compactions = disable_auto_compactions;
|
|
126
|
+
return options;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Helper to write test data with alternating timestamps in a range
|
|
130
|
+
// Writes keys [start_key, end_key) with timestamps alternating between
|
|
131
|
+
// min_ts and max_ts
|
|
132
|
+
void WriteDataWithTimestampRange(int start_key, int end_key, uint64_t min_ts,
|
|
133
|
+
uint64_t max_ts) {
|
|
134
|
+
std::string ts_buf;
|
|
135
|
+
for (int i = start_key; i < end_key; i++) {
|
|
136
|
+
ts_buf.clear();
|
|
137
|
+
uint64_t ts = (i % 2 == 0) ? min_ts : max_ts;
|
|
138
|
+
PutFixed64(&ts_buf, ts);
|
|
139
|
+
ASSERT_OK(db_->Put(WriteOptions(), Key(i), ts_buf,
|
|
140
|
+
"value" + std::to_string(i)));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Helper to check if any file has the expected timestamp range
|
|
145
|
+
bool HasFileWithTimestampRange(uint64_t expected_min, uint64_t expected_max) {
|
|
146
|
+
auto file_timestamps = GetAllFileTimestamps();
|
|
147
|
+
for (const auto& [level, min_ts, max_ts] : file_timestamps) {
|
|
148
|
+
if (!min_ts.empty() && !max_ts.empty()) {
|
|
149
|
+
uint64_t file_min = DecodeFixed64(min_ts.data());
|
|
150
|
+
uint64_t file_max = DecodeFixed64(max_ts.data());
|
|
151
|
+
if (file_min == expected_min && file_max == expected_max) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Helper to verify data is readable with a given timestamp
|
|
160
|
+
void VerifyDataReadable(int key, const std::string& expected_value,
|
|
161
|
+
uint64_t read_ts) {
|
|
162
|
+
std::string value;
|
|
163
|
+
std::string ts_buf;
|
|
164
|
+
PutFixed64(&ts_buf, read_ts);
|
|
165
|
+
ReadOptions read_opts;
|
|
166
|
+
Slice ts_slice(ts_buf);
|
|
167
|
+
read_opts.timestamp = &ts_slice;
|
|
168
|
+
ASSERT_OK(db_->Get(read_opts, Key(key), &value));
|
|
169
|
+
ASSERT_EQ(expected_value, value);
|
|
170
|
+
}
|
|
51
171
|
};
|
|
52
172
|
|
|
53
173
|
TEST_F(TimestampCompatibleCompactionTest, UserKeyCrossFileBoundary) {
|
|
@@ -344,6 +464,385 @@ TEST_F(TimestampCompatibleCompactionTest, EmptyCompactionOutput) {
|
|
|
344
464
|
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
345
465
|
}
|
|
346
466
|
|
|
467
|
+
TEST_F(TimestampCompatibleCompactionTest, SeqnoZeroingWithUDT) {
|
|
468
|
+
// This test validates that seqno is only zeroed when the timestamp is older
|
|
469
|
+
// than full_history_ts_low_. Before the fix, seqno was incorrectly zeroed
|
|
470
|
+
// even when UDT was enabled but timestamp wasn't old enough.
|
|
471
|
+
|
|
472
|
+
Options options = CurrentOptions();
|
|
473
|
+
options.env = env_;
|
|
474
|
+
options.comparator = test::BytewiseComparatorWithU64TsWrapper();
|
|
475
|
+
options.disable_auto_compactions = true;
|
|
476
|
+
DestroyAndReopen(options);
|
|
477
|
+
|
|
478
|
+
// Track seqno zeroing events and which keys are zeroed
|
|
479
|
+
std::set<std::string> zeroed_keys;
|
|
480
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
481
|
+
"CompactionIterator::PrepareOutput:ZeroingSeq", [&](void* arg) {
|
|
482
|
+
auto* ikey = static_cast<ParsedInternalKey*>(arg);
|
|
483
|
+
ASSERT_EQ(0, ikey->sequence);
|
|
484
|
+
// Extract user key without timestamp (last 8 bytes)
|
|
485
|
+
Slice user_key_with_ts = ikey->user_key;
|
|
486
|
+
std::string user_key =
|
|
487
|
+
user_key_with_ts.ToString().substr(0, user_key_with_ts.size() - 8);
|
|
488
|
+
zeroed_keys.insert(user_key);
|
|
489
|
+
});
|
|
490
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
491
|
+
|
|
492
|
+
// Case 1: Test that seqno is NOT zeroed when full_history_ts_low is not set
|
|
493
|
+
// Write a key with timestamp 100
|
|
494
|
+
std::string ts_str = Timestamp(100);
|
|
495
|
+
ASSERT_OK(db_->Put(WriteOptions(), "key1", ts_str, "value1"));
|
|
496
|
+
ASSERT_OK(Flush());
|
|
497
|
+
|
|
498
|
+
zeroed_keys.clear();
|
|
499
|
+
{
|
|
500
|
+
CompactRangeOptions cro;
|
|
501
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
502
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
503
|
+
}
|
|
504
|
+
// With UDT enabled and no full_history_ts_low, seqno should NOT be zeroed
|
|
505
|
+
ASSERT_TRUE(zeroed_keys.empty());
|
|
506
|
+
|
|
507
|
+
// Case 2: Test that seqno IS zeroed when timestamp < full_history_ts_low
|
|
508
|
+
// Write a new key with timestamp 200
|
|
509
|
+
ts_str = Timestamp(200);
|
|
510
|
+
ASSERT_OK(db_->Put(WriteOptions(), "key2", ts_str, "value2"));
|
|
511
|
+
ASSERT_OK(Flush());
|
|
512
|
+
|
|
513
|
+
zeroed_keys.clear();
|
|
514
|
+
{
|
|
515
|
+
// Set full_history_ts_low to 300, so ts < 300 should be zeroed
|
|
516
|
+
std::string full_history_ts_low = Timestamp(300);
|
|
517
|
+
Slice ts_slice = full_history_ts_low;
|
|
518
|
+
CompactRangeOptions cro;
|
|
519
|
+
cro.full_history_ts_low = &ts_slice;
|
|
520
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
521
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
522
|
+
}
|
|
523
|
+
// key1 (ts=100) and key2 (ts=200) both have ts < 300, so both should be
|
|
524
|
+
// zeroed
|
|
525
|
+
ASSERT_EQ(2u, zeroed_keys.size());
|
|
526
|
+
ASSERT_TRUE(zeroed_keys.count("key1") > 0);
|
|
527
|
+
ASSERT_TRUE(zeroed_keys.count("key2") > 0);
|
|
528
|
+
|
|
529
|
+
// Case 3: Write a new key with timestamp >= full_history_ts_low
|
|
530
|
+
// and verify it is NOT zeroed while old keys are re-zeroed
|
|
531
|
+
ts_str = Timestamp(500);
|
|
532
|
+
ASSERT_OK(db_->Put(WriteOptions(), "key3", ts_str, "value3"));
|
|
533
|
+
ASSERT_OK(Flush());
|
|
534
|
+
|
|
535
|
+
zeroed_keys.clear();
|
|
536
|
+
{
|
|
537
|
+
// Set full_history_ts_low to 400
|
|
538
|
+
// key1 (ts=100) and key2 (ts=200) have ts < 400, will be re-processed
|
|
539
|
+
// key3 (ts=500) has ts >= 400, should NOT be zeroed
|
|
540
|
+
std::string full_history_ts_low = Timestamp(400);
|
|
541
|
+
Slice ts_slice = full_history_ts_low;
|
|
542
|
+
CompactRangeOptions cro;
|
|
543
|
+
cro.full_history_ts_low = &ts_slice;
|
|
544
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
545
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
546
|
+
}
|
|
547
|
+
// key3 should NOT appear in zeroed_keys since ts=500 >= 400
|
|
548
|
+
ASSERT_TRUE(zeroed_keys.count("key3") == 0);
|
|
549
|
+
|
|
550
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
551
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
552
|
+
|
|
553
|
+
// Verify data is still readable
|
|
554
|
+
std::string value;
|
|
555
|
+
ts_str = Timestamp(600);
|
|
556
|
+
Slice read_ts = ts_str;
|
|
557
|
+
ReadOptions read_opts;
|
|
558
|
+
read_opts.timestamp = &read_ts;
|
|
559
|
+
ASSERT_OK(db_->Get(read_opts, "key1", &value));
|
|
560
|
+
ASSERT_EQ("value1", value);
|
|
561
|
+
ASSERT_OK(db_->Get(read_opts, "key2", &value));
|
|
562
|
+
ASSERT_EQ("value2", value);
|
|
563
|
+
ASSERT_OK(db_->Get(read_opts, "key3", &value));
|
|
564
|
+
ASSERT_EQ("value3", value);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Test that files with max_timestamp >= full_history_ts_low are not marked
|
|
568
|
+
// for bottommost compaction, which prevents infinite compaction loops.
|
|
569
|
+
TEST_F(TimestampCompatibleCompactionTest,
|
|
570
|
+
BottommostCompactionRespectsFullHistoryTsLow) {
|
|
571
|
+
Options options = CreateTimestampOptions();
|
|
572
|
+
options.level0_file_num_compaction_trigger = 4;
|
|
573
|
+
|
|
574
|
+
DestroyAndReopen(options);
|
|
575
|
+
|
|
576
|
+
// Write some data with timestamps 100-199
|
|
577
|
+
std::string ts_buf;
|
|
578
|
+
for (int i = 0; i < 100; i++) {
|
|
579
|
+
ts_buf.clear();
|
|
580
|
+
PutFixed64(&ts_buf, 100 + i);
|
|
581
|
+
ASSERT_OK(
|
|
582
|
+
db_->Put(WriteOptions(), Key(i), ts_buf, "value" + std::to_string(i)));
|
|
583
|
+
}
|
|
584
|
+
ASSERT_OK(Flush());
|
|
585
|
+
|
|
586
|
+
// Compact to the bottommost level
|
|
587
|
+
CompactRangeOptions cro;
|
|
588
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
589
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
590
|
+
|
|
591
|
+
// Set full_history_ts_low to 150 - files with max_ts >= 150 should NOT be
|
|
592
|
+
// marked for bottommost compaction since seqno cannot be zeroed
|
|
593
|
+
ts_buf.clear();
|
|
594
|
+
PutFixed64(&ts_buf, 150);
|
|
595
|
+
ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_buf));
|
|
596
|
+
|
|
597
|
+
// Release a snapshot to potentially trigger bottommost file marking
|
|
598
|
+
// but files should NOT be marked because max_ts (199) >= full_history_ts_low
|
|
599
|
+
// (150)
|
|
600
|
+
const Snapshot* snap = db_->GetSnapshot();
|
|
601
|
+
db_->ReleaseSnapshot(snap);
|
|
602
|
+
|
|
603
|
+
// Wait for any scheduled compactions - should complete without infinite loop
|
|
604
|
+
// Use a reasonable timeout to detect infinite loops
|
|
605
|
+
WaitForCompactOptions wfc_options;
|
|
606
|
+
wfc_options.timeout = std::chrono::microseconds(5000000); // 5 seconds
|
|
607
|
+
Status s = dbfull()->WaitForCompact(wfc_options);
|
|
608
|
+
// Should succeed without timeout (no infinite compaction loop)
|
|
609
|
+
ASSERT_TRUE(s.ok() || s.IsTimedOut());
|
|
610
|
+
if (s.IsTimedOut()) {
|
|
611
|
+
// If timeout, the fix is not working - this should not happen
|
|
612
|
+
FAIL() << "WaitForCompact timed out - possible infinite compaction loop";
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// Now set full_history_ts_low beyond max timestamp in the file (200+)
|
|
616
|
+
// This should allow the file to be properly marked and compacted
|
|
617
|
+
ts_buf.clear();
|
|
618
|
+
PutFixed64(&ts_buf, 300);
|
|
619
|
+
ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_buf));
|
|
620
|
+
|
|
621
|
+
// Trigger another snapshot release to potentially mark files
|
|
622
|
+
snap = db_->GetSnapshot();
|
|
623
|
+
db_->ReleaseSnapshot(snap);
|
|
624
|
+
|
|
625
|
+
// Now compaction should clean up the file.
|
|
626
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// Test that files are NOT marked for bottommost compaction when UDT is enabled
|
|
630
|
+
// and full_history_ts_low has never been set (empty).
|
|
631
|
+
TEST_F(TimestampCompatibleCompactionTest,
|
|
632
|
+
BottommostCompactionSkipsWhenFullHistoryTsLowNotSet) {
|
|
633
|
+
Options options = CreateTimestampOptions();
|
|
634
|
+
|
|
635
|
+
DestroyAndReopen(options);
|
|
636
|
+
|
|
637
|
+
// Write some data with timestamps 100-199
|
|
638
|
+
std::string ts_buf;
|
|
639
|
+
for (int i = 0; i < 100; i++) {
|
|
640
|
+
ts_buf.clear();
|
|
641
|
+
PutFixed64(&ts_buf, 100 + i);
|
|
642
|
+
ASSERT_OK(
|
|
643
|
+
db_->Put(WriteOptions(), Key(i), ts_buf, "value" + std::to_string(i)));
|
|
644
|
+
}
|
|
645
|
+
ASSERT_OK(Flush());
|
|
646
|
+
|
|
647
|
+
// Compact to the bottommost level without setting full_history_ts_low
|
|
648
|
+
CompactRangeOptions cro;
|
|
649
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
650
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
651
|
+
|
|
652
|
+
// Verify files have valid max_timestamp
|
|
653
|
+
auto file_timestamps = GetAllFileTimestamps();
|
|
654
|
+
ASSERT_GE(file_timestamps.size(), 1U);
|
|
655
|
+
for (const auto& [level, min_ts, max_ts] : file_timestamps) {
|
|
656
|
+
ASSERT_FALSE(max_ts.empty()) << "max_timestamp should not be empty";
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
// full_history_ts_low is NOT set (empty), so files should NOT be marked
|
|
660
|
+
// for bottommost compaction even after releasing a snapshot.
|
|
661
|
+
// This tests the branch: if (full_history_ts_low.empty()) { continue; }
|
|
662
|
+
const Snapshot* snap = db_->GetSnapshot();
|
|
663
|
+
db_->ReleaseSnapshot(snap);
|
|
664
|
+
|
|
665
|
+
// Wait for any scheduled compactions
|
|
666
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
667
|
+
|
|
668
|
+
// Now set full_history_ts_low to a value > max_timestamp (199) in the file
|
|
669
|
+
// This should allow the file to be properly marked and compacted
|
|
670
|
+
ts_buf.clear();
|
|
671
|
+
PutFixed64(&ts_buf, 300);
|
|
672
|
+
ASSERT_OK(db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_buf));
|
|
673
|
+
|
|
674
|
+
// Trigger another snapshot release to potentially mark files
|
|
675
|
+
snap = db_->GetSnapshot();
|
|
676
|
+
db_->ReleaseSnapshot(snap);
|
|
677
|
+
|
|
678
|
+
// Now compaction should be able to proceed since full_history_ts_low is set
|
|
679
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
680
|
+
|
|
681
|
+
// Verify data is still readable
|
|
682
|
+
VerifyDataReadable(0, "value0", 250);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// Test that ingested SST files created with UDT have their min/max timestamps
|
|
686
|
+
// properly extracted from table properties and populated in FileMetaData.
|
|
687
|
+
// This verifies the fix in external_sst_file_ingestion_job.cc that calls
|
|
688
|
+
// ExtractTimestampFromTableProperties after creating FileMetaData.
|
|
689
|
+
TEST_F(TimestampCompatibleCompactionTest,
|
|
690
|
+
IngestedFileTimestampsExtractedFromTableProperties) {
|
|
691
|
+
Options options = CreateTimestampOptions();
|
|
692
|
+
|
|
693
|
+
DestroyAndReopen(options);
|
|
694
|
+
|
|
695
|
+
// Create an SST file WITH timestamps using SstFileWriter
|
|
696
|
+
std::string sst_file = dbname_ + "/ingested_udt_file.sst";
|
|
697
|
+
const uint64_t kMinTs = 100;
|
|
698
|
+
const uint64_t kMaxTs = 200;
|
|
699
|
+
|
|
700
|
+
{
|
|
701
|
+
SstFileWriter sst_file_writer(EnvOptions(), options);
|
|
702
|
+
ASSERT_OK(sst_file_writer.Open(sst_file));
|
|
703
|
+
|
|
704
|
+
std::string ts_buf;
|
|
705
|
+
for (int i = 0; i < 10; i++) {
|
|
706
|
+
// Alternate between min and max timestamps
|
|
707
|
+
uint64_t ts = (i % 2 == 0) ? kMinTs : kMaxTs;
|
|
708
|
+
ts_buf.clear();
|
|
709
|
+
PutFixed64(&ts_buf, ts);
|
|
710
|
+
// SstFileWriter with UDT comparator requires key with timestamp
|
|
711
|
+
ASSERT_OK(
|
|
712
|
+
sst_file_writer.Put(Key(i), ts_buf, "value" + std::to_string(i)));
|
|
713
|
+
}
|
|
714
|
+
ASSERT_OK(sst_file_writer.Finish());
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
// Verify the SST file has timestamp properties before ingestion
|
|
718
|
+
{
|
|
719
|
+
std::unique_ptr<SstFileReader> reader(new SstFileReader(options));
|
|
720
|
+
ASSERT_OK(reader->Open(sst_file));
|
|
721
|
+
auto props = reader->GetTableProperties();
|
|
722
|
+
auto& user_collected = props->user_collected_properties;
|
|
723
|
+
ASSERT_TRUE(user_collected.find("rocksdb.timestamp_min") !=
|
|
724
|
+
user_collected.end())
|
|
725
|
+
<< "SST file should have rocksdb.timestamp_min property";
|
|
726
|
+
ASSERT_TRUE(user_collected.find("rocksdb.timestamp_max") !=
|
|
727
|
+
user_collected.end())
|
|
728
|
+
<< "SST file should have rocksdb.timestamp_max property";
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Ingest the SST file
|
|
732
|
+
IngestExternalFileOptions ifo;
|
|
733
|
+
ifo.move_files = false;
|
|
734
|
+
ASSERT_OK(db_->IngestExternalFile({sst_file}, ifo));
|
|
735
|
+
|
|
736
|
+
// Verify the ingested file has proper timestamps in FileMetaData
|
|
737
|
+
ASSERT_TRUE(HasFileWithTimestampRange(kMinTs, kMaxTs))
|
|
738
|
+
<< "Ingested file should have min_timestamp=" << kMinTs
|
|
739
|
+
<< " and max_timestamp=" << kMaxTs << " in FileMetaData";
|
|
740
|
+
|
|
741
|
+
// Verify timestamps persist after reopen
|
|
742
|
+
Reopen(options);
|
|
743
|
+
|
|
744
|
+
ASSERT_TRUE(HasFileWithTimestampRange(kMinTs, kMaxTs))
|
|
745
|
+
<< "Ingested file timestamps should persist after reopen";
|
|
746
|
+
|
|
747
|
+
// Verify data is readable
|
|
748
|
+
VerifyDataReadable(0, "value0", kMaxTs);
|
|
749
|
+
|
|
750
|
+
// Clean up
|
|
751
|
+
ASSERT_OK(env_->DeleteFile(sst_file));
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// Test that min/max timestamps are correctly tracked in FileMetaData and
|
|
755
|
+
// persisted in the manifest during flush.
|
|
756
|
+
TEST_F(TimestampCompatibleCompactionTest, TimestampRangePersistenceFlush) {
|
|
757
|
+
Options options = CreateTimestampOptions();
|
|
758
|
+
|
|
759
|
+
DestroyAndReopen(options);
|
|
760
|
+
|
|
761
|
+
// Expected timestamp range
|
|
762
|
+
const uint64_t kMinTs = 100;
|
|
763
|
+
const uint64_t kMaxTs = 200;
|
|
764
|
+
|
|
765
|
+
// Write data with specific timestamp range
|
|
766
|
+
WriteDataWithTimestampRange(0, 50, kMinTs, kMaxTs);
|
|
767
|
+
ASSERT_OK(Flush());
|
|
768
|
+
|
|
769
|
+
// First verify table properties have the timestamps
|
|
770
|
+
// (this confirms TimestampTablePropertiesCollector is working)
|
|
771
|
+
TablePropertiesCollection props;
|
|
772
|
+
ASSERT_OK(db_->GetPropertiesOfAllTables(&props));
|
|
773
|
+
ASSERT_EQ(1U, props.size());
|
|
774
|
+
for (const auto& item : props) {
|
|
775
|
+
auto& user_collected = item.second->user_collected_properties;
|
|
776
|
+
ASSERT_TRUE(user_collected.find("rocksdb.timestamp_min") !=
|
|
777
|
+
user_collected.end());
|
|
778
|
+
ASSERT_TRUE(user_collected.find("rocksdb.timestamp_max") !=
|
|
779
|
+
user_collected.end());
|
|
780
|
+
// Verify the collected timestamps match expected values
|
|
781
|
+
std::string collected_min_ts = user_collected.at("rocksdb.timestamp_min");
|
|
782
|
+
std::string collected_max_ts = user_collected.at("rocksdb.timestamp_max");
|
|
783
|
+
ASSERT_EQ(kMinTs, DecodeFixed64(collected_min_ts.data()));
|
|
784
|
+
ASSERT_EQ(kMaxTs, DecodeFixed64(collected_max_ts.data()));
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Verify FileMetaData timestamps and persistence through reopen
|
|
788
|
+
VerifyTimestampRangeWithPersistence(options, kMinTs, kMaxTs);
|
|
789
|
+
|
|
790
|
+
// Verify we can still read the data
|
|
791
|
+
VerifyDataReadable(0, "value0", kMaxTs);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// Test that min/max timestamps are correctly merged during compaction
|
|
795
|
+
// and persisted in the manifest.
|
|
796
|
+
TEST_F(TimestampCompatibleCompactionTest, TimestampRangePersistenceCompaction) {
|
|
797
|
+
Options options = CreateTimestampOptions(true /* disable_auto_compactions */);
|
|
798
|
+
|
|
799
|
+
DestroyAndReopen(options);
|
|
800
|
+
|
|
801
|
+
// Create multiple L0 files with different timestamp ranges
|
|
802
|
+
// File 1: timestamps 100-150
|
|
803
|
+
const uint64_t kFile1MinTs = 100;
|
|
804
|
+
const uint64_t kFile1MaxTs = 150;
|
|
805
|
+
WriteDataWithTimestampRange(0, 10, kFile1MinTs, kFile1MaxTs);
|
|
806
|
+
ASSERT_OK(Flush());
|
|
807
|
+
|
|
808
|
+
// File 2: timestamps 50-80 (earlier range)
|
|
809
|
+
const uint64_t kFile2MinTs = 50;
|
|
810
|
+
const uint64_t kFile2MaxTs = 80;
|
|
811
|
+
WriteDataWithTimestampRange(10, 20, kFile2MinTs, kFile2MaxTs);
|
|
812
|
+
ASSERT_OK(Flush());
|
|
813
|
+
|
|
814
|
+
// File 3: timestamps 200-300 (later range)
|
|
815
|
+
const uint64_t kFile3MinTs = 200;
|
|
816
|
+
const uint64_t kFile3MaxTs = 300;
|
|
817
|
+
WriteDataWithTimestampRange(20, 30, kFile3MinTs, kFile3MaxTs);
|
|
818
|
+
ASSERT_OK(Flush());
|
|
819
|
+
|
|
820
|
+
// Expected combined range: min=50, max=300
|
|
821
|
+
const uint64_t kExpectedMinTs = 50;
|
|
822
|
+
const uint64_t kExpectedMaxTs = 300;
|
|
823
|
+
|
|
824
|
+
// Verify we have 3 L0 files before compaction with valid timestamps
|
|
825
|
+
auto files_before = GetAllFileTimestamps();
|
|
826
|
+
ASSERT_EQ(3U, files_before.size());
|
|
827
|
+
for (const auto& [level, min_ts, max_ts] : files_before) {
|
|
828
|
+
ASSERT_EQ(0, level); // All files should be in L0
|
|
829
|
+
ASSERT_FALSE(min_ts.empty());
|
|
830
|
+
ASSERT_FALSE(max_ts.empty());
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// Trigger compaction
|
|
834
|
+
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
|
|
835
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
836
|
+
|
|
837
|
+
// Verify timestamp range and persistence through reopen
|
|
838
|
+
VerifyTimestampRangeWithPersistence(options, kExpectedMinTs, kExpectedMaxTs);
|
|
839
|
+
|
|
840
|
+
// Verify data is still readable
|
|
841
|
+
VerifyDataReadable(0, "value0", kExpectedMaxTs);
|
|
842
|
+
VerifyDataReadable(15, "value15", kExpectedMaxTs);
|
|
843
|
+
VerifyDataReadable(25, "value25", kExpectedMaxTs);
|
|
844
|
+
}
|
|
845
|
+
|
|
347
846
|
} // namespace ROCKSDB_NAMESPACE
|
|
348
847
|
|
|
349
848
|
int main(int argc, char** argv) {
|