@nxtedition/rocksdb 15.4.1 → 16.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +70 -23
- 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 +70 -10
- package/iterator.js +25 -3
- package/max_rev_operator.h +9 -5
- 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
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
3
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
5
|
+
|
|
6
|
+
#include "table/block_based/multi_scan_index_iterator.h"
|
|
7
|
+
|
|
8
|
+
#include "monitoring/statistics_impl.h"
|
|
9
|
+
#include "rocksdb/options.h"
|
|
10
|
+
|
|
11
|
+
namespace ROCKSDB_NAMESPACE {
|
|
12
|
+
|
|
13
|
+
MultiScanIndexIterator::MultiScanIndexIterator(
|
|
14
|
+
std::vector<BlockHandle>&& block_handles,
|
|
15
|
+
std::vector<std::string>&& data_block_separators,
|
|
16
|
+
std::vector<std::tuple<size_t, size_t>>&& block_index_ranges_per_scan,
|
|
17
|
+
const MultiScanArgs* scan_opts, std::shared_ptr<ReadSet> read_set,
|
|
18
|
+
size_t prefetch_max_idx, const InternalKeyComparator& icomp,
|
|
19
|
+
Statistics* statistics)
|
|
20
|
+
: block_handles_(std::move(block_handles)),
|
|
21
|
+
data_block_separators_(std::move(data_block_separators)),
|
|
22
|
+
block_index_ranges_per_scan_(std::move(block_index_ranges_per_scan)),
|
|
23
|
+
scan_opts_(scan_opts),
|
|
24
|
+
read_set_(std::move(read_set)),
|
|
25
|
+
prefetch_max_idx_(prefetch_max_idx),
|
|
26
|
+
icomp_(icomp),
|
|
27
|
+
user_comparator_(icomp.user_comparator()),
|
|
28
|
+
statistics_(statistics) {}
|
|
29
|
+
|
|
30
|
+
MultiScanIndexIterator::~MultiScanIndexIterator() {
|
|
31
|
+
if (statistics_ && wasted_blocks_count_ > 0) {
|
|
32
|
+
RecordTick(statistics_, MULTISCAN_PREFETCH_BLOCKS_WASTED,
|
|
33
|
+
wasted_blocks_count_);
|
|
34
|
+
}
|
|
35
|
+
// Release any remaining pinned blocks
|
|
36
|
+
if (read_set_) {
|
|
37
|
+
for (size_t i = cur_idx_; i < block_handles_.size(); ++i) {
|
|
38
|
+
read_set_->ReleaseBlock(i);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void MultiScanIndexIterator::ReleaseBlocks(size_t from_idx, size_t to_idx) {
|
|
44
|
+
for (size_t i = from_idx; i < to_idx; ++i) {
|
|
45
|
+
if (i < prefetch_max_idx_) {
|
|
46
|
+
wasted_blocks_count_++;
|
|
47
|
+
}
|
|
48
|
+
read_set_->ReleaseBlock(i);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
void MultiScanIndexIterator::Seek(const Slice& target) {
|
|
53
|
+
if (!status_.ok()) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Reset scan range exhaustion flag on Seek
|
|
58
|
+
scan_range_exhausted_ = false;
|
|
59
|
+
|
|
60
|
+
// Check the case where there are no ranges prepared
|
|
61
|
+
if (scan_opts_->size() == 0) {
|
|
62
|
+
valid_ = false;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Enforce forward-only seek
|
|
67
|
+
if (!prev_seek_key_.empty() && icomp_.Compare(target, prev_seek_key_) <= 0) {
|
|
68
|
+
// Seek key is not moving forward — keep current position
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
prev_seek_key_ = target.ToString();
|
|
72
|
+
|
|
73
|
+
const auto& scan_ranges = scan_opts_->GetScanRanges();
|
|
74
|
+
Slice user_seek_target = ExtractUserKey(target);
|
|
75
|
+
|
|
76
|
+
// Allow reseek on the start of the last prepared range
|
|
77
|
+
next_scan_idx_ =
|
|
78
|
+
std::min(next_scan_idx_, block_index_ranges_per_scan_.size() - 1);
|
|
79
|
+
|
|
80
|
+
auto compare_next_scan_start_result =
|
|
81
|
+
user_comparator_.CompareWithoutTimestamp(
|
|
82
|
+
user_seek_target, /*a_has_ts=*/true,
|
|
83
|
+
scan_ranges[next_scan_idx_].range.start.value(),
|
|
84
|
+
/*b_has_ts=*/false);
|
|
85
|
+
|
|
86
|
+
// There are 3 different Cases we need to handle:
|
|
87
|
+
// The following diagram explains different seek targets seeking at various
|
|
88
|
+
// positions on the table, while the next_scan_idx_ points to PreparedRange 2.
|
|
89
|
+
//
|
|
90
|
+
// next_scan_idx_: ------------------┐
|
|
91
|
+
// ▼
|
|
92
|
+
// table: : __[PreparedRange 1]__[PreparedRange 2]__[PreparedRange 3]__
|
|
93
|
+
// Seek target: <----- Case 1 ------>▲<------------- Case 2 -------------->
|
|
94
|
+
// │
|
|
95
|
+
// Case 3
|
|
96
|
+
//
|
|
97
|
+
// Case 1: seek before the start of next prepared range. This could happen
|
|
98
|
+
// due to too many delete tombstones triggering reseek or delete range.
|
|
99
|
+
// Case 2: seek after the start of next prepared range.
|
|
100
|
+
// This could happen due to seek key adjustment from delete range file.
|
|
101
|
+
// Case 3: seek at the beginning of a prepared range (expected case)
|
|
102
|
+
|
|
103
|
+
if (compare_next_scan_start_result < 0) {
|
|
104
|
+
// Case 1: Seek before the start of the next prepared range
|
|
105
|
+
if (next_scan_idx_ == 0) {
|
|
106
|
+
// Should not happen — seek before first prepared range
|
|
107
|
+
assert(false && "Seek target before the first prepared range");
|
|
108
|
+
valid_ = false;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
auto seek_target_before_previous_prepared_range =
|
|
112
|
+
user_comparator_.CompareWithoutTimestamp(
|
|
113
|
+
user_seek_target, /*a_has_ts=*/true,
|
|
114
|
+
scan_ranges[next_scan_idx_ - 1].range.start.value(),
|
|
115
|
+
/*b_has_ts=*/false) < 0;
|
|
116
|
+
assert(!seek_target_before_previous_prepared_range);
|
|
117
|
+
if (seek_target_before_previous_prepared_range) {
|
|
118
|
+
status_ = Status::InvalidArgument(
|
|
119
|
+
"Seek target is before the previous prepared range at index " +
|
|
120
|
+
std::to_string(next_scan_idx_));
|
|
121
|
+
RecordTick(statistics_, MULTISCAN_SEEK_ERRORS);
|
|
122
|
+
valid_ = false;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Seek within a gap — advance to the right scan range and find block
|
|
126
|
+
SeekToBlock(&user_seek_target);
|
|
127
|
+
} else if (compare_next_scan_start_result > 0) {
|
|
128
|
+
// Case 2: Seek after the start of the next prepared range
|
|
129
|
+
SeekToBlock(&user_seek_target);
|
|
130
|
+
} else {
|
|
131
|
+
// Case 3: Seek at the beginning of a prepared range (expected case)
|
|
132
|
+
assert(next_scan_idx_ < block_index_ranges_per_scan_.size());
|
|
133
|
+
auto [cur_scan_start_idx, cur_scan_end_idx] =
|
|
134
|
+
block_index_ranges_per_scan_[next_scan_idx_];
|
|
135
|
+
++next_scan_idx_;
|
|
136
|
+
|
|
137
|
+
if (cur_scan_start_idx >= cur_scan_end_idx) {
|
|
138
|
+
// No blocks are prepared for this range at current file
|
|
139
|
+
SetExhausted();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// max_sequential_skip_in_iterations can trigger a reseek on the start
|
|
144
|
+
// key of a scan range, even though we're already past cur_scan_start_idx
|
|
145
|
+
size_t block_idx = std::max(cur_scan_start_idx, cur_idx_);
|
|
146
|
+
if (block_idx >= cur_scan_end_idx) {
|
|
147
|
+
// cur_idx_ has advanced past this range's blocks (e.g., due to a
|
|
148
|
+
// reseek after all ranges were exhausted). Treat as exhausted.
|
|
149
|
+
SetExhausted();
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
SeekToBlockIdx(block_idx);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
void MultiScanIndexIterator::SeekToBlock(const Slice* user_seek_target) {
|
|
157
|
+
const auto& scan_ranges = scan_opts_->GetScanRanges();
|
|
158
|
+
|
|
159
|
+
// Advance next_scan_idx_ past ranges whose start key <= seek target
|
|
160
|
+
while (next_scan_idx_ < block_index_ranges_per_scan_.size() &&
|
|
161
|
+
user_comparator_.CompareWithoutTimestamp(
|
|
162
|
+
*user_seek_target, /*a_has_ts=*/true,
|
|
163
|
+
scan_ranges[next_scan_idx_].range.start.value(),
|
|
164
|
+
/*b_has_ts=*/false) >= 0) {
|
|
165
|
+
next_scan_idx_++;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
assert(next_scan_idx_ > 0);
|
|
169
|
+
auto cur_scan_idx = next_scan_idx_ - 1;
|
|
170
|
+
auto [cur_scan_start_idx, cur_scan_end_idx] =
|
|
171
|
+
block_index_ranges_per_scan_[cur_scan_idx];
|
|
172
|
+
|
|
173
|
+
if (cur_scan_start_idx >= cur_scan_end_idx) {
|
|
174
|
+
SetExhausted();
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Release blocks from current position to cur_scan_start_idx (wasted)
|
|
179
|
+
ReleaseBlocks(cur_idx_, cur_scan_start_idx);
|
|
180
|
+
|
|
181
|
+
// Find the correct block within the range using linear search on separators
|
|
182
|
+
size_t block_idx = std::max(cur_scan_start_idx, cur_idx_);
|
|
183
|
+
while (block_idx < data_block_separators_.size() &&
|
|
184
|
+
user_comparator_.CompareWithoutTimestamp(
|
|
185
|
+
*user_seek_target, /*a_has_ts=*/true,
|
|
186
|
+
data_block_separators_[block_idx],
|
|
187
|
+
/*b_has_ts=*/false) > 0) {
|
|
188
|
+
if (block_idx < prefetch_max_idx_) {
|
|
189
|
+
wasted_blocks_count_++;
|
|
190
|
+
}
|
|
191
|
+
read_set_->ReleaseBlock(block_idx);
|
|
192
|
+
block_idx++;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (block_idx >= data_block_separators_.size()) {
|
|
196
|
+
// All remaining blocks were released above. Update cur_idx_ so the
|
|
197
|
+
// destructor does not double-release them.
|
|
198
|
+
cur_idx_ = block_handles_.size();
|
|
199
|
+
SetExhausted();
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Update cur_idx_ before calling SeekToBlockIdx since we've already
|
|
204
|
+
// released all blocks up to block_idx above. This prevents SeekToBlockIdx's
|
|
205
|
+
// ReleaseBlocks(cur_idx_, block_idx) from double-releasing.
|
|
206
|
+
cur_idx_ = block_idx;
|
|
207
|
+
SeekToBlockIdx(block_idx);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
void MultiScanIndexIterator::SeekToBlockIdx(size_t block_idx) {
|
|
211
|
+
assert(cur_idx_ <= block_idx);
|
|
212
|
+
|
|
213
|
+
// Release any blocks between cur_idx_ and block_idx (wasted)
|
|
214
|
+
ReleaseBlocks(cur_idx_, block_idx);
|
|
215
|
+
|
|
216
|
+
cur_idx_ = block_idx;
|
|
217
|
+
valid_ = true;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
void MultiScanIndexIterator::SetExhausted() {
|
|
221
|
+
scan_range_exhausted_ = true;
|
|
222
|
+
if (next_scan_idx_ < block_index_ranges_per_scan_.size()) {
|
|
223
|
+
// More ranges remain — signal out-of-bound for current range.
|
|
224
|
+
valid_ = true;
|
|
225
|
+
// Position at the start of the next range so that the next Seek()
|
|
226
|
+
// can find it. We need to be "valid" so that FindBlockForward sets
|
|
227
|
+
// is_out_of_bound_ = true.
|
|
228
|
+
auto [start, end] = block_index_ranges_per_scan_[next_scan_idx_];
|
|
229
|
+
if (start < end) {
|
|
230
|
+
cur_idx_ = start;
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
valid_ = false;
|
|
234
|
+
} else {
|
|
235
|
+
// Last range — natural EOF. Don't set out-of-bound so LevelIterator
|
|
236
|
+
// advances to the next file.
|
|
237
|
+
valid_ = false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
void MultiScanIndexIterator::Next() {
|
|
242
|
+
assert(valid_);
|
|
243
|
+
|
|
244
|
+
// Release current block
|
|
245
|
+
read_set_->ReleaseBlock(cur_idx_);
|
|
246
|
+
++cur_idx_;
|
|
247
|
+
|
|
248
|
+
// Check if we've crossed a scan range boundary
|
|
249
|
+
if (next_scan_idx_ > 0) {
|
|
250
|
+
auto cur_scan_end_idx =
|
|
251
|
+
std::get<1>(block_index_ranges_per_scan_[next_scan_idx_ - 1]);
|
|
252
|
+
if (cur_idx_ >= cur_scan_end_idx) {
|
|
253
|
+
// Current scan range is exhausted
|
|
254
|
+
SetExhausted();
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Check prefetch limit
|
|
260
|
+
if (cur_idx_ >= prefetch_max_idx_) {
|
|
261
|
+
valid_ = false;
|
|
262
|
+
if (scan_opts_->max_prefetch_size > 0) {
|
|
263
|
+
status_ = Status::PrefetchLimitReached();
|
|
264
|
+
}
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Still within current range, valid
|
|
269
|
+
valid_ = true;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
void MultiScanIndexIterator::SeekToFirst() {
|
|
273
|
+
if (block_index_ranges_per_scan_.empty()) {
|
|
274
|
+
valid_ = false;
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
cur_idx_ = 0;
|
|
279
|
+
next_scan_idx_ = 0;
|
|
280
|
+
prev_seek_key_.clear();
|
|
281
|
+
wasted_blocks_count_ = 0;
|
|
282
|
+
status_ = Status::OK();
|
|
283
|
+
|
|
284
|
+
auto [start, end] = block_index_ranges_per_scan_[0];
|
|
285
|
+
if (start >= end) {
|
|
286
|
+
valid_ = false;
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
cur_idx_ = start;
|
|
290
|
+
next_scan_idx_ = 1;
|
|
291
|
+
valid_ = true;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
void MultiScanIndexIterator::SeekForPrev(const Slice& /*target*/) {
|
|
295
|
+
valid_ = false;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
void MultiScanIndexIterator::SeekToLast() { valid_ = false; }
|
|
299
|
+
|
|
300
|
+
void MultiScanIndexIterator::Prev() { valid_ = false; }
|
|
301
|
+
|
|
302
|
+
Slice MultiScanIndexIterator::key() const {
|
|
303
|
+
assert(valid_);
|
|
304
|
+
assert(cur_idx_ < data_block_separators_.size());
|
|
305
|
+
|
|
306
|
+
// Build internal key: user_key + pack(kMaxSequenceNumber, kValueTypeForSeek)
|
|
307
|
+
cur_key_buf_.clear();
|
|
308
|
+
AppendInternalKey(&cur_key_buf_,
|
|
309
|
+
ParsedInternalKey(data_block_separators_[cur_idx_],
|
|
310
|
+
kMaxSequenceNumber, kValueTypeForSeek));
|
|
311
|
+
return Slice(cur_key_buf_);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
Slice MultiScanIndexIterator::user_key() const {
|
|
315
|
+
assert(valid_);
|
|
316
|
+
assert(cur_idx_ < data_block_separators_.size());
|
|
317
|
+
return Slice(data_block_separators_[cur_idx_]);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
IndexValue MultiScanIndexIterator::value() const {
|
|
321
|
+
assert(valid_);
|
|
322
|
+
assert(cur_idx_ < block_handles_.size());
|
|
323
|
+
// Return IndexValue with empty first_internal_key to disable
|
|
324
|
+
// is_at_first_key_from_index_ optimization
|
|
325
|
+
return IndexValue(block_handles_[cur_idx_], Slice());
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
uint64_t MultiScanIndexIterator::GetMaxPrefetchSize() const {
|
|
329
|
+
return scan_opts_->max_prefetch_size;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
3
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
5
|
+
|
|
6
|
+
#pragma once
|
|
7
|
+
|
|
8
|
+
#include <string>
|
|
9
|
+
#include <tuple>
|
|
10
|
+
#include <vector>
|
|
11
|
+
|
|
12
|
+
#include "db/dbformat.h"
|
|
13
|
+
#include "rocksdb/io_dispatcher.h"
|
|
14
|
+
#include "table/format.h"
|
|
15
|
+
#include "table/internal_iterator.h"
|
|
16
|
+
#include "util/user_comparator_wrapper.h"
|
|
17
|
+
|
|
18
|
+
namespace ROCKSDB_NAMESPACE {
|
|
19
|
+
|
|
20
|
+
class MultiScanArgs;
|
|
21
|
+
class Statistics;
|
|
22
|
+
|
|
23
|
+
// MultiScanIndexIterator wraps the block handle list produced by
|
|
24
|
+
// Prepare()/CollectBlockHandles() and presents it as an
|
|
25
|
+
// InternalIteratorBase<IndexValue>. This allows BlockBasedTableIterator
|
|
26
|
+
// to use the same SeekImpl()/FindBlockForward() code path for both
|
|
27
|
+
// regular iteration and MultiScan.
|
|
28
|
+
//
|
|
29
|
+
// The iterator supports forward-only Seek() and Next(). Seek targets must
|
|
30
|
+
// be non-decreasing (enforced via prev_seek_key_). When a scan range is
|
|
31
|
+
// exhausted, Next() jumps to the start of the next scan range. When all
|
|
32
|
+
// ranges are exhausted, the iterator becomes invalid.
|
|
33
|
+
class MultiScanIndexIterator : public InternalIteratorBase<IndexValue> {
|
|
34
|
+
public:
|
|
35
|
+
// scan_opts and icomp must outlive this iterator. read_set is shared.
|
|
36
|
+
MultiScanIndexIterator(
|
|
37
|
+
std::vector<BlockHandle>&& block_handles,
|
|
38
|
+
std::vector<std::string>&& data_block_separators,
|
|
39
|
+
std::vector<std::tuple<size_t, size_t>>&& block_index_ranges_per_scan,
|
|
40
|
+
const MultiScanArgs* scan_opts, std::shared_ptr<ReadSet> read_set,
|
|
41
|
+
size_t prefetch_max_idx, const InternalKeyComparator& icomp,
|
|
42
|
+
Statistics* statistics);
|
|
43
|
+
|
|
44
|
+
~MultiScanIndexIterator() override;
|
|
45
|
+
|
|
46
|
+
// Non-copyable, non-movable.
|
|
47
|
+
MultiScanIndexIterator(const MultiScanIndexIterator&) = delete;
|
|
48
|
+
MultiScanIndexIterator& operator=(const MultiScanIndexIterator&) = delete;
|
|
49
|
+
MultiScanIndexIterator(MultiScanIndexIterator&&) = delete;
|
|
50
|
+
MultiScanIndexIterator& operator=(MultiScanIndexIterator&&) = delete;
|
|
51
|
+
|
|
52
|
+
// Forward-only seek. target must be >= prev_seek_key_.
|
|
53
|
+
void Seek(const Slice& target) override;
|
|
54
|
+
|
|
55
|
+
// Move to the next block. Handles scan range boundaries.
|
|
56
|
+
void Next() override;
|
|
57
|
+
|
|
58
|
+
// Move to the first block of the first scan range.
|
|
59
|
+
void SeekToFirst() override;
|
|
60
|
+
|
|
61
|
+
// Not supported — sets valid_ = false.
|
|
62
|
+
void SeekForPrev(const Slice& target) override;
|
|
63
|
+
void SeekToLast() override;
|
|
64
|
+
void Prev() override;
|
|
65
|
+
|
|
66
|
+
bool Valid() const override { return valid_; }
|
|
67
|
+
|
|
68
|
+
// Returns an internal key built from the current block's separator
|
|
69
|
+
// with kMaxSequenceNumber.
|
|
70
|
+
Slice key() const override;
|
|
71
|
+
|
|
72
|
+
// Returns the user key separator for the current block.
|
|
73
|
+
Slice user_key() const override;
|
|
74
|
+
|
|
75
|
+
// Returns IndexValue with the current block handle and empty
|
|
76
|
+
// first_internal_key (disables is_at_first_key_from_index_ optimization).
|
|
77
|
+
IndexValue value() const override;
|
|
78
|
+
|
|
79
|
+
Status status() const override { return status_; }
|
|
80
|
+
|
|
81
|
+
// Returns the current index into the block_handles/read_set arrays.
|
|
82
|
+
size_t current_read_set_index() const { return cur_idx_; }
|
|
83
|
+
|
|
84
|
+
// Returns the max_prefetch_size from scan options.
|
|
85
|
+
uint64_t GetMaxPrefetchSize() const;
|
|
86
|
+
|
|
87
|
+
// Returns true if the last Next() crossed a scan range boundary.
|
|
88
|
+
// Only valid immediately after Next(); reset to false on the next Seek().
|
|
89
|
+
bool IsScanRangeExhausted() const { return scan_range_exhausted_; }
|
|
90
|
+
|
|
91
|
+
// Returns true if there are more scan ranges after the current one.
|
|
92
|
+
bool HasMoreScanRanges() const {
|
|
93
|
+
return next_scan_idx_ < block_index_ranges_per_scan_.size();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private:
|
|
97
|
+
// Release blocks from from_idx (inclusive) to to_idx (exclusive),
|
|
98
|
+
// counting wasted prefetched blocks.
|
|
99
|
+
void ReleaseBlocks(size_t from_idx, size_t to_idx);
|
|
100
|
+
|
|
101
|
+
// Find the correct scan range and block for an unexpected seek target
|
|
102
|
+
// (target doesn't match expected scan range start).
|
|
103
|
+
void SeekToBlock(const Slice* user_seek_target);
|
|
104
|
+
|
|
105
|
+
// Position at block_idx after releasing any skipped blocks.
|
|
106
|
+
void SeekToBlockIdx(size_t block_idx);
|
|
107
|
+
|
|
108
|
+
// Mark the current scan range as exhausted. If more ranges remain,
|
|
109
|
+
// positions at the next range's start (stays valid for out-of-bound
|
|
110
|
+
// detection). If this is the last range, becomes invalid.
|
|
111
|
+
void SetExhausted();
|
|
112
|
+
|
|
113
|
+
std::vector<BlockHandle> block_handles_;
|
|
114
|
+
std::vector<std::string> data_block_separators_;
|
|
115
|
+
std::vector<std::tuple<size_t, size_t>> block_index_ranges_per_scan_;
|
|
116
|
+
const MultiScanArgs* scan_opts_;
|
|
117
|
+
std::shared_ptr<ReadSet> read_set_;
|
|
118
|
+
size_t prefetch_max_idx_;
|
|
119
|
+
const InternalKeyComparator& icomp_;
|
|
120
|
+
UserComparatorWrapper user_comparator_;
|
|
121
|
+
Statistics* statistics_;
|
|
122
|
+
|
|
123
|
+
size_t cur_idx_ = 0;
|
|
124
|
+
size_t next_scan_idx_ = 0;
|
|
125
|
+
bool valid_ = false;
|
|
126
|
+
Status status_;
|
|
127
|
+
std::string prev_seek_key_;
|
|
128
|
+
size_t wasted_blocks_count_ = 0;
|
|
129
|
+
bool scan_range_exhausted_ = false;
|
|
130
|
+
mutable std::string cur_key_buf_;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -39,13 +39,15 @@ PartitionedFilterBlockBuilder::PartitionedFilterBlockBuilder(
|
|
|
39
39
|
use_value_delta_encoding,
|
|
40
40
|
BlockBasedTableOptions::kDataBlockBinarySearch /* index_type */,
|
|
41
41
|
0.75 /* data_block_hash_table_util_ratio */, ts_sz,
|
|
42
|
-
persist_user_defined_timestamps, false /* is_user_key
|
|
42
|
+
persist_user_defined_timestamps, false /* is_user_key */,
|
|
43
|
+
/*use_separated_kv_storage=*/false),
|
|
43
44
|
index_on_filter_block_builder_without_seq_(
|
|
44
45
|
index_block_restart_interval, true /*use_delta_encoding*/,
|
|
45
46
|
use_value_delta_encoding,
|
|
46
47
|
BlockBasedTableOptions::kDataBlockBinarySearch /* index_type */,
|
|
47
48
|
0.75 /* data_block_hash_table_util_ratio */, ts_sz,
|
|
48
|
-
persist_user_defined_timestamps, true /* is_user_key
|
|
49
|
+
persist_user_defined_timestamps, true /* is_user_key */,
|
|
50
|
+
/*use_separated_kv_storage=*/false) {
|
|
49
51
|
// Compute keys_per_partition_
|
|
50
52
|
keys_per_partition_ = static_cast<uint32_t>(
|
|
51
53
|
filter_bits_builder_->ApproximateNumEntries(partition_size));
|
|
@@ -350,7 +350,7 @@ INSTANTIATE_TEST_CASE_P(
|
|
|
350
350
|
FormatVersions, PartitionedFilterBlockTest,
|
|
351
351
|
testing::Combine(
|
|
352
352
|
testing::ValuesIn(std::set<uint32_t>{
|
|
353
|
-
2, 3, 4, 5, test::kDefaultFormatVersion,
|
|
353
|
+
2, 3, 4, 5, test::kDefaultFormatVersion, kLatestBbtFormatVersion}),
|
|
354
354
|
testing::ValuesIn(test::GetUDTTestModes()), testing::Bool()));
|
|
355
355
|
|
|
356
356
|
TEST_P(PartitionedFilterBlockTest, EmptyBuilder) {
|
|
@@ -25,7 +25,7 @@ void ForceReleaseCachedEntry(void* arg, void* h) {
|
|
|
25
25
|
// WART: this is specific to block-based table
|
|
26
26
|
Status VerifyBlockChecksum(const Footer& footer, const char* data,
|
|
27
27
|
size_t block_size, const std::string& file_name,
|
|
28
|
-
uint64_t offset) {
|
|
28
|
+
uint64_t offset, BlockType block_type) {
|
|
29
29
|
PERF_TIMER_GUARD(block_checksum_time);
|
|
30
30
|
|
|
31
31
|
assert(footer.GetBlockTrailerSize() == 5);
|
|
@@ -58,7 +58,8 @@ Status VerifyBlockChecksum(const Footer& footer, const char* data,
|
|
|
58
58
|
std::string(modifier ? "(context removed)" : "") + " = " +
|
|
59
59
|
std::to_string(stored) + ", computed = " + std::to_string(computed) +
|
|
60
60
|
", type = " + std::to_string(type) + " in " + file_name + " offset " +
|
|
61
|
-
std::to_string(offset) + " size " + std::to_string(block_size)
|
|
61
|
+
std::to_string(offset) + " size " + std::to_string(block_size) +
|
|
62
|
+
", block_type = " + BlockTypeToString(block_type));
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
#include "rocksdb/advanced_cache.h"
|
|
12
12
|
#include "rocksdb/table.h"
|
|
13
|
+
#include "table/block_based/block_type.h"
|
|
13
14
|
|
|
14
15
|
namespace ROCKSDB_NAMESPACE {
|
|
15
16
|
class Footer;
|
|
@@ -27,10 +28,12 @@ inline MemoryAllocator* GetMemoryAllocator(
|
|
|
27
28
|
// Assumes block has a trailer past `data + block_size` as in format.h.
|
|
28
29
|
// `file_name` provided for generating diagnostic message in returned status.
|
|
29
30
|
// `offset` might be required for proper verification (also used for message).
|
|
31
|
+
// `block_type` is included in the error message to provide context about
|
|
32
|
+
// which type of block failed checksum verification.
|
|
30
33
|
//
|
|
31
34
|
// Returns Status::OK() on checksum match, or Status::Corruption() on checksum
|
|
32
35
|
// mismatch.
|
|
33
36
|
Status VerifyBlockChecksum(const Footer& footer, const char* data,
|
|
34
37
|
size_t block_size, const std::string& file_name,
|
|
35
|
-
uint64_t offset);
|
|
38
|
+
uint64_t offset, BlockType block_type);
|
|
36
39
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -18,7 +18,6 @@ struct BlockCacheLookupContext;
|
|
|
18
18
|
class FilePrefetchBuffer;
|
|
19
19
|
class GetContext;
|
|
20
20
|
struct ReadOptions;
|
|
21
|
-
struct UncompressionDict;
|
|
22
21
|
|
|
23
22
|
// Provides access to the uncompression dictionary regardless of whether
|
|
24
23
|
// it is owned by the reader or stored in the cache, or whether it is pinned
|