@nxtedition/rocksdb 13.5.7 → 13.5.9
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 +248 -70
- package/binding.gyp +2 -2
- package/deps/rocksdb/rocksdb/BUCK +12 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
- package/deps/rocksdb/rocksdb/Makefile +28 -23
- package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
- package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
- package/deps/rocksdb/rocksdb/db/builder.h +5 -4
- package/deps/rocksdb/rocksdb/db/c.cc +556 -15
- package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
- package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
- package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
- package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
- package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
- package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
- package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
- package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
- package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
- package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
- package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
- package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
- package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
- package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
- package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
- package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
- package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
- package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
- package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
- package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
- package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
- package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
- package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
- package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
- package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
- package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
- package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
- package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
- package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
- package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
- package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
- package/deps/rocksdb/rocksdb/env/env.cc +32 -2
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
- package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
- package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
- package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
- package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
- package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
- package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
- package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
- package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
- package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
- package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
- package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
- package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
- package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
- package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
- package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
- package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
- package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
- package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
- package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
- package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
- package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
- package/deps/rocksdb/rocksdb/options/options.cc +296 -305
- package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
- package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
- package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
- package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
- package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
- package/deps/rocksdb/rocksdb/port/lang.h +2 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
- package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
- package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
- package/deps/rocksdb/rocksdb/src.mk +17 -11
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
- package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
- package/deps/rocksdb/rocksdb/table/format.cc +62 -44
- package/deps/rocksdb/rocksdb/table/format.h +35 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
- package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
- package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
- package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
- package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
- package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
- package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
- package/deps/rocksdb/rocksdb/util/compression.h +348 -232
- package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
- package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
- package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
- package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
- package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
- package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
- package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
- package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
- package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
- package/deps/rocksdb/rocksdb.gyp +9 -4
- package/index.js +50 -9
- package/package.json +8 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
#pragma once
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
#include <functional>
|
|
13
12
|
#include <limits>
|
|
14
13
|
#include <list>
|
|
@@ -281,4 +280,3 @@ class PersistentCacheDBTest : public DBTestBase {
|
|
|
281
280
|
};
|
|
282
281
|
|
|
283
282
|
} // namespace ROCKSDB_NAMESPACE
|
|
284
|
-
|
|
@@ -3,15 +3,43 @@
|
|
|
3
3
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
4
|
// (found in the LICENSE.Apache file in the root directory).
|
|
5
5
|
|
|
6
|
-
#include "utilities/secondary_index/faiss_ivf_index.h"
|
|
7
|
-
|
|
8
6
|
#include <cassert>
|
|
7
|
+
#include <optional>
|
|
8
|
+
#include <stdexcept>
|
|
9
|
+
#include <utility>
|
|
9
10
|
|
|
11
|
+
#include "faiss/IndexIVF.h"
|
|
10
12
|
#include "faiss/invlists/InvertedLists.h"
|
|
13
|
+
#include "rocksdb/utilities/secondary_index_faiss.h"
|
|
14
|
+
#include "util/autovector.h"
|
|
11
15
|
#include "util/coding.h"
|
|
12
16
|
|
|
13
17
|
namespace ROCKSDB_NAMESPACE {
|
|
14
18
|
|
|
19
|
+
namespace {
|
|
20
|
+
|
|
21
|
+
std::string SerializeLabel(faiss::idx_t label) {
|
|
22
|
+
std::string label_str;
|
|
23
|
+
PutVarsignedint64(&label_str, label);
|
|
24
|
+
|
|
25
|
+
return label_str;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
faiss::idx_t DeserializeLabel(Slice label_slice) {
|
|
29
|
+
faiss::idx_t label = -1;
|
|
30
|
+
[[maybe_unused]] const bool ok = GetVarsignedint64(&label_slice, &label);
|
|
31
|
+
assert(ok);
|
|
32
|
+
|
|
33
|
+
return label;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
} // namespace
|
|
37
|
+
|
|
38
|
+
struct FaissIVFIndex::KNNContext {
|
|
39
|
+
SecondaryIndexIterator* it;
|
|
40
|
+
autovector<std::string> keys;
|
|
41
|
+
};
|
|
42
|
+
|
|
15
43
|
class FaissIVFIndex::Adapter : public faiss::InvertedLists {
|
|
16
44
|
public:
|
|
17
45
|
Adapter(size_t num_lists, size_t code_size)
|
|
@@ -36,14 +64,14 @@ class FaissIVFIndex::Adapter : public faiss::InvertedLists {
|
|
|
36
64
|
return nullptr;
|
|
37
65
|
}
|
|
38
66
|
|
|
39
|
-
// Iterator-based read interface
|
|
67
|
+
// Iterator-based read interface
|
|
40
68
|
faiss::InvertedListsIterator* get_iterator(
|
|
41
|
-
size_t
|
|
42
|
-
|
|
43
|
-
|
|
69
|
+
size_t list_no, void* inverted_list_context = nullptr) const override {
|
|
70
|
+
KNNContext* const knn_context =
|
|
71
|
+
static_cast<KNNContext*>(inverted_list_context);
|
|
72
|
+
assert(knn_context);
|
|
44
73
|
|
|
45
|
-
|
|
46
|
-
return nullptr;
|
|
74
|
+
return new IteratorAdapter(knn_context, list_no, code_size);
|
|
47
75
|
}
|
|
48
76
|
|
|
49
77
|
// Write interface; only add_entry is implemented/required for now
|
|
@@ -80,22 +108,72 @@ class FaissIVFIndex::Adapter : public faiss::InvertedLists {
|
|
|
80
108
|
void resize(size_t /* list_no */, size_t /* new_size */) override {
|
|
81
109
|
assert(false);
|
|
82
110
|
}
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
std::string FaissIVFIndex::SerializeLabel(faiss::idx_t label) {
|
|
86
|
-
std::string label_str;
|
|
87
|
-
PutVarsignedint64(&label_str, label);
|
|
88
|
-
|
|
89
|
-
return label_str;
|
|
90
|
-
}
|
|
91
111
|
|
|
92
|
-
|
|
93
|
-
faiss::
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
112
|
+
private:
|
|
113
|
+
class IteratorAdapter : public faiss::InvertedListsIterator {
|
|
114
|
+
public:
|
|
115
|
+
IteratorAdapter(KNNContext* knn_context, size_t list_no, size_t code_size)
|
|
116
|
+
: knn_context_(knn_context),
|
|
117
|
+
it_(knn_context_->it),
|
|
118
|
+
code_size_(code_size) {
|
|
119
|
+
assert(knn_context_);
|
|
120
|
+
assert(it_);
|
|
121
|
+
|
|
122
|
+
const std::string label = SerializeLabel(list_no);
|
|
123
|
+
it_->Seek(label);
|
|
124
|
+
Update();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
bool is_available() const override { return id_and_codes_.has_value(); }
|
|
128
|
+
|
|
129
|
+
void next() override {
|
|
130
|
+
it_->Next();
|
|
131
|
+
Update();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
std::pair<faiss::idx_t, const uint8_t*> get_id_and_codes() override {
|
|
135
|
+
assert(is_available());
|
|
136
|
+
|
|
137
|
+
return *id_and_codes_;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private:
|
|
141
|
+
void Update() {
|
|
142
|
+
id_and_codes_.reset();
|
|
143
|
+
|
|
144
|
+
const Status status = it_->status();
|
|
145
|
+
if (!status.ok()) {
|
|
146
|
+
throw std::runtime_error(status.ToString());
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (!it_->Valid()) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (!it_->PrepareValue()) {
|
|
154
|
+
throw std::runtime_error(
|
|
155
|
+
"Failed to prepare value during iteration in FaissIVFIndex");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const Slice value = it_->value();
|
|
159
|
+
if (value.size() != code_size_) {
|
|
160
|
+
throw std::runtime_error(
|
|
161
|
+
"Code with unexpected size encountered during iteration in "
|
|
162
|
+
"FaissIVFIndex");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const faiss::idx_t id = knn_context_->keys.size();
|
|
166
|
+
knn_context_->keys.emplace_back(it_->key().ToString());
|
|
167
|
+
|
|
168
|
+
id_and_codes_.emplace(id, reinterpret_cast<const uint8_t*>(value.data()));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
KNNContext* knn_context_;
|
|
172
|
+
SecondaryIndexIterator* it_;
|
|
173
|
+
size_t code_size_;
|
|
174
|
+
std::optional<std::pair<faiss::idx_t, const uint8_t*>> id_and_codes_;
|
|
175
|
+
};
|
|
176
|
+
};
|
|
99
177
|
|
|
100
178
|
FaissIVFIndex::FaissIVFIndex(std::unique_ptr<faiss::IndexIVF>&& index,
|
|
101
179
|
std::string primary_column_name)
|
|
@@ -105,6 +183,7 @@ FaissIVFIndex::FaissIVFIndex(std::unique_ptr<faiss::IndexIVF>&& index,
|
|
|
105
183
|
assert(index_);
|
|
106
184
|
assert(index_->quantizer);
|
|
107
185
|
|
|
186
|
+
index_->parallel_mode = 0;
|
|
108
187
|
index_->replace_invlists(adapter_.get());
|
|
109
188
|
}
|
|
110
189
|
|
|
@@ -139,7 +218,9 @@ Status FaissIVFIndex::UpdatePrimaryColumnValue(
|
|
|
139
218
|
const {
|
|
140
219
|
assert(updated_column_value);
|
|
141
220
|
|
|
142
|
-
|
|
221
|
+
const float* const embedding =
|
|
222
|
+
ConvertSliceToFloats(primary_column_value, index_->d);
|
|
223
|
+
if (!embedding) {
|
|
143
224
|
return Status::InvalidArgument(
|
|
144
225
|
"Incorrectly sized vector passed to FaissIVFIndex");
|
|
145
226
|
}
|
|
@@ -148,8 +229,7 @@ Status FaissIVFIndex::UpdatePrimaryColumnValue(
|
|
|
148
229
|
faiss::idx_t label = -1;
|
|
149
230
|
|
|
150
231
|
try {
|
|
151
|
-
index_->quantizer->assign(
|
|
152
|
-
n, reinterpret_cast<const float*>(primary_column_value.data()), &label);
|
|
232
|
+
index_->quantizer->assign(n, embedding, &label);
|
|
153
233
|
} catch (const std::exception& e) {
|
|
154
234
|
return Status::InvalidArgument(e.what());
|
|
155
235
|
}
|
|
@@ -179,6 +259,11 @@ Status FaissIVFIndex::GetSecondaryKeyPrefix(
|
|
|
179
259
|
return Status::OK();
|
|
180
260
|
}
|
|
181
261
|
|
|
262
|
+
Status FaissIVFIndex::FinalizeSecondaryKeyPrefix(
|
|
263
|
+
std::variant<Slice, std::string>* /* secondary_key_prefix */) const {
|
|
264
|
+
return Status::OK();
|
|
265
|
+
}
|
|
266
|
+
|
|
182
267
|
Status FaissIVFIndex::GetSecondaryValue(
|
|
183
268
|
const Slice& /* primary_key */, const Slice& primary_column_value,
|
|
184
269
|
const Slice& original_column_value,
|
|
@@ -190,20 +275,23 @@ Status FaissIVFIndex::GetSecondaryValue(
|
|
|
190
275
|
assert(label < index_->nlist);
|
|
191
276
|
|
|
192
277
|
constexpr faiss::idx_t n = 1;
|
|
278
|
+
|
|
279
|
+
const float* const embedding =
|
|
280
|
+
ConvertSliceToFloats(original_column_value, index_->d);
|
|
281
|
+
assert(embedding);
|
|
282
|
+
|
|
193
283
|
constexpr faiss::idx_t* xids = nullptr;
|
|
194
284
|
std::string code_str;
|
|
195
285
|
|
|
196
286
|
try {
|
|
197
|
-
index_->add_core(
|
|
198
|
-
n, reinterpret_cast<const float*>(original_column_value.data()), xids,
|
|
199
|
-
&label, &code_str);
|
|
287
|
+
index_->add_core(n, embedding, xids, &label, &code_str);
|
|
200
288
|
} catch (const std::exception& e) {
|
|
201
|
-
return Status::
|
|
289
|
+
return Status::Corruption(e.what());
|
|
202
290
|
}
|
|
203
291
|
|
|
204
292
|
if (code_str.size() != index_->code_size) {
|
|
205
|
-
return Status::
|
|
206
|
-
"
|
|
293
|
+
return Status::Corruption(
|
|
294
|
+
"Code with unexpected size returned by fine quantizer");
|
|
207
295
|
}
|
|
208
296
|
|
|
209
297
|
secondary_value->emplace(std::move(code_str));
|
|
@@ -211,4 +299,67 @@ Status FaissIVFIndex::GetSecondaryValue(
|
|
|
211
299
|
return Status::OK();
|
|
212
300
|
}
|
|
213
301
|
|
|
302
|
+
Status FaissIVFIndex::FindKNearestNeighbors(
|
|
303
|
+
SecondaryIndexIterator* it, const Slice& target, size_t neighbors,
|
|
304
|
+
size_t probes, std::vector<std::pair<std::string, float>>* result) const {
|
|
305
|
+
if (!it) {
|
|
306
|
+
return Status::InvalidArgument("Secondary index iterator must be provided");
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const float* const embedding = ConvertSliceToFloats(target, index_->d);
|
|
310
|
+
if (!embedding) {
|
|
311
|
+
return Status::InvalidArgument(
|
|
312
|
+
"Incorrectly sized vector passed to FaissIVFIndex");
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (!neighbors) {
|
|
316
|
+
return Status::InvalidArgument("Invalid number of neighbors");
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (!probes) {
|
|
320
|
+
return Status::InvalidArgument("Invalid number of probes");
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (!result) {
|
|
324
|
+
return Status::InvalidArgument("Result parameter must be provided");
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
result->clear();
|
|
328
|
+
|
|
329
|
+
std::vector<float> distances(neighbors, 0.0f);
|
|
330
|
+
std::vector<faiss::idx_t> ids(neighbors, -1);
|
|
331
|
+
|
|
332
|
+
KNNContext knn_context{it, {}};
|
|
333
|
+
|
|
334
|
+
faiss::SearchParametersIVF params;
|
|
335
|
+
params.nprobe = probes;
|
|
336
|
+
params.inverted_list_context = &knn_context;
|
|
337
|
+
|
|
338
|
+
constexpr faiss::idx_t n = 1;
|
|
339
|
+
|
|
340
|
+
try {
|
|
341
|
+
index_->search(n, embedding, neighbors, distances.data(), ids.data(),
|
|
342
|
+
¶ms);
|
|
343
|
+
} catch (const std::exception& e) {
|
|
344
|
+
return Status::Corruption(e.what());
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
result->reserve(neighbors);
|
|
348
|
+
|
|
349
|
+
for (size_t i = 0; i < neighbors; ++i) {
|
|
350
|
+
if (ids[i] < 0) {
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (ids[i] >= knn_context.keys.size()) {
|
|
355
|
+
result->clear();
|
|
356
|
+
return Status::Corruption("Unexpected id returned by FAISS");
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
result->emplace_back(knn_context.keys[ids[i]], distances[i]);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return Status::OK();
|
|
363
|
+
}
|
|
364
|
+
|
|
214
365
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
4
|
// (found in the LICENSE.Apache file in the root directory).
|
|
5
5
|
|
|
6
|
-
#include "utilities/secondary_index/faiss_ivf_index.h"
|
|
7
|
-
|
|
8
6
|
#include <charconv>
|
|
9
7
|
#include <memory>
|
|
10
8
|
#include <string>
|
|
@@ -13,6 +11,7 @@
|
|
|
13
11
|
#include "faiss/IndexFlat.h"
|
|
14
12
|
#include "faiss/IndexIVFFlat.h"
|
|
15
13
|
#include "faiss/utils/random.h"
|
|
14
|
+
#include "rocksdb/utilities/secondary_index_faiss.h"
|
|
16
15
|
#include "rocksdb/utilities/transaction_db.h"
|
|
17
16
|
#include "test_util/testharness.h"
|
|
18
17
|
#include "util/coding.h"
|
|
@@ -33,7 +32,9 @@ TEST(FaissIVFIndexTest, Basic) {
|
|
|
33
32
|
|
|
34
33
|
index->train(num_vectors, embeddings.data());
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
const std::string primary_column_name = "embedding";
|
|
36
|
+
auto faiss_ivf_index =
|
|
37
|
+
std::make_shared<FaissIVFIndex>(std::move(index), primary_column_name);
|
|
37
38
|
|
|
38
39
|
const std::string db_name = test::PerThreadDBPath("faiss_ivf_index_test");
|
|
39
40
|
EXPECT_OK(DestroyDB(db_name, Options()));
|
|
@@ -42,9 +43,7 @@ TEST(FaissIVFIndexTest, Basic) {
|
|
|
42
43
|
options.create_if_missing = true;
|
|
43
44
|
|
|
44
45
|
TransactionDBOptions txn_db_options;
|
|
45
|
-
|
|
46
|
-
txn_db_options.secondary_indices.emplace_back(
|
|
47
|
-
std::make_shared<FaissIVFIndex>(std::move(index), primary_column_name));
|
|
46
|
+
txn_db_options.secondary_indices.emplace_back(faiss_ivf_index);
|
|
48
47
|
|
|
49
48
|
TransactionDB* db = nullptr;
|
|
50
49
|
ASSERT_OK(TransactionDB::Open(options, txn_db_options, db_name, &db));
|
|
@@ -65,6 +64,8 @@ TEST(FaissIVFIndexTest, Basic) {
|
|
|
65
64
|
secondary_index->SetPrimaryColumnFamily(cfh1);
|
|
66
65
|
secondary_index->SetSecondaryColumnFamily(cfh2);
|
|
67
66
|
|
|
67
|
+
// Write the embeddings to the primary column family, indexing them in the
|
|
68
|
+
// process
|
|
68
69
|
{
|
|
69
70
|
std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
|
|
70
71
|
|
|
@@ -75,13 +76,13 @@ TEST(FaissIVFIndexTest, Basic) {
|
|
|
75
76
|
cfh1, primary_key,
|
|
76
77
|
WideColumns{
|
|
77
78
|
{primary_column_name,
|
|
78
|
-
|
|
79
|
-
dim * sizeof(float))}}));
|
|
79
|
+
ConvertFloatsToSlice(embeddings.data() + i * dim, dim)}}));
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
ASSERT_OK(txn->Commit());
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
// Verify the raw index data in the secondary column family
|
|
85
86
|
{
|
|
86
87
|
size_t num_found = 0;
|
|
87
88
|
|
|
@@ -102,10 +103,8 @@ TEST(FaissIVFIndexTest, Basic) {
|
|
|
102
103
|
|
|
103
104
|
// Since we use IndexIVFFlat, there is no fine quantization, so the code
|
|
104
105
|
// is actually just the original embedding
|
|
105
|
-
ASSERT_EQ(
|
|
106
|
-
|
|
107
|
-
Slice(reinterpret_cast<const char*>(embeddings.data() + id * dim),
|
|
108
|
-
dim * sizeof(float)));
|
|
106
|
+
ASSERT_EQ(it->value(),
|
|
107
|
+
ConvertFloatsToSlice(embeddings.data() + id * dim, dim));
|
|
109
108
|
|
|
110
109
|
++num_found;
|
|
111
110
|
}
|
|
@@ -113,6 +112,253 @@ TEST(FaissIVFIndexTest, Basic) {
|
|
|
113
112
|
ASSERT_OK(it->status());
|
|
114
113
|
ASSERT_EQ(num_found, num_vectors);
|
|
115
114
|
}
|
|
115
|
+
|
|
116
|
+
// Query the index with some of the original embeddings
|
|
117
|
+
std::unique_ptr<Iterator> underlying_it(db->NewIterator(ReadOptions(), cfh2));
|
|
118
|
+
auto secondary_it = std::make_unique<SecondaryIndexIterator>(
|
|
119
|
+
faiss_ivf_index.get(), std::move(underlying_it));
|
|
120
|
+
|
|
121
|
+
auto get_id = [](const Slice& key) -> faiss::idx_t {
|
|
122
|
+
faiss::idx_t id = -1;
|
|
123
|
+
|
|
124
|
+
if (std::from_chars(key.data(), key.data() + key.size(), id).ec !=
|
|
125
|
+
std::errc()) {
|
|
126
|
+
return -1;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return id;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
constexpr size_t neighbors = 8;
|
|
133
|
+
|
|
134
|
+
auto verify = [&](faiss::idx_t id) {
|
|
135
|
+
// Search for a vector from the original set; we expect to find the vector
|
|
136
|
+
// itself as the closest match, since we're performing an exhaustive search
|
|
137
|
+
std::vector<std::pair<std::string, float>> result;
|
|
138
|
+
ASSERT_OK(faiss_ivf_index->FindKNearestNeighbors(
|
|
139
|
+
secondary_it.get(),
|
|
140
|
+
ConvertFloatsToSlice(embeddings.data() + id * dim, dim), neighbors,
|
|
141
|
+
num_lists, &result));
|
|
142
|
+
|
|
143
|
+
ASSERT_EQ(result.size(), neighbors);
|
|
144
|
+
|
|
145
|
+
const faiss::idx_t first_id = get_id(result[0].first);
|
|
146
|
+
|
|
147
|
+
ASSERT_GE(first_id, 0);
|
|
148
|
+
ASSERT_LT(first_id, num_vectors);
|
|
149
|
+
ASSERT_EQ(first_id, id);
|
|
150
|
+
|
|
151
|
+
ASSERT_EQ(result[0].second, 0.0f);
|
|
152
|
+
|
|
153
|
+
// Iterate over the rest of the results
|
|
154
|
+
for (size_t i = 1; i < neighbors; ++i) {
|
|
155
|
+
const faiss::idx_t other_id = get_id(result[i].first);
|
|
156
|
+
ASSERT_GE(other_id, 0);
|
|
157
|
+
ASSERT_LT(other_id, num_vectors);
|
|
158
|
+
ASSERT_NE(other_id, id);
|
|
159
|
+
|
|
160
|
+
ASSERT_GE(result[i].second, result[i - 1].second);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
verify(0);
|
|
165
|
+
verify(16);
|
|
166
|
+
verify(32);
|
|
167
|
+
verify(64);
|
|
168
|
+
|
|
169
|
+
// Sanity checks
|
|
170
|
+
{
|
|
171
|
+
// No secondary index iterator
|
|
172
|
+
constexpr SecondaryIndexIterator* bad_secondary_it = nullptr;
|
|
173
|
+
std::vector<std::pair<std::string, float>> result;
|
|
174
|
+
ASSERT_TRUE(faiss_ivf_index
|
|
175
|
+
->FindKNearestNeighbors(
|
|
176
|
+
bad_secondary_it,
|
|
177
|
+
ConvertFloatsToSlice(embeddings.data(), dim), neighbors,
|
|
178
|
+
num_lists, &result)
|
|
179
|
+
.IsInvalidArgument());
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
{
|
|
183
|
+
// Invalid target
|
|
184
|
+
std::vector<std::pair<std::string, float>> result;
|
|
185
|
+
ASSERT_TRUE(faiss_ivf_index
|
|
186
|
+
->FindKNearestNeighbors(secondary_it.get(), "foo",
|
|
187
|
+
neighbors, num_lists, &result)
|
|
188
|
+
.IsInvalidArgument());
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
{
|
|
192
|
+
// Invalid value for neighbors
|
|
193
|
+
constexpr size_t bad_neighbors = 0;
|
|
194
|
+
std::vector<std::pair<std::string, float>> result;
|
|
195
|
+
ASSERT_TRUE(faiss_ivf_index
|
|
196
|
+
->FindKNearestNeighbors(
|
|
197
|
+
secondary_it.get(),
|
|
198
|
+
ConvertFloatsToSlice(embeddings.data(), dim),
|
|
199
|
+
bad_neighbors, num_lists, &result)
|
|
200
|
+
.IsInvalidArgument());
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
{
|
|
204
|
+
// Invalid value for neighbors
|
|
205
|
+
constexpr size_t bad_probes = 0;
|
|
206
|
+
std::vector<std::pair<std::string, float>> result;
|
|
207
|
+
ASSERT_TRUE(faiss_ivf_index
|
|
208
|
+
->FindKNearestNeighbors(
|
|
209
|
+
secondary_it.get(),
|
|
210
|
+
ConvertFloatsToSlice(embeddings.data(), dim), neighbors,
|
|
211
|
+
bad_probes, &result)
|
|
212
|
+
.IsInvalidArgument());
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
{
|
|
216
|
+
// No result parameter
|
|
217
|
+
constexpr std::vector<std::pair<std::string, float>>* bad_result = nullptr;
|
|
218
|
+
ASSERT_TRUE(faiss_ivf_index
|
|
219
|
+
->FindKNearestNeighbors(
|
|
220
|
+
secondary_it.get(),
|
|
221
|
+
ConvertFloatsToSlice(embeddings.data(), dim), neighbors,
|
|
222
|
+
num_lists, bad_result)
|
|
223
|
+
.IsInvalidArgument());
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
TEST(FaissIVFIndexTest, Compare) {
|
|
228
|
+
// Train two copies of the same index; hand over one to FaissIVFIndex and use
|
|
229
|
+
// the other one as a baseline for comparison
|
|
230
|
+
constexpr size_t dim = 128;
|
|
231
|
+
auto quantizer_cmp = std::make_unique<faiss::IndexFlatL2>(dim);
|
|
232
|
+
auto quantizer = std::make_unique<faiss::IndexFlatL2>(dim);
|
|
233
|
+
|
|
234
|
+
constexpr size_t num_lists = 16;
|
|
235
|
+
auto index_cmp = std::make_unique<faiss::IndexIVFFlat>(quantizer_cmp.get(),
|
|
236
|
+
dim, num_lists);
|
|
237
|
+
auto index =
|
|
238
|
+
std::make_unique<faiss::IndexIVFFlat>(quantizer.get(), dim, num_lists);
|
|
239
|
+
|
|
240
|
+
{
|
|
241
|
+
constexpr faiss::idx_t num_train = 1024;
|
|
242
|
+
std::vector<float> embeddings_train(dim * num_train);
|
|
243
|
+
faiss::float_rand(embeddings_train.data(), dim * num_train, 42);
|
|
244
|
+
|
|
245
|
+
index_cmp->train(num_train, embeddings_train.data());
|
|
246
|
+
index->train(num_train, embeddings_train.data());
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
auto faiss_ivf_index = std::make_shared<FaissIVFIndex>(
|
|
250
|
+
std::move(index), kDefaultWideColumnName.ToString());
|
|
251
|
+
|
|
252
|
+
const std::string db_name = test::PerThreadDBPath("faiss_ivf_index_test");
|
|
253
|
+
EXPECT_OK(DestroyDB(db_name, Options()));
|
|
254
|
+
|
|
255
|
+
Options options;
|
|
256
|
+
options.create_if_missing = true;
|
|
257
|
+
|
|
258
|
+
TransactionDBOptions txn_db_options;
|
|
259
|
+
txn_db_options.secondary_indices.emplace_back(faiss_ivf_index);
|
|
260
|
+
|
|
261
|
+
TransactionDB* db = nullptr;
|
|
262
|
+
ASSERT_OK(TransactionDB::Open(options, txn_db_options, db_name, &db));
|
|
263
|
+
|
|
264
|
+
std::unique_ptr<TransactionDB> db_guard(db);
|
|
265
|
+
|
|
266
|
+
ColumnFamilyOptions cf1_opts;
|
|
267
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
268
|
+
ASSERT_OK(db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
|
|
269
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
270
|
+
|
|
271
|
+
ColumnFamilyOptions cf2_opts;
|
|
272
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
273
|
+
ASSERT_OK(db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
|
|
274
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
275
|
+
|
|
276
|
+
const auto& secondary_index = txn_db_options.secondary_indices.back();
|
|
277
|
+
secondary_index->SetPrimaryColumnFamily(cfh1);
|
|
278
|
+
secondary_index->SetSecondaryColumnFamily(cfh2);
|
|
279
|
+
|
|
280
|
+
// Add the same set of database vectors to both indices
|
|
281
|
+
constexpr faiss::idx_t num_db = 4096;
|
|
282
|
+
|
|
283
|
+
{
|
|
284
|
+
std::vector<float> embeddings_db(dim * num_db);
|
|
285
|
+
faiss::float_rand(embeddings_db.data(), dim * num_db, 123);
|
|
286
|
+
|
|
287
|
+
for (faiss::idx_t i = 0; i < num_db; ++i) {
|
|
288
|
+
const float* const embedding = embeddings_db.data() + i * dim;
|
|
289
|
+
|
|
290
|
+
index_cmp->add(1, embedding);
|
|
291
|
+
|
|
292
|
+
const std::string primary_key = std::to_string(i);
|
|
293
|
+
ASSERT_OK(db->Put(WriteOptions(), cfh1, primary_key,
|
|
294
|
+
ConvertFloatsToSlice(embedding, dim)));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Search both indices with the same set of query vectors and make sure the
|
|
299
|
+
// results match
|
|
300
|
+
{
|
|
301
|
+
constexpr faiss::idx_t num_query = 32;
|
|
302
|
+
std::vector<float> embeddings_query(dim * num_query);
|
|
303
|
+
faiss::float_rand(embeddings_query.data(), dim * num_query, 456);
|
|
304
|
+
|
|
305
|
+
std::unique_ptr<Iterator> underlying_it(
|
|
306
|
+
db->NewIterator(ReadOptions(), cfh2));
|
|
307
|
+
auto secondary_it = std::make_unique<SecondaryIndexIterator>(
|
|
308
|
+
faiss_ivf_index.get(), std::move(underlying_it));
|
|
309
|
+
|
|
310
|
+
auto get_id = [](const Slice& key) -> faiss::idx_t {
|
|
311
|
+
faiss::idx_t id = -1;
|
|
312
|
+
|
|
313
|
+
if (std::from_chars(key.data(), key.data() + key.size(), id).ec !=
|
|
314
|
+
std::errc()) {
|
|
315
|
+
return -1;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return id;
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
for (size_t neighbors : {1, 2, 4}) {
|
|
322
|
+
for (size_t probes : {1, 2, 4}) {
|
|
323
|
+
for (faiss::idx_t i = 0; i < num_query; ++i) {
|
|
324
|
+
const float* const embedding = embeddings_query.data() + i * dim;
|
|
325
|
+
|
|
326
|
+
std::vector<float> distances(neighbors, 0.0f);
|
|
327
|
+
std::vector<faiss::idx_t> ids(neighbors, -1);
|
|
328
|
+
|
|
329
|
+
faiss::SearchParametersIVF params;
|
|
330
|
+
params.nprobe = probes;
|
|
331
|
+
|
|
332
|
+
index_cmp->search(1, embedding, neighbors, distances.data(),
|
|
333
|
+
ids.data(), ¶ms);
|
|
334
|
+
|
|
335
|
+
size_t result_size_cmp = 0;
|
|
336
|
+
for (faiss::idx_t id_cmp : ids) {
|
|
337
|
+
if (id_cmp < 0) {
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
++result_size_cmp;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
std::vector<std::pair<std::string, float>> result;
|
|
345
|
+
ASSERT_OK(faiss_ivf_index->FindKNearestNeighbors(
|
|
346
|
+
secondary_it.get(), ConvertFloatsToSlice(embedding, dim),
|
|
347
|
+
neighbors, probes, &result));
|
|
348
|
+
|
|
349
|
+
ASSERT_EQ(result.size(), result_size_cmp);
|
|
350
|
+
|
|
351
|
+
for (size_t j = 0; j < result.size(); ++j) {
|
|
352
|
+
const faiss::idx_t id = get_id(result[j].first);
|
|
353
|
+
ASSERT_GE(id, 0);
|
|
354
|
+
ASSERT_LT(id, num_db);
|
|
355
|
+
ASSERT_EQ(id, ids[j]);
|
|
356
|
+
ASSERT_EQ(result[j].second, distances[j]);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
116
362
|
}
|
|
117
363
|
|
|
118
364
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
3
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
4
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
5
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
6
|
+
|
|
7
|
+
#pragma once
|
|
8
|
+
|
|
9
|
+
#include <string>
|
|
10
|
+
#include <variant>
|
|
11
|
+
|
|
12
|
+
#include "rocksdb/rocksdb_namespace.h"
|
|
13
|
+
#include "rocksdb/slice.h"
|
|
14
|
+
#include "util/overload.h"
|
|
15
|
+
|
|
16
|
+
namespace ROCKSDB_NAMESPACE {
|
|
17
|
+
|
|
18
|
+
class SecondaryIndexHelper {
|
|
19
|
+
public:
|
|
20
|
+
static Slice AsSlice(const std::variant<Slice, std::string>& var) {
|
|
21
|
+
return std::visit([](const auto& value) -> Slice { return value; }, var);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
static std::string AsString(const std::variant<Slice, std::string>& var) {
|
|
25
|
+
return std::visit(
|
|
26
|
+
overload{
|
|
27
|
+
[](const Slice& value) -> std::string { return value.ToString(); },
|
|
28
|
+
[](const std::string& value) -> std::string { return value; }},
|
|
29
|
+
var);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
} // namespace ROCKSDB_NAMESPACE
|