@nxtedition/rocksdb 15.4.1 → 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 -15
- 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/iterator.js +2 -2
- 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,615 @@
|
|
|
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
|
+
// *****************************************************************
|
|
7
|
+
// EXPERIMENTAL - subject to change while under development
|
|
8
|
+
// *****************************************************************
|
|
9
|
+
|
|
10
|
+
#pragma once
|
|
11
|
+
|
|
12
|
+
#include <cassert>
|
|
13
|
+
#include <cstddef>
|
|
14
|
+
#include <cstdint>
|
|
15
|
+
#include <cstring>
|
|
16
|
+
#include <string>
|
|
17
|
+
#include <vector>
|
|
18
|
+
|
|
19
|
+
#include "rocksdb/slice.h"
|
|
20
|
+
#include "rocksdb/status.h"
|
|
21
|
+
#include "util/math.h"
|
|
22
|
+
|
|
23
|
+
namespace ROCKSDB_NAMESPACE {
|
|
24
|
+
namespace trie_index {
|
|
25
|
+
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Bit-vector with O(1) rank and select operations.
|
|
28
|
+
//
|
|
29
|
+
// This is the foundational data structure for the LOUDS-based succinct trie.
|
|
30
|
+
// It stores a sequence of bits and supports:
|
|
31
|
+
// - rank1(pos): Count of 1-bits in positions [0, pos)
|
|
32
|
+
// - select1(i): Position of the i-th 1-bit (0-indexed)
|
|
33
|
+
// - rank0(pos): Count of 0-bits in positions [0, pos)
|
|
34
|
+
// - select0(i): Position of the i-th 0-bit (0-indexed)
|
|
35
|
+
//
|
|
36
|
+
// Implementation uses a two-level lookup table for rank (sampling every
|
|
37
|
+
// kBitsPerRankSample bits) and select hints + linear scan for select. Both
|
|
38
|
+
// rank and select operations are O(1). Select uses precomputed hint arrays
|
|
39
|
+
// that narrow the search to O(1) rank samples, then a word-level popcount
|
|
40
|
+
// scan within that interval.
|
|
41
|
+
//
|
|
42
|
+
// Memory layout (serialized):
|
|
43
|
+
// [num_bits: uint64_t]
|
|
44
|
+
// [num_ones: uint64_t]
|
|
45
|
+
// [raw bits: ceil(num_bits/64) uint64_t words, 64-bit aligned]
|
|
46
|
+
// [rank LUT: (num_bits/kBitsPerRankSample + 1) uint32_t entries, padded to 8]
|
|
47
|
+
// [select1 hints: uint32_t entries, padded to 8]
|
|
48
|
+
// [select0 hints: uint32_t entries, padded to 8]
|
|
49
|
+
//
|
|
50
|
+
// The rank LUT uses uint32_t entries (not uint64_t), which halves the LUT
|
|
51
|
+
// memory overhead. This is safe because the maximum cumulative popcount
|
|
52
|
+
// equals num_bits, and uint32_t can hold values up to ~4 billion. This
|
|
53
|
+
// limits individual bitvectors to ~4 billion bits, which is far beyond
|
|
54
|
+
// any realistic trie index: the largest bitvector (d_labels_) uses 256
|
|
55
|
+
// bits per dense trie node, so the limit corresponds to ~16 million dense
|
|
56
|
+
// nodes. A typical SST file has 16K-64K data blocks, producing a trie
|
|
57
|
+
// with at most a few hundred thousand nodes. An assertion in BuildRankLUT
|
|
58
|
+
// guards against overflow.
|
|
59
|
+
//
|
|
60
|
+
// The rank LUT stores cumulative popcount at every kBitsPerRankSample-bit
|
|
61
|
+
// boundary. For positions between boundaries, we compute the remaining
|
|
62
|
+
// popcount using hardware popcount on the intermediate words.
|
|
63
|
+
// ============================================================================
|
|
64
|
+
|
|
65
|
+
// Number of bits per rank lookup table entry. Must be a power of 2 and a
|
|
66
|
+
// multiple of 64. 256 gives a good balance between LUT size overhead (~12.5%
|
|
67
|
+
// of bitvector size with uint32_t entries) and the number of popcounts needed
|
|
68
|
+
// per rank query (at most 4 words). Benchmarking showed 256 is ~20% faster
|
|
69
|
+
// than 512 for trie Seek due to fewer popcount iterations per Rank1 call.
|
|
70
|
+
inline constexpr uint64_t kBitsPerRankSample = 256;
|
|
71
|
+
inline constexpr uint64_t kWordsPerRankSample = kBitsPerRankSample / 64;
|
|
72
|
+
|
|
73
|
+
// Number of 1-bits (or 0-bits) between select hint entries. Each hint stores
|
|
74
|
+
// the rank LUT index where the k-th group of ones/zeros begins, narrowing the
|
|
75
|
+
// Select search to a linear scan of 1-2 rank samples, making it O(1).
|
|
76
|
+
// 256 matches kBitsPerRankSample so hints map directly to rank LUT entries.
|
|
77
|
+
inline constexpr uint64_t kOnesPerSelectHint = 256;
|
|
78
|
+
|
|
79
|
+
// Portable popcount using RocksDB's BitsSetToOne, which handles MSVC,
|
|
80
|
+
// GCC, and Clang with hardware POPCNT when available.
|
|
81
|
+
inline uint64_t Popcount(uint64_t x) {
|
|
82
|
+
return static_cast<uint64_t>(BitsSetToOne(x));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Count trailing zeros. Returns 64 if x == 0. Uses RocksDB's
|
|
86
|
+
// CountTrailingZeroBits for portability (MSVC + GCC/Clang).
|
|
87
|
+
inline uint64_t Ctz(uint64_t x) {
|
|
88
|
+
return x == 0 ? 64 : static_cast<uint64_t>(CountTrailingZeroBits(x));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Select the i-th set bit (0-indexed) within a 64-bit word.
|
|
92
|
+
// Precondition: i < Popcount(word).
|
|
93
|
+
#if defined(__BMI2__) && defined(__x86_64__)
|
|
94
|
+
// Hardware-accelerated using BMI2 PDEP: deposits bit i among set bits of word,
|
|
95
|
+
// then counts trailing zeros to find its position. Single PDEP + CTZ.
|
|
96
|
+
inline uint64_t FindNthSetBitInWord(uint64_t word, uint64_t i) {
|
|
97
|
+
return __builtin_ctzll(_pdep_u64(1ULL << i, word));
|
|
98
|
+
}
|
|
99
|
+
#else
|
|
100
|
+
// Popcount-based binary search: O(log 64) = 6 steps (5 popcounts + 1 bit test).
|
|
101
|
+
// Matches the SuRF reference implementation's select64_popcount_search().
|
|
102
|
+
inline uint64_t FindNthSetBitInWord(uint64_t word, uint64_t i) {
|
|
103
|
+
// Binary search: narrow down which 32-bit half, then 16, 8, 4, 2, 1.
|
|
104
|
+
uint64_t pos = 0;
|
|
105
|
+
uint64_t pc;
|
|
106
|
+
|
|
107
|
+
pc = Popcount(word & 0xFFFFFFFFULL);
|
|
108
|
+
if (i >= pc) {
|
|
109
|
+
word >>= 32;
|
|
110
|
+
pos += 32;
|
|
111
|
+
i -= pc;
|
|
112
|
+
}
|
|
113
|
+
pc = Popcount(word & 0xFFFFULL);
|
|
114
|
+
if (i >= pc) {
|
|
115
|
+
word >>= 16;
|
|
116
|
+
pos += 16;
|
|
117
|
+
i -= pc;
|
|
118
|
+
}
|
|
119
|
+
pc = Popcount(word & 0xFFULL);
|
|
120
|
+
if (i >= pc) {
|
|
121
|
+
word >>= 8;
|
|
122
|
+
pos += 8;
|
|
123
|
+
i -= pc;
|
|
124
|
+
}
|
|
125
|
+
pc = Popcount(word & 0xFULL);
|
|
126
|
+
if (i >= pc) {
|
|
127
|
+
word >>= 4;
|
|
128
|
+
pos += 4;
|
|
129
|
+
i -= pc;
|
|
130
|
+
}
|
|
131
|
+
pc = Popcount(word & 0x3ULL);
|
|
132
|
+
if (i >= pc) {
|
|
133
|
+
word >>= 2;
|
|
134
|
+
pos += 2;
|
|
135
|
+
i -= pc;
|
|
136
|
+
}
|
|
137
|
+
pc = word & 1;
|
|
138
|
+
if (i >= pc) {
|
|
139
|
+
pos += 1;
|
|
140
|
+
}
|
|
141
|
+
return pos;
|
|
142
|
+
}
|
|
143
|
+
#endif
|
|
144
|
+
|
|
145
|
+
// ============================================================================
|
|
146
|
+
// BitvectorBuilder: Builds a bitvector incrementally, bit by bit.
|
|
147
|
+
// ============================================================================
|
|
148
|
+
class BitvectorBuilder {
|
|
149
|
+
public:
|
|
150
|
+
BitvectorBuilder() : num_bits_(0) {}
|
|
151
|
+
|
|
152
|
+
// Append a single bit (0 or 1).
|
|
153
|
+
void Append(bool bit) {
|
|
154
|
+
if (num_bits_ % 64 == 0) {
|
|
155
|
+
words_.push_back(0);
|
|
156
|
+
}
|
|
157
|
+
if (bit) {
|
|
158
|
+
words_.back() |= (uint64_t(1) << (num_bits_ % 64));
|
|
159
|
+
}
|
|
160
|
+
num_bits_++;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Append a full 64-bit word of `nbits` bits (1..64). The bits are taken
|
|
164
|
+
// from the low `nbits` positions of `word` in LSB-first order. This is
|
|
165
|
+
// used by the LOUDS-Dense builder to emit 256-bit label bitmaps as 4
|
|
166
|
+
// word-level operations instead of 256 individual Append() calls.
|
|
167
|
+
// Precondition: num_bits_ must be 64-bit aligned (i.e., num_bits_ % 64 == 0).
|
|
168
|
+
void AppendWord(uint64_t word, uint64_t nbits) {
|
|
169
|
+
assert(nbits > 0 && nbits <= 64);
|
|
170
|
+
assert(num_bits_ % 64 == 0); // Must be word-aligned.
|
|
171
|
+
words_.push_back(word);
|
|
172
|
+
num_bits_ += nbits;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Append `count` copies of `bit`. Optimized to operate at word granularity
|
|
176
|
+
// when possible, which is significantly faster than the bit-by-bit loop for
|
|
177
|
+
// large counts (e.g., appending 256 zeros for an empty dense node).
|
|
178
|
+
void AppendMultiple(bool bit, uint64_t count) {
|
|
179
|
+
if (count == 0) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Fill partial word at the end of the current buffer.
|
|
184
|
+
uint64_t partial = num_bits_ % 64;
|
|
185
|
+
if (partial > 0) {
|
|
186
|
+
uint64_t fill = std::min(count, 64 - partial);
|
|
187
|
+
if (bit) {
|
|
188
|
+
// Set bits [partial, partial + fill) in the last word.
|
|
189
|
+
uint64_t mask =
|
|
190
|
+
((fill == 64) ? ~uint64_t(0) : ((uint64_t(1) << fill) - 1))
|
|
191
|
+
<< partial;
|
|
192
|
+
words_.back() |= mask;
|
|
193
|
+
}
|
|
194
|
+
// For bit==0, no action needed (words are zero-initialized).
|
|
195
|
+
num_bits_ += fill;
|
|
196
|
+
count -= fill;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Append full 64-bit words.
|
|
200
|
+
uint64_t full_word = bit ? ~uint64_t(0) : uint64_t(0);
|
|
201
|
+
while (count >= 64) {
|
|
202
|
+
words_.push_back(full_word);
|
|
203
|
+
num_bits_ += 64;
|
|
204
|
+
count -= 64;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Append remaining bits (< 64).
|
|
208
|
+
if (count > 0) {
|
|
209
|
+
if (bit) {
|
|
210
|
+
words_.push_back((uint64_t(1) << count) - 1);
|
|
211
|
+
} else {
|
|
212
|
+
words_.push_back(0);
|
|
213
|
+
}
|
|
214
|
+
num_bits_ += count;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
uint64_t NumBits() const { return num_bits_; }
|
|
219
|
+
|
|
220
|
+
// Pre-allocate capacity for at least `num_bits` bits. Avoids repeated
|
|
221
|
+
// reallocations when the final size is known or can be estimated.
|
|
222
|
+
void Reserve(uint64_t num_bits) { words_.reserve((num_bits + 63) / 64); }
|
|
223
|
+
|
|
224
|
+
// Access a specific bit. For testing/debugging only.
|
|
225
|
+
bool GetBit(uint64_t pos) const {
|
|
226
|
+
assert(pos < num_bits_);
|
|
227
|
+
return (words_[pos / 64] >> (pos % 64)) & 1;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Return the underlying word array.
|
|
231
|
+
const std::vector<uint64_t>& Words() const { return words_; }
|
|
232
|
+
|
|
233
|
+
private:
|
|
234
|
+
std::vector<uint64_t> words_;
|
|
235
|
+
uint64_t num_bits_;
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// ============================================================================
|
|
239
|
+
// Bitvector: Immutable bitvector with O(1) rank and O(1) select.
|
|
240
|
+
//
|
|
241
|
+
// Created from serialized data (e.g., read from an SST file meta-block) or
|
|
242
|
+
// from a BitvectorBuilder. The bitvector does NOT own the underlying memory
|
|
243
|
+
// when created from a Slice — the caller must ensure the data outlives this
|
|
244
|
+
// object.
|
|
245
|
+
//
|
|
246
|
+
// Select acceleration: select hints store the rank LUT index where every
|
|
247
|
+
// kOnesPerSelectHint-th 1-bit (or 0-bit) lives. This narrows the search
|
|
248
|
+
// in FindNthOneBit/FindNthZeroBit to a linear scan of O(1) rank samples,
|
|
249
|
+
// making Select O(1). The hint arrays add ~12.5% space overhead per bitvector.
|
|
250
|
+
// ============================================================================
|
|
251
|
+
class Bitvector {
|
|
252
|
+
public:
|
|
253
|
+
Bitvector()
|
|
254
|
+
: words_(nullptr),
|
|
255
|
+
rank_lut_(nullptr),
|
|
256
|
+
select1_hints_(nullptr),
|
|
257
|
+
select0_hints_(nullptr),
|
|
258
|
+
num_bits_(0),
|
|
259
|
+
num_ones_(0),
|
|
260
|
+
num_words_(0),
|
|
261
|
+
num_rank_samples_(0),
|
|
262
|
+
num_select1_hints_(0),
|
|
263
|
+
num_select0_hints_(0) {}
|
|
264
|
+
|
|
265
|
+
// Bitvector contains raw pointers (words_, rank_lut_, select hints) that
|
|
266
|
+
// may point into owned_data_ or into external memory (InitFromData).
|
|
267
|
+
// Copying would create dangling pointers, so copy is deleted. Move is safe
|
|
268
|
+
// only when the pointers point into owned_data_ (BuildFrom case) because
|
|
269
|
+
// std::string's move constructor preserves the buffer address for
|
|
270
|
+
// SSO-exceeding strings. For the InitFromData case, the pointers reference
|
|
271
|
+
// external memory and are unaffected by moving owned_data_ (which is empty).
|
|
272
|
+
~Bitvector() = default;
|
|
273
|
+
|
|
274
|
+
Bitvector(const Bitvector&) = delete;
|
|
275
|
+
Bitvector& operator=(const Bitvector&) = delete;
|
|
276
|
+
// Move constructor delegates to default ctor + move assignment to avoid
|
|
277
|
+
// duplicating the field-copy + recompute + zero-other logic.
|
|
278
|
+
Bitvector(Bitvector&& other) noexcept : Bitvector() {
|
|
279
|
+
*this = std::move(other);
|
|
280
|
+
}
|
|
281
|
+
Bitvector& operator=(Bitvector&& other) noexcept {
|
|
282
|
+
if (this != &other) {
|
|
283
|
+
words_ = other.words_;
|
|
284
|
+
rank_lut_ = other.rank_lut_;
|
|
285
|
+
select1_hints_ = other.select1_hints_;
|
|
286
|
+
select0_hints_ = other.select0_hints_;
|
|
287
|
+
num_bits_ = other.num_bits_;
|
|
288
|
+
num_ones_ = other.num_ones_;
|
|
289
|
+
num_words_ = other.num_words_;
|
|
290
|
+
num_rank_samples_ = other.num_rank_samples_;
|
|
291
|
+
num_select1_hints_ = other.num_select1_hints_;
|
|
292
|
+
num_select0_hints_ = other.num_select0_hints_;
|
|
293
|
+
owned_data_ = std::move(other.owned_data_);
|
|
294
|
+
// If this bitvector owns its data, the pointers must be re-seated into
|
|
295
|
+
// our owned_data_ buffer. std::string move may or may not preserve the
|
|
296
|
+
// buffer address (SSO optimization), so always re-seat.
|
|
297
|
+
if (!owned_data_.empty()) {
|
|
298
|
+
RecomputePointers();
|
|
299
|
+
}
|
|
300
|
+
other.words_ = nullptr;
|
|
301
|
+
other.rank_lut_ = nullptr;
|
|
302
|
+
other.select1_hints_ = nullptr;
|
|
303
|
+
other.select0_hints_ = nullptr;
|
|
304
|
+
other.num_bits_ = 0;
|
|
305
|
+
other.num_ones_ = 0;
|
|
306
|
+
other.num_words_ = 0;
|
|
307
|
+
other.num_rank_samples_ = 0;
|
|
308
|
+
other.num_select1_hints_ = 0;
|
|
309
|
+
other.num_select0_hints_ = 0;
|
|
310
|
+
}
|
|
311
|
+
return *this;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Initialize from serialized data. The data pointer must remain valid for
|
|
315
|
+
// the lifetime of this object. On success, sets `*bytes_consumed` to the
|
|
316
|
+
// number of bytes read from the input. Returns Status::OK() on success,
|
|
317
|
+
// or Status::Corruption() if the data is malformed.
|
|
318
|
+
Status InitFromData(const char* data, size_t data_size,
|
|
319
|
+
size_t* bytes_consumed);
|
|
320
|
+
|
|
321
|
+
// Append serialized representation to `output`.
|
|
322
|
+
void EncodeTo(std::string* output) const;
|
|
323
|
+
|
|
324
|
+
// Build from a BitvectorBuilder. This allocates owned memory.
|
|
325
|
+
void BuildFrom(const BitvectorBuilder& builder);
|
|
326
|
+
|
|
327
|
+
// ---- Core Operations ----
|
|
328
|
+
|
|
329
|
+
// Get the bit at position `pos`.
|
|
330
|
+
inline bool GetBit(uint64_t pos) const {
|
|
331
|
+
assert(pos < num_bits_);
|
|
332
|
+
return (words_[pos / 64] >> (pos % 64)) & 1;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// rank1(pos): Count of 1-bits in positions [0, pos).
|
|
336
|
+
// pos can be in [0, num_bits_].
|
|
337
|
+
inline uint64_t Rank1(uint64_t pos) const {
|
|
338
|
+
assert(pos <= num_bits_);
|
|
339
|
+
// Which rank sample does `pos` fall into?
|
|
340
|
+
uint64_t sample_idx = pos / kBitsPerRankSample;
|
|
341
|
+
uint64_t sample_rank = rank_lut_[sample_idx];
|
|
342
|
+
// Count remaining 1-bits in words between the sample boundary and `pos`.
|
|
343
|
+
uint64_t word_start = sample_idx * kWordsPerRankSample;
|
|
344
|
+
uint64_t word_end = pos / 64;
|
|
345
|
+
for (uint64_t w = word_start; w < word_end; w++) {
|
|
346
|
+
sample_rank += Popcount(words_[w]);
|
|
347
|
+
}
|
|
348
|
+
// Count bits within the final partial word [0, pos % 64).
|
|
349
|
+
uint64_t remaining = pos % 64;
|
|
350
|
+
if (remaining > 0) {
|
|
351
|
+
// Mask off the bits at and above position `remaining`.
|
|
352
|
+
uint64_t mask = (uint64_t(1) << remaining) - 1;
|
|
353
|
+
sample_rank += Popcount(words_[word_end] & mask);
|
|
354
|
+
}
|
|
355
|
+
return sample_rank;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// rank0(pos): Count of 0-bits in positions [0, pos).
|
|
359
|
+
inline uint64_t Rank0(uint64_t pos) const { return pos - Rank1(pos); }
|
|
360
|
+
|
|
361
|
+
// select1(i): Position of the i-th 1-bit (0-indexed).
|
|
362
|
+
// Returns num_bits_ if there are fewer than (i+1) 1-bits.
|
|
363
|
+
// Inlined for hot-path performance — the hint lookup + linear scan is
|
|
364
|
+
// branch-predictor friendly and avoids function call overhead.
|
|
365
|
+
inline uint64_t FindNthOneBit(uint64_t i) const {
|
|
366
|
+
if (i >= num_ones_) {
|
|
367
|
+
return num_bits_;
|
|
368
|
+
}
|
|
369
|
+
// Use select hints to narrow the search range.
|
|
370
|
+
uint64_t lo;
|
|
371
|
+
uint64_t hi;
|
|
372
|
+
if (num_select1_hints_ > 0) {
|
|
373
|
+
uint64_t hint_idx = i / kOnesPerSelectHint;
|
|
374
|
+
lo = select1_hints_[hint_idx];
|
|
375
|
+
hi = (hint_idx + 1 < num_select1_hints_) ? select1_hints_[hint_idx + 1]
|
|
376
|
+
: num_rank_samples_ - 1;
|
|
377
|
+
} else {
|
|
378
|
+
lo = 0;
|
|
379
|
+
hi = num_rank_samples_ - 1;
|
|
380
|
+
}
|
|
381
|
+
// Linear scan within the narrowed range.
|
|
382
|
+
while (lo < hi && rank_lut_[lo + 1] <= i) {
|
|
383
|
+
lo++;
|
|
384
|
+
}
|
|
385
|
+
// Scan words in the sample interval.
|
|
386
|
+
uint64_t remaining = i - rank_lut_[lo];
|
|
387
|
+
uint64_t word_start = lo * kWordsPerRankSample;
|
|
388
|
+
uint64_t word_end = std::min(word_start + kWordsPerRankSample, num_words_);
|
|
389
|
+
for (uint64_t w = word_start; w < word_end; w++) {
|
|
390
|
+
uint64_t pc = Popcount(words_[w]);
|
|
391
|
+
if (remaining < pc) {
|
|
392
|
+
return w * 64 + FindNthSetBitInWord(words_[w], remaining);
|
|
393
|
+
}
|
|
394
|
+
remaining -= pc;
|
|
395
|
+
}
|
|
396
|
+
assert(false);
|
|
397
|
+
return num_bits_;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// select0(i): Position of the i-th 0-bit (0-indexed).
|
|
401
|
+
// Returns num_bits_ if there are fewer than (i+1) 0-bits.
|
|
402
|
+
uint64_t FindNthZeroBit(uint64_t i) const;
|
|
403
|
+
|
|
404
|
+
// Find the next set bit at or after position `pos`.
|
|
405
|
+
// Returns num_bits_ if no set bit is found.
|
|
406
|
+
// Used by the trie for finding the next sibling label in dense nodes.
|
|
407
|
+
uint64_t NextSetBit(uint64_t pos) const;
|
|
408
|
+
|
|
409
|
+
// Find the distance from `pos` to the next set bit (exclusive).
|
|
410
|
+
// Returns the distance in bits. Used by sparse level to compute node size.
|
|
411
|
+
// pos must point to a set bit.
|
|
412
|
+
uint64_t DistanceToNextSetBit(uint64_t pos) const;
|
|
413
|
+
|
|
414
|
+
// ---- Accessors ----
|
|
415
|
+
uint64_t NumBits() const { return num_bits_; }
|
|
416
|
+
uint64_t NumOnes() const { return num_ones_; }
|
|
417
|
+
uint64_t NumZeros() const { return num_bits_ - num_ones_; }
|
|
418
|
+
|
|
419
|
+
// Size in bytes of the serialized representation.
|
|
420
|
+
size_t SerializedSize() const;
|
|
421
|
+
|
|
422
|
+
private:
|
|
423
|
+
// Build the rank LUT and select hints from current words.
|
|
424
|
+
// Used by BuildFrom().
|
|
425
|
+
void BuildRankLUT();
|
|
426
|
+
|
|
427
|
+
// Build select hint arrays from the rank LUT. Called after BuildRankLUT().
|
|
428
|
+
void BuildSelectHints();
|
|
429
|
+
|
|
430
|
+
// Re-compute pointers into owned_data_ after a move operation.
|
|
431
|
+
// Re-seats pointers into owned_data_ buffer.
|
|
432
|
+
// Layout: [words][rank_lut][select1_hints][select0_hints]
|
|
433
|
+
void RecomputePointers() {
|
|
434
|
+
const char* base = owned_data_.data();
|
|
435
|
+
size_t words_bytes = num_words_ * sizeof(uint64_t);
|
|
436
|
+
size_t rank_bytes = num_rank_samples_ * sizeof(uint32_t);
|
|
437
|
+
size_t select1_bytes = num_select1_hints_ * sizeof(uint32_t);
|
|
438
|
+
|
|
439
|
+
words_ = reinterpret_cast<const uint64_t*>(base);
|
|
440
|
+
rank_lut_ = reinterpret_cast<const uint32_t*>(base + words_bytes);
|
|
441
|
+
select1_hints_ =
|
|
442
|
+
reinterpret_cast<const uint32_t*>(base + words_bytes + rank_bytes);
|
|
443
|
+
select0_hints_ = reinterpret_cast<const uint32_t*>(
|
|
444
|
+
base + words_bytes + rank_bytes + select1_bytes);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Pointer to the raw bit words. May point into external data (InitFromData)
|
|
448
|
+
// or into owned_data_ (BuildFrom).
|
|
449
|
+
const uint64_t* words_;
|
|
450
|
+
|
|
451
|
+
// Pointer to the rank lookup table (uint32_t entries to halve LUT size).
|
|
452
|
+
// Same ownership semantics as words_.
|
|
453
|
+
const uint32_t* rank_lut_;
|
|
454
|
+
|
|
455
|
+
// Select hint arrays: select1_hints_[k] is the rank LUT index where the
|
|
456
|
+
// (k * kOnesPerSelectHint)-th 1-bit lives. select0_hints_ is analogous
|
|
457
|
+
// for 0-bits. These narrow Select to a linear scan of 1-2 rank samples.
|
|
458
|
+
const uint32_t* select1_hints_;
|
|
459
|
+
const uint32_t* select0_hints_;
|
|
460
|
+
|
|
461
|
+
uint64_t num_bits_;
|
|
462
|
+
uint64_t num_ones_;
|
|
463
|
+
uint64_t num_words_;
|
|
464
|
+
uint64_t num_rank_samples_;
|
|
465
|
+
uint64_t num_select1_hints_;
|
|
466
|
+
uint64_t num_select0_hints_;
|
|
467
|
+
|
|
468
|
+
// Owned storage when built from BitvectorBuilder (not from serialized data).
|
|
469
|
+
std::string owned_data_;
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
// ============================================================================
|
|
473
|
+
// EliasFano: Compressed representation of a monotonically non-decreasing
|
|
474
|
+
// sequence of uint64_t values. Uses the Elias-Fano encoding which achieves
|
|
475
|
+
// near-optimal space (within 2 bits per element of the information-theoretic
|
|
476
|
+
// minimum) while supporting O(1) random access.
|
|
477
|
+
//
|
|
478
|
+
// Encoding:
|
|
479
|
+
// Given n values in [0, U], each value v is split into:
|
|
480
|
+
// - high part: v >> low_bits (unary-coded in a bitvector)
|
|
481
|
+
// - low part: v & ((1 << low_bits) - 1) (packed in a bit array)
|
|
482
|
+
// where low_bits = floor(log2(U / n)) when n > 0 and U > n, or 0 when
|
|
483
|
+
// n == 0 or U <= n.
|
|
484
|
+
//
|
|
485
|
+
// The high-bits bitvector has ones at position high[i] + i for each
|
|
486
|
+
// element i. The i-th value is recovered as:
|
|
487
|
+
// value = (FindNthOneBit(high_bv, i) - i) << low_bits | packed_low[i]
|
|
488
|
+
//
|
|
489
|
+
// Memory layout (serialized):
|
|
490
|
+
// [count : uint64_t] Number of elements
|
|
491
|
+
// [universe : uint64_t] Maximum value + 1
|
|
492
|
+
// [low_bits : uint64_t] Number of low bits per element
|
|
493
|
+
// [high_bv : Bitvector] Unary-coded high parts (with rank/select)
|
|
494
|
+
// [low_words : ceil(count * low_bits / 64) * 8 bytes] Packed low parts
|
|
495
|
+
//
|
|
496
|
+
// Space for 32K offsets with U = 4GB: low_bits = 17, total ~76 KB vs
|
|
497
|
+
// 256 KB for raw uint64_t array (3.4x compression).
|
|
498
|
+
// ============================================================================
|
|
499
|
+
class EliasFano {
|
|
500
|
+
public:
|
|
501
|
+
EliasFano()
|
|
502
|
+
: count_(0),
|
|
503
|
+
universe_(0),
|
|
504
|
+
low_bits_(0),
|
|
505
|
+
low_mask_(0),
|
|
506
|
+
low_words_(nullptr),
|
|
507
|
+
num_low_words_(0) {}
|
|
508
|
+
|
|
509
|
+
~EliasFano() = default;
|
|
510
|
+
|
|
511
|
+
EliasFano(const EliasFano&) = delete;
|
|
512
|
+
EliasFano& operator=(const EliasFano&) = delete;
|
|
513
|
+
|
|
514
|
+
// Custom move operations to re-seat low_words_ after moving owned_low_data_.
|
|
515
|
+
// The default move would leave low_words_ pointing into the moved-from
|
|
516
|
+
// object's owned_low_data_ buffer. For SSO-sized strings (owned_low_data_
|
|
517
|
+
// with <= ~22 bytes, e.g. count_=1 low_bits_=8 → 8 bytes), std::string
|
|
518
|
+
// move copies the SSO buffer to a new address rather than transferring a
|
|
519
|
+
// heap pointer, leaving low_words_ dangling. For heap-allocated strings
|
|
520
|
+
// move transfers the pointer (address preserved), but we re-seat
|
|
521
|
+
// unconditionally for correctness since SSO thresholds are implementation-
|
|
522
|
+
// defined. This mirrors Bitvector's move pattern (RecomputePointers).
|
|
523
|
+
EliasFano(EliasFano&& other) noexcept : EliasFano() {
|
|
524
|
+
*this = std::move(other);
|
|
525
|
+
}
|
|
526
|
+
EliasFano& operator=(EliasFano&& other) noexcept {
|
|
527
|
+
if (this != &other) {
|
|
528
|
+
count_ = other.count_;
|
|
529
|
+
universe_ = other.universe_;
|
|
530
|
+
low_bits_ = other.low_bits_;
|
|
531
|
+
low_mask_ = other.low_mask_;
|
|
532
|
+
num_low_words_ = other.num_low_words_;
|
|
533
|
+
high_bv_ = std::move(other.high_bv_);
|
|
534
|
+
owned_low_data_ = std::move(other.owned_low_data_);
|
|
535
|
+
// Re-seat low_words_ into our owned buffer. When owned_low_data_ is
|
|
536
|
+
// non-empty, low_words_ must point into it (BuildFrom path). When
|
|
537
|
+
// empty, low_words_ points to external memory (InitFromData path)
|
|
538
|
+
// or is nullptr (empty sequence).
|
|
539
|
+
if (!owned_low_data_.empty()) {
|
|
540
|
+
low_words_ = reinterpret_cast<const uint64_t*>(owned_low_data_.data());
|
|
541
|
+
} else {
|
|
542
|
+
low_words_ = other.low_words_;
|
|
543
|
+
}
|
|
544
|
+
other.count_ = 0;
|
|
545
|
+
other.universe_ = 0;
|
|
546
|
+
other.low_bits_ = 0;
|
|
547
|
+
other.low_mask_ = 0;
|
|
548
|
+
other.low_words_ = nullptr;
|
|
549
|
+
other.num_low_words_ = 0;
|
|
550
|
+
}
|
|
551
|
+
return *this;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// Build from a sorted sequence of uint64_t values.
|
|
555
|
+
// Values must be monotonically non-decreasing.
|
|
556
|
+
void BuildFrom(const uint64_t* values, uint64_t count, uint64_t universe);
|
|
557
|
+
|
|
558
|
+
// Initialize from serialized data. Returns Status::OK() on success.
|
|
559
|
+
Status InitFromData(const char* data, size_t data_size,
|
|
560
|
+
size_t* bytes_consumed);
|
|
561
|
+
|
|
562
|
+
// Append serialized representation to `output`.
|
|
563
|
+
void EncodeTo(std::string* output) const;
|
|
564
|
+
|
|
565
|
+
// Access the i-th value (0-indexed). i must be < count_.
|
|
566
|
+
inline uint64_t Access(uint64_t i) const {
|
|
567
|
+
assert(i < count_);
|
|
568
|
+
uint64_t high = high_bv_.FindNthOneBit(i) - i;
|
|
569
|
+
uint64_t low = 0;
|
|
570
|
+
if (low_bits_ > 0) {
|
|
571
|
+
// Extract low_bits_ bits starting at bit position i * low_bits_.
|
|
572
|
+
uint64_t bit_pos = i * low_bits_;
|
|
573
|
+
uint64_t word_idx = bit_pos / 64;
|
|
574
|
+
uint64_t bit_idx = bit_pos % 64;
|
|
575
|
+
low = (low_words_[word_idx] >> bit_idx) & low_mask_;
|
|
576
|
+
// Handle the case where the low bits span two words.
|
|
577
|
+
// Guard bit_idx > 0 to prevent UB: when bit_idx == 0 the shift
|
|
578
|
+
// (64 - bit_idx) would be 64 which overflows uint64_t. This is
|
|
579
|
+
// unreachable in practice (low_bits_ <= 63), but the guard makes
|
|
580
|
+
// it explicit for static analyzers.
|
|
581
|
+
if (bit_idx > 0 && bit_idx + low_bits_ > 64) {
|
|
582
|
+
uint64_t remaining = bit_idx + low_bits_ - 64;
|
|
583
|
+
low |= (low_words_[word_idx + 1] & ((uint64_t(1) << remaining) - 1))
|
|
584
|
+
<< (64 - bit_idx);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
return (high << low_bits_) | low;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
uint64_t Count() const { return count_; }
|
|
591
|
+
uint64_t Universe() const { return universe_; }
|
|
592
|
+
|
|
593
|
+
// Size in bytes of the serialized representation.
|
|
594
|
+
size_t SerializedSize() const;
|
|
595
|
+
|
|
596
|
+
private:
|
|
597
|
+
uint64_t count_; // Number of elements.
|
|
598
|
+
uint64_t universe_; // Upper bound (max value + 1).
|
|
599
|
+
uint64_t low_bits_; // Number of low bits per element.
|
|
600
|
+
uint64_t low_mask_; // (1 << low_bits) - 1, precomputed for Access.
|
|
601
|
+
|
|
602
|
+
// High bits: unary-coded bitvector with rank/select support.
|
|
603
|
+
Bitvector high_bv_;
|
|
604
|
+
|
|
605
|
+
// Low bits: packed array of low_bits_-bit values.
|
|
606
|
+
// Points into external data (InitFromData) or into owned_low_data_.
|
|
607
|
+
const uint64_t* low_words_;
|
|
608
|
+
uint64_t num_low_words_;
|
|
609
|
+
|
|
610
|
+
// Owned storage for low bits (when built from BuildFrom).
|
|
611
|
+
std::string owned_low_data_;
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
} // namespace trie_index
|
|
615
|
+
} // namespace ROCKSDB_NAMESPACE
|