@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
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
|
|
6
6
|
#include "db/wide/wide_column_serialization.h"
|
|
7
7
|
|
|
8
|
-
#include <algorithm>
|
|
9
8
|
#include <cassert>
|
|
10
|
-
#include <
|
|
9
|
+
#include <cstring>
|
|
11
10
|
|
|
11
|
+
#include "db/blob/blob_fetcher.h"
|
|
12
|
+
#include "db/blob/blob_index.h"
|
|
13
|
+
#include "db/blob/prefetch_buffer_collection.h"
|
|
12
14
|
#include "db/wide/wide_columns_helper.h"
|
|
13
15
|
#include "rocksdb/slice.h"
|
|
14
16
|
#include "util/autovector.h"
|
|
@@ -16,15 +18,46 @@
|
|
|
16
18
|
|
|
17
19
|
namespace ROCKSDB_NAMESPACE {
|
|
18
20
|
|
|
21
|
+
Status WideColumnSerialization::BuildBlobIndexMap(
|
|
22
|
+
size_t num_columns,
|
|
23
|
+
const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
|
|
24
|
+
std::vector<const BlobIndex*>& blob_index_map) {
|
|
25
|
+
if (Status s = ValidateWideColumnLimit(num_columns, "Too many wide columns");
|
|
26
|
+
!s.ok()) {
|
|
27
|
+
return s;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
blob_index_map.assign(num_columns, nullptr);
|
|
31
|
+
for (const auto& blob_col : blob_columns) {
|
|
32
|
+
if (blob_col.first >= blob_index_map.size()) {
|
|
33
|
+
return Status::InvalidArgument("Blob column index out of range");
|
|
34
|
+
}
|
|
35
|
+
blob_index_map[blob_col.first] = &blob_col.second;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return Status::OK();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
bool WideColumnSerialization::ContainsBlobType(const char* type_bytes,
|
|
42
|
+
uint32_t num_columns) {
|
|
43
|
+
for (uint32_t i = 0; i < num_columns; ++i) {
|
|
44
|
+
if (static_cast<uint8_t>(type_bytes[i]) == kTypeBlobIndex) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
19
51
|
Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
20
52
|
std::string& output) {
|
|
21
53
|
const size_t num_columns = columns.size();
|
|
22
54
|
|
|
23
|
-
if (num_columns
|
|
24
|
-
|
|
55
|
+
if (Status sv = ValidateWideColumnLimit(num_columns, "Too many wide columns");
|
|
56
|
+
!sv.ok()) {
|
|
57
|
+
return sv;
|
|
25
58
|
}
|
|
26
59
|
|
|
27
|
-
PutVarint32(&output,
|
|
60
|
+
PutVarint32(&output, kVersion1);
|
|
28
61
|
|
|
29
62
|
PutVarint32(&output, static_cast<uint32_t>(num_columns));
|
|
30
63
|
|
|
@@ -34,19 +67,23 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
|
34
67
|
const WideColumn& column = columns[i];
|
|
35
68
|
|
|
36
69
|
const Slice& name = column.name();
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
|
|
70
|
+
if (Status s_name =
|
|
71
|
+
ValidateWideColumnLimit(name.size(), "Wide column name too long");
|
|
72
|
+
!s_name.ok()) {
|
|
73
|
+
return s_name;
|
|
40
74
|
}
|
|
41
75
|
|
|
42
|
-
if (prev_name
|
|
43
|
-
|
|
76
|
+
if (prev_name) {
|
|
77
|
+
if (Status so = ValidateColumnOrder(*prev_name, name); !so.ok()) {
|
|
78
|
+
return so;
|
|
79
|
+
}
|
|
44
80
|
}
|
|
45
81
|
|
|
46
82
|
const Slice& value = column.value();
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
|
|
83
|
+
if (Status s_val =
|
|
84
|
+
ValidateWideColumnLimit(value.size(), "Wide column value too long");
|
|
85
|
+
!s_val.ok()) {
|
|
86
|
+
return s_val;
|
|
50
87
|
}
|
|
51
88
|
|
|
52
89
|
PutLengthPrefixedSlice(&output, name);
|
|
@@ -64,28 +101,151 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
|
64
101
|
return Status::OK();
|
|
65
102
|
}
|
|
66
103
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
104
|
+
template <typename GetName, typename GetValue>
|
|
105
|
+
Status WideColumnSerialization::SerializeV2Impl(
|
|
106
|
+
size_t num_columns,
|
|
107
|
+
const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
|
|
108
|
+
std::string& output, GetName get_name, GetValue get_value) {
|
|
109
|
+
std::vector<const BlobIndex*> blob_index_map;
|
|
110
|
+
if (Status s = BuildBlobIndexMap(num_columns, blob_columns, blob_index_map);
|
|
111
|
+
!s.ok()) {
|
|
112
|
+
return s;
|
|
74
113
|
}
|
|
114
|
+
assert(blob_index_map.size() == num_columns);
|
|
115
|
+
|
|
116
|
+
// First pass: validate column ordering, compute sizes, serialize blob
|
|
117
|
+
// indices, and build column types.
|
|
118
|
+
std::vector<std::string> serialized_blob_indices(num_columns);
|
|
119
|
+
std::vector<uint32_t> name_sizes(num_columns);
|
|
120
|
+
std::vector<uint32_t> value_sizes(num_columns);
|
|
121
|
+
std::string column_types;
|
|
122
|
+
column_types.reserve(num_columns);
|
|
123
|
+
|
|
124
|
+
Slice prev_name_storage;
|
|
125
|
+
bool has_prev = false;
|
|
126
|
+
uint32_t name_sizes_bytes = 0;
|
|
127
|
+
uint32_t names_bytes = 0;
|
|
128
|
+
uint32_t total_value_sizes_bytes = 0;
|
|
129
|
+
uint32_t total_values_bytes = 0;
|
|
130
|
+
|
|
131
|
+
for (size_t i = 0; i < num_columns; ++i) {
|
|
132
|
+
const Slice name = get_name(i);
|
|
133
|
+
const Slice value = get_value(i);
|
|
134
|
+
|
|
135
|
+
if (Status sn =
|
|
136
|
+
ValidateWideColumnLimit(name.size(), "Wide column name too long");
|
|
137
|
+
!sn.ok()) {
|
|
138
|
+
return sn;
|
|
139
|
+
}
|
|
75
140
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
141
|
+
if (has_prev) {
|
|
142
|
+
if (Status so = ValidateColumnOrder(prev_name_storage, name); !so.ok()) {
|
|
143
|
+
return so;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
79
146
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
147
|
+
name_sizes[i] = static_cast<uint32_t>(name.size());
|
|
148
|
+
name_sizes_bytes += VarintLength(name_sizes[i]);
|
|
149
|
+
names_bytes += name_sizes[i];
|
|
150
|
+
|
|
151
|
+
if (blob_index_map[i] != nullptr) {
|
|
152
|
+
const BlobIndex* blob_idx = blob_index_map[i];
|
|
153
|
+
blob_idx->EncodeTo(&serialized_blob_indices[i]);
|
|
154
|
+
value_sizes[i] = static_cast<uint32_t>(serialized_blob_indices[i].size());
|
|
155
|
+
column_types.push_back(static_cast<char>(kTypeBlobIndex));
|
|
156
|
+
} else {
|
|
157
|
+
if (Status svl = ValidateWideColumnLimit(value.size(),
|
|
158
|
+
"Wide column value too long");
|
|
159
|
+
!svl.ok()) {
|
|
160
|
+
return svl;
|
|
161
|
+
}
|
|
162
|
+
value_sizes[i] = static_cast<uint32_t>(value.size());
|
|
163
|
+
column_types.push_back(static_cast<char>(kTypeValue));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
total_value_sizes_bytes += VarintLength(value_sizes[i]);
|
|
167
|
+
total_values_bytes += value_sizes[i];
|
|
168
|
+
|
|
169
|
+
prev_name_storage = name;
|
|
170
|
+
has_prev = true;
|
|
83
171
|
}
|
|
84
172
|
|
|
85
|
-
|
|
173
|
+
// Second pass: write all V2 sections to output.
|
|
174
|
+
// Pre-allocate output string.
|
|
175
|
+
const size_t total_size =
|
|
176
|
+
VarintLength(kVersion2) +
|
|
177
|
+
VarintLength(static_cast<uint32_t>(num_columns)) +
|
|
178
|
+
num_columns + // column types
|
|
179
|
+
VarintLength(name_sizes_bytes) + VarintLength(total_value_sizes_bytes) +
|
|
180
|
+
VarintLength(names_bytes) + name_sizes_bytes + total_value_sizes_bytes +
|
|
181
|
+
names_bytes + total_values_bytes;
|
|
182
|
+
|
|
183
|
+
const size_t base_offset = output.size();
|
|
184
|
+
output.reserve(base_offset + total_size);
|
|
185
|
+
|
|
186
|
+
// Sections 1-3: header, skip info, column types
|
|
187
|
+
PutVarint32(&output, kVersion2);
|
|
188
|
+
PutVarint32(&output, static_cast<uint32_t>(num_columns));
|
|
189
|
+
PutVarint32(&output, name_sizes_bytes);
|
|
190
|
+
PutVarint32(&output, total_value_sizes_bytes);
|
|
191
|
+
PutVarint32(&output, names_bytes);
|
|
192
|
+
output.append(column_types);
|
|
193
|
+
|
|
194
|
+
// Sections 4-7: resize to final size, then write all 4 sections in a
|
|
195
|
+
// single loop using independent pointers. Each section's start offset is
|
|
196
|
+
// known from the sizes computed in the first pass.
|
|
197
|
+
if (num_columns == 0) {
|
|
86
198
|
return Status::OK();
|
|
87
199
|
}
|
|
88
200
|
|
|
201
|
+
const size_t sec4_offset = output.size();
|
|
202
|
+
output.resize(base_offset + total_size);
|
|
203
|
+
|
|
204
|
+
char* s4 = &output[sec4_offset]; // section 4: name sizes
|
|
205
|
+
char* s5 = s4 + name_sizes_bytes; // section 5: value sizes
|
|
206
|
+
char* s6 = s5 + total_value_sizes_bytes; // section 6: names
|
|
207
|
+
char* s7 = s6 + names_bytes; // section 7: values
|
|
208
|
+
|
|
209
|
+
for (size_t i = 0; i < num_columns; ++i) {
|
|
210
|
+
s4 = EncodeVarint32(s4, name_sizes[i]);
|
|
211
|
+
s5 = EncodeVarint32(s5, value_sizes[i]);
|
|
212
|
+
|
|
213
|
+
memcpy(s6, get_name(i).data(), name_sizes[i]);
|
|
214
|
+
s6 += name_sizes[i];
|
|
215
|
+
|
|
216
|
+
if (blob_index_map[i] != nullptr) {
|
|
217
|
+
memcpy(s7, serialized_blob_indices[i].data(), value_sizes[i]);
|
|
218
|
+
} else {
|
|
219
|
+
memcpy(s7, get_value(i).data(), value_sizes[i]);
|
|
220
|
+
}
|
|
221
|
+
s7 += value_sizes[i];
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return Status::OK();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
Status WideColumnSerialization::SerializeV2(
|
|
228
|
+
const std::vector<std::pair<std::string, std::string>>& columns,
|
|
229
|
+
const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
|
|
230
|
+
std::string& output) {
|
|
231
|
+
return SerializeV2Impl(
|
|
232
|
+
columns.size(), blob_columns, output,
|
|
233
|
+
[&](size_t i) { return Slice(columns[i].first); },
|
|
234
|
+
[&](size_t i) { return Slice(columns[i].second); });
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
Status WideColumnSerialization::SerializeV2(
|
|
238
|
+
const WideColumns& columns,
|
|
239
|
+
const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
|
|
240
|
+
std::string& output) {
|
|
241
|
+
return SerializeV2Impl(
|
|
242
|
+
columns.size(), blob_columns, output,
|
|
243
|
+
[&](size_t i) { return columns[i].name(); },
|
|
244
|
+
[&](size_t i) { return columns[i].value(); });
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
Status WideColumnSerialization::DeserializeV1(
|
|
248
|
+
Slice& input, uint32_t num_columns, std::vector<WideColumn>& columns) {
|
|
89
249
|
columns.reserve(num_columns);
|
|
90
250
|
|
|
91
251
|
autovector<uint32_t, 16> column_value_sizes;
|
|
@@ -97,8 +257,11 @@ Status WideColumnSerialization::Deserialize(Slice& input,
|
|
|
97
257
|
return Status::Corruption("Error decoding wide column name");
|
|
98
258
|
}
|
|
99
259
|
|
|
100
|
-
if (!columns.empty()
|
|
101
|
-
|
|
260
|
+
if (!columns.empty()) {
|
|
261
|
+
if (Status so = ValidateColumnOrder(columns.back().name(), name);
|
|
262
|
+
!so.ok()) {
|
|
263
|
+
return so;
|
|
264
|
+
}
|
|
102
265
|
}
|
|
103
266
|
|
|
104
267
|
columns.emplace_back(name, Slice());
|
|
@@ -129,12 +292,324 @@ Status WideColumnSerialization::Deserialize(Slice& input,
|
|
|
129
292
|
return Status::OK();
|
|
130
293
|
}
|
|
131
294
|
|
|
295
|
+
Status WideColumnSerialization::DeserializeV2Impl(
|
|
296
|
+
Slice& input, uint32_t num_columns, std::vector<WideColumn>& columns,
|
|
297
|
+
std::vector<ValueType>& column_types) {
|
|
298
|
+
// Section 2: SKIP INFO (3 varints)
|
|
299
|
+
uint32_t name_sizes_bytes = 0;
|
|
300
|
+
uint32_t value_sizes_bytes = 0;
|
|
301
|
+
uint32_t names_bytes = 0;
|
|
302
|
+
if (!GetVarint32(&input, &name_sizes_bytes)) {
|
|
303
|
+
return Status::Corruption("Error decoding wide column name sizes bytes");
|
|
304
|
+
}
|
|
305
|
+
if (!GetVarint32(&input, &value_sizes_bytes)) {
|
|
306
|
+
return Status::Corruption("Error decoding wide column value sizes bytes");
|
|
307
|
+
}
|
|
308
|
+
if (!GetVarint32(&input, &names_bytes)) {
|
|
309
|
+
return Status::Corruption("Error decoding wide column names bytes");
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Section 3: COLUMN TYPES (N bytes, each is a ValueType)
|
|
313
|
+
if (input.size() < num_columns) {
|
|
314
|
+
return Status::Corruption("Error decoding wide column types");
|
|
315
|
+
}
|
|
316
|
+
column_types.resize(num_columns);
|
|
317
|
+
for (uint32_t i = 0; i < num_columns; ++i) {
|
|
318
|
+
column_types[i] = static_cast<ValueType>(input[i]);
|
|
319
|
+
if (!IsValidColumnValueType(column_types[i])) {
|
|
320
|
+
return Status::Corruption("Unsupported wide column ValueType");
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
input.remove_prefix(num_columns);
|
|
324
|
+
|
|
325
|
+
// Validate that sections 4-6 fit in the remaining input
|
|
326
|
+
const size_t metadata_size =
|
|
327
|
+
name_sizes_bytes + value_sizes_bytes + names_bytes;
|
|
328
|
+
if (input.size() < metadata_size) {
|
|
329
|
+
return Status::Corruption("Error decoding wide column sections");
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Set up 4 pointers into sections 4-7 for single-loop parsing.
|
|
333
|
+
// Skip info gives us exact boundaries for each section.
|
|
334
|
+
const char* s4 = input.data(); // section 4: name sizes
|
|
335
|
+
const char* s4_limit = s4 + name_sizes_bytes;
|
|
336
|
+
const char* s5 = s4_limit; // section 5: value sizes
|
|
337
|
+
const char* s5_limit = s5 + value_sizes_bytes;
|
|
338
|
+
const char* s6 = s5_limit; // section 6: names
|
|
339
|
+
const char* s7 = s6 + names_bytes; // section 7: values
|
|
340
|
+
const char* input_end = input.data() + input.size();
|
|
341
|
+
|
|
342
|
+
columns.reserve(num_columns);
|
|
343
|
+
size_t name_pos = 0;
|
|
344
|
+
size_t value_pos = 0;
|
|
345
|
+
|
|
346
|
+
for (uint32_t i = 0; i < num_columns; ++i) {
|
|
347
|
+
// Decode name size from section 4
|
|
348
|
+
uint32_t ns = 0;
|
|
349
|
+
const char* s4_next = GetVarint32Ptr(s4, s4_limit, &ns);
|
|
350
|
+
if (s4_next == nullptr) {
|
|
351
|
+
return Status::Corruption("Error decoding wide column name size");
|
|
352
|
+
}
|
|
353
|
+
s4 = s4_next;
|
|
354
|
+
|
|
355
|
+
// Decode value size from section 5
|
|
356
|
+
uint32_t vs = 0;
|
|
357
|
+
const char* s5_next = GetVarint32Ptr(s5, s5_limit, &vs);
|
|
358
|
+
if (s5_next == nullptr) {
|
|
359
|
+
return Status::Corruption("Error decoding wide column value size");
|
|
360
|
+
}
|
|
361
|
+
s5 = s5_next;
|
|
362
|
+
|
|
363
|
+
// Read name from section 6
|
|
364
|
+
if (name_pos + ns > names_bytes) {
|
|
365
|
+
return Status::Corruption("Error decoding wide column name");
|
|
366
|
+
}
|
|
367
|
+
Slice name(s6 + name_pos, ns);
|
|
368
|
+
|
|
369
|
+
if (!columns.empty()) {
|
|
370
|
+
if (Status so = ValidateColumnOrder(columns.back().name(), name);
|
|
371
|
+
!so.ok()) {
|
|
372
|
+
return so;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Read value from section 7
|
|
377
|
+
if (s7 + value_pos + vs > input_end) {
|
|
378
|
+
return Status::Corruption("Error decoding wide column value payload");
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
columns.emplace_back(name, Slice(s7 + value_pos, vs));
|
|
382
|
+
name_pos += ns;
|
|
383
|
+
value_pos += vs;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return Status::OK();
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
Status WideColumnSerialization::Deserialize(Slice& input,
|
|
390
|
+
WideColumns& columns) {
|
|
391
|
+
assert(columns.empty());
|
|
392
|
+
|
|
393
|
+
// Reuse DeserializeV2, then reject any blob references.
|
|
394
|
+
std::vector<std::pair<size_t, BlobIndex>> blob_columns;
|
|
395
|
+
if (Status s = DeserializeV2(input, columns, blob_columns); !s.ok()) {
|
|
396
|
+
return s;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
if (!blob_columns.empty()) {
|
|
400
|
+
return Status::NotSupported(
|
|
401
|
+
"Wide column contains blob references. Use DeserializeV2.");
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return Status::OK();
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
Status WideColumnSerialization::DeserializeV2(
|
|
408
|
+
Slice& input, std::vector<WideColumn>& columns,
|
|
409
|
+
std::vector<std::pair<size_t, BlobIndex>>& blob_columns) {
|
|
410
|
+
assert(columns.empty());
|
|
411
|
+
assert(blob_columns.empty());
|
|
412
|
+
|
|
413
|
+
uint32_t version = 0;
|
|
414
|
+
if (!GetVarint32(&input, &version)) {
|
|
415
|
+
return Status::Corruption("Error decoding wide column version");
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (version > kVersion2) {
|
|
419
|
+
return Status::NotSupported("Unsupported wide column version");
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
uint32_t num_columns = 0;
|
|
423
|
+
if (!GetVarint32(&input, &num_columns)) {
|
|
424
|
+
return Status::Corruption("Error decoding number of wide columns");
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
if (!num_columns) {
|
|
428
|
+
return Status::OK();
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
if (version >= kVersion2) {
|
|
432
|
+
// V2 layout: parse columns and extract blob column info
|
|
433
|
+
std::vector<ValueType> column_types;
|
|
434
|
+
|
|
435
|
+
if (Status s = DeserializeV2Impl(input, num_columns, columns, column_types);
|
|
436
|
+
!s.ok()) {
|
|
437
|
+
return s;
|
|
438
|
+
}
|
|
439
|
+
assert(column_types.size() == num_columns);
|
|
440
|
+
assert(columns.size() == num_columns);
|
|
441
|
+
|
|
442
|
+
// Decode blob indices from value data
|
|
443
|
+
for (uint32_t i = 0; i < num_columns; ++i) {
|
|
444
|
+
if (column_types[i] == kTypeBlobIndex) {
|
|
445
|
+
BlobIndex blob_idx;
|
|
446
|
+
Slice blob_slice = columns[i].value();
|
|
447
|
+
if (Status bs = blob_idx.DecodeFrom(blob_slice); !bs.ok()) {
|
|
448
|
+
return Status::Corruption("Error decoding blob index in wide column");
|
|
449
|
+
}
|
|
450
|
+
blob_columns.emplace_back(i, blob_idx);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
} else {
|
|
454
|
+
return DeserializeV1(input, num_columns, columns);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
return Status::OK();
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
Status WideColumnSerialization::HasBlobColumns(const Slice& input,
|
|
461
|
+
bool& has_blob_columns) {
|
|
462
|
+
has_blob_columns = false;
|
|
463
|
+
|
|
464
|
+
Slice input_ref = input;
|
|
465
|
+
|
|
466
|
+
uint32_t version = 0;
|
|
467
|
+
if (!GetVarint32(&input_ref, &version)) {
|
|
468
|
+
return Status::Corruption("Error decoding wide column version");
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Version 1 never has blob columns
|
|
472
|
+
if (version < kVersion2) {
|
|
473
|
+
return Status::OK();
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
uint32_t num_columns = 0;
|
|
477
|
+
if (!GetVarint32(&input_ref, &num_columns)) {
|
|
478
|
+
return Status::Corruption("Error decoding number of wide columns");
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
if (!num_columns) {
|
|
482
|
+
return Status::OK();
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// V2: Skip over SKIP INFO (3 varints) to reach COLUMN TYPES section.
|
|
486
|
+
uint32_t unused_name_sizes_bytes = 0;
|
|
487
|
+
uint32_t unused_value_sizes_bytes = 0;
|
|
488
|
+
uint32_t unused_names_bytes = 0;
|
|
489
|
+
if (!GetVarint32(&input_ref, &unused_name_sizes_bytes) ||
|
|
490
|
+
!GetVarint32(&input_ref, &unused_value_sizes_bytes) ||
|
|
491
|
+
!GetVarint32(&input_ref, &unused_names_bytes)) {
|
|
492
|
+
return Status::Corruption("Error decoding wide column skip info");
|
|
493
|
+
}
|
|
494
|
+
if (input_ref.size() < num_columns) {
|
|
495
|
+
return Status::Corruption("Error decoding wide column types");
|
|
496
|
+
}
|
|
497
|
+
has_blob_columns = ContainsBlobType(input_ref.data(), num_columns);
|
|
498
|
+
|
|
499
|
+
return Status::OK();
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
Status WideColumnSerialization::GetVersion(const Slice& input,
|
|
503
|
+
uint32_t& version) {
|
|
504
|
+
Slice input_ref = input;
|
|
505
|
+
|
|
506
|
+
version = 0;
|
|
507
|
+
if (!GetVarint32(&input_ref, &version)) {
|
|
508
|
+
return Status::Corruption("Error decoding wide column version");
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
return Status::OK();
|
|
512
|
+
}
|
|
513
|
+
|
|
132
514
|
Status WideColumnSerialization::GetValueOfDefaultColumn(Slice& input,
|
|
133
515
|
Slice& value) {
|
|
516
|
+
Slice input_ref = input;
|
|
517
|
+
|
|
518
|
+
uint32_t version = 0;
|
|
519
|
+
if (!GetVarint32(&input_ref, &version)) {
|
|
520
|
+
return Status::Corruption("Error decoding wide column version");
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
if (version > kVersion2) {
|
|
524
|
+
return Status::NotSupported("Unsupported wide column version");
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
uint32_t num_columns = 0;
|
|
528
|
+
if (!GetVarint32(&input_ref, &num_columns)) {
|
|
529
|
+
return Status::Corruption("Error decoding number of wide columns");
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
if (!num_columns) {
|
|
533
|
+
value.clear();
|
|
534
|
+
return Status::OK();
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
if (version >= kVersion2) {
|
|
538
|
+
// V2 fast path: use skip info to jump directly to values without
|
|
539
|
+
// scanning through variable-length sections.
|
|
540
|
+
|
|
541
|
+
// Read SKIP INFO (3 varints, immediately after header)
|
|
542
|
+
uint32_t name_sizes_bytes = 0;
|
|
543
|
+
uint32_t value_sizes_bytes = 0;
|
|
544
|
+
uint32_t names_bytes = 0;
|
|
545
|
+
if (!GetVarint32(&input_ref, &name_sizes_bytes)) {
|
|
546
|
+
return Status::Corruption("Error decoding wide column name sizes bytes");
|
|
547
|
+
}
|
|
548
|
+
if (!GetVarint32(&input_ref, &value_sizes_bytes)) {
|
|
549
|
+
return Status::Corruption("Error decoding wide column value sizes bytes");
|
|
550
|
+
}
|
|
551
|
+
if (!GetVarint32(&input_ref, &names_bytes)) {
|
|
552
|
+
return Status::Corruption("Error decoding wide column names bytes");
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Read COLUMN TYPES (N bytes)
|
|
556
|
+
if (input_ref.size() < num_columns) {
|
|
557
|
+
return Status::Corruption("Error decoding wide column types");
|
|
558
|
+
}
|
|
559
|
+
// Check if default column (index 0) is a blob reference
|
|
560
|
+
if (static_cast<uint8_t>(input_ref[0]) == kTypeBlobIndex) {
|
|
561
|
+
return Status::NotSupported(
|
|
562
|
+
"Wide column contains blob references. Use DeserializeV2.");
|
|
563
|
+
}
|
|
564
|
+
input_ref.remove_prefix(num_columns);
|
|
565
|
+
|
|
566
|
+
// Peek first name size from NAME SIZES section
|
|
567
|
+
if (input_ref.size() < name_sizes_bytes) {
|
|
568
|
+
return Status::Corruption("Error decoding wide column name sizes");
|
|
569
|
+
}
|
|
570
|
+
Slice name_sizes_section(input_ref.data(), name_sizes_bytes);
|
|
571
|
+
uint32_t first_name_size = 0;
|
|
572
|
+
if (!GetVarint32(&name_sizes_section, &first_name_size)) {
|
|
573
|
+
return Status::Corruption("Error decoding wide column name size");
|
|
574
|
+
}
|
|
575
|
+
input_ref.remove_prefix(name_sizes_bytes);
|
|
576
|
+
|
|
577
|
+
// Peek first value size from VALUE SIZES section
|
|
578
|
+
if (input_ref.size() < value_sizes_bytes) {
|
|
579
|
+
return Status::Corruption("Error decoding wide column value sizes");
|
|
580
|
+
}
|
|
581
|
+
Slice value_sizes_section(input_ref.data(), value_sizes_bytes);
|
|
582
|
+
uint32_t first_value_size = 0;
|
|
583
|
+
if (!GetVarint32(&value_sizes_section, &first_value_size)) {
|
|
584
|
+
return Status::Corruption("Error decoding wide column value size");
|
|
585
|
+
}
|
|
586
|
+
// Skip entire VALUE SIZES section using value_sizes_bytes
|
|
587
|
+
input_ref.remove_prefix(value_sizes_bytes);
|
|
588
|
+
|
|
589
|
+
// Check if the first column is the default column (empty name)
|
|
590
|
+
if (first_name_size != 0) {
|
|
591
|
+
value.clear();
|
|
592
|
+
return Status::OK();
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// Skip NAMES section
|
|
596
|
+
if (input_ref.size() < names_bytes) {
|
|
597
|
+
return Status::Corruption("Error decoding wide column names");
|
|
598
|
+
}
|
|
599
|
+
input_ref.remove_prefix(names_bytes);
|
|
600
|
+
|
|
601
|
+
// Read the first value from VALUES section
|
|
602
|
+
if (input_ref.size() < first_value_size) {
|
|
603
|
+
return Status::Corruption("Error decoding wide column value payload");
|
|
604
|
+
}
|
|
605
|
+
value = Slice(input_ref.data(), first_value_size);
|
|
606
|
+
return Status::OK();
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// V1 fallback: full deserialization
|
|
134
610
|
WideColumns columns;
|
|
135
611
|
|
|
136
|
-
|
|
137
|
-
if (!s.ok()) {
|
|
612
|
+
if (Status s = Deserialize(input, columns); !s.ok()) {
|
|
138
613
|
return s;
|
|
139
614
|
}
|
|
140
615
|
|
|
@@ -148,4 +623,145 @@ Status WideColumnSerialization::GetValueOfDefaultColumn(Slice& input,
|
|
|
148
623
|
return Status::OK();
|
|
149
624
|
}
|
|
150
625
|
|
|
626
|
+
Status WideColumnSerialization::ResolveEntityBlobColumns(
|
|
627
|
+
const Slice& entity_value, const Slice& user_key,
|
|
628
|
+
const BlobFetcher* blob_fetcher, PrefetchBufferCollection* prefetch_buffers,
|
|
629
|
+
std::string& resolved_entity, bool& resolved, uint64_t* total_bytes_read,
|
|
630
|
+
uint64_t* num_blobs_resolved) {
|
|
631
|
+
assert(blob_fetcher);
|
|
632
|
+
|
|
633
|
+
resolved = false;
|
|
634
|
+
|
|
635
|
+
std::vector<WideColumn> columns;
|
|
636
|
+
std::vector<std::pair<size_t, BlobIndex>> blob_columns;
|
|
637
|
+
|
|
638
|
+
Slice input_copy = entity_value;
|
|
639
|
+
if (Status s = DeserializeV2(input_copy, columns, blob_columns); !s.ok()) {
|
|
640
|
+
return s;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
if (blob_columns.empty()) {
|
|
644
|
+
return Status::OK();
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
resolved = true;
|
|
648
|
+
|
|
649
|
+
// Fetch each blob value
|
|
650
|
+
std::vector<std::string> resolved_blob_values;
|
|
651
|
+
resolved_blob_values.reserve(blob_columns.size());
|
|
652
|
+
|
|
653
|
+
for (const auto& blob_col : blob_columns) {
|
|
654
|
+
const BlobIndex& blob_idx = blob_col.second;
|
|
655
|
+
|
|
656
|
+
if (blob_idx.IsInlined()) {
|
|
657
|
+
resolved_blob_values.emplace_back(blob_idx.value().data(),
|
|
658
|
+
blob_idx.value().size());
|
|
659
|
+
continue;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
FilePrefetchBuffer* prefetch_buffer =
|
|
663
|
+
prefetch_buffers ? prefetch_buffers->GetOrCreatePrefetchBuffer(
|
|
664
|
+
blob_idx.file_number())
|
|
665
|
+
: nullptr;
|
|
666
|
+
|
|
667
|
+
uint64_t bytes_read = 0;
|
|
668
|
+
|
|
669
|
+
PinnableSlice blob_value;
|
|
670
|
+
const Status fetch_s = blob_fetcher->FetchBlob(
|
|
671
|
+
user_key, blob_idx, prefetch_buffer, &blob_value, &bytes_read);
|
|
672
|
+
if (!fetch_s.ok()) {
|
|
673
|
+
return fetch_s;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
resolved_blob_values.emplace_back(blob_value.data(), blob_value.size());
|
|
677
|
+
|
|
678
|
+
if (total_bytes_read) {
|
|
679
|
+
*total_bytes_read += bytes_read;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
if (num_blobs_resolved) {
|
|
684
|
+
*num_blobs_resolved += blob_columns.size();
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
return SerializeResolvedEntity(columns, blob_columns, resolved_blob_values,
|
|
688
|
+
resolved_entity);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
Status WideColumnSerialization::GetValueOfDefaultColumnResolvingBlobs(
|
|
692
|
+
const Slice& entity_value, const Slice& user_key,
|
|
693
|
+
const BlobFetcher* blob_fetcher, PinnableSlice& result, bool& resolved) {
|
|
694
|
+
assert(blob_fetcher);
|
|
695
|
+
|
|
696
|
+
resolved = false;
|
|
697
|
+
|
|
698
|
+
std::vector<WideColumn> columns;
|
|
699
|
+
std::vector<std::pair<size_t, BlobIndex>> blob_columns;
|
|
700
|
+
|
|
701
|
+
Slice input_copy = entity_value;
|
|
702
|
+
if (Status s = DeserializeV2(input_copy, columns, blob_columns); !s.ok()) {
|
|
703
|
+
return s;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// The default column (empty name) is always at index 0 when present
|
|
707
|
+
// (columns are sorted by name).
|
|
708
|
+
if (columns.empty() || columns[0].name() != kDefaultWideColumnName) {
|
|
709
|
+
result.PinSelf(Slice());
|
|
710
|
+
return Status::OK();
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
// Check if the default column (index 0) is a blob reference
|
|
714
|
+
for (const auto& blob_col : blob_columns) {
|
|
715
|
+
if (blob_col.first == 0) {
|
|
716
|
+
const BlobIndex& blob_idx = blob_col.second;
|
|
717
|
+
|
|
718
|
+
resolved = true;
|
|
719
|
+
|
|
720
|
+
if (blob_idx.IsInlined()) {
|
|
721
|
+
result.PinSelf(blob_idx.value());
|
|
722
|
+
return Status::OK();
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
return blob_fetcher->FetchBlob(user_key, blob_idx,
|
|
726
|
+
nullptr /* prefetch_buffer */, &result,
|
|
727
|
+
nullptr /* bytes_read */);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Default column is inline
|
|
732
|
+
result.PinSelf(columns[0].value());
|
|
733
|
+
return Status::OK();
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
Status WideColumnSerialization::SerializeResolvedEntity(
|
|
737
|
+
const std::vector<WideColumn>& columns,
|
|
738
|
+
const std::vector<std::pair<size_t, BlobIndex>>& blob_columns,
|
|
739
|
+
const std::vector<std::string>& resolved_blob_values, std::string& output) {
|
|
740
|
+
assert(blob_columns.size() == resolved_blob_values.size());
|
|
741
|
+
|
|
742
|
+
// blob_columns is sorted by column index and typically small, so use a
|
|
743
|
+
// linear scan with a cursor instead of an unordered_map.
|
|
744
|
+
size_t blob_cursor = 0;
|
|
745
|
+
|
|
746
|
+
// Build result columns with resolved blob values
|
|
747
|
+
WideColumns result_columns;
|
|
748
|
+
result_columns.reserve(columns.size());
|
|
749
|
+
|
|
750
|
+
for (size_t i = 0; i < columns.size(); ++i) {
|
|
751
|
+
if (blob_cursor < blob_columns.size() &&
|
|
752
|
+
blob_columns[blob_cursor].first == i) {
|
|
753
|
+
// This is a blob column - use the resolved value
|
|
754
|
+
result_columns.emplace_back(columns[i].name(),
|
|
755
|
+
Slice(resolved_blob_values[blob_cursor]));
|
|
756
|
+
++blob_cursor;
|
|
757
|
+
} else {
|
|
758
|
+
// This is an inline column - use the original value
|
|
759
|
+
result_columns.emplace_back(columns[i].name(), columns[i].value());
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// Serialize using V1 format (all values inline)
|
|
764
|
+
return Serialize(result_columns, output);
|
|
765
|
+
}
|
|
766
|
+
|
|
151
767
|
} // namespace ROCKSDB_NAMESPACE
|