@nxtedition/rocksdb 13.1.5 → 13.3.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 +62 -15
- package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
- package/deps/rocksdb/rocksdb/Makefile +2 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
- package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
- package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
- package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
- package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
- package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
- package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
- package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
- package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
- package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
- package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
- package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
- package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
- package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
- package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
- package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
- package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
- package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
- package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
- package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
- package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
- package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
- package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
- package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
- package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
- package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
- package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
- package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
- package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
- package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
- package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
- package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
- package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
- package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
- package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
- package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
- package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
- package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
- package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
- package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
- package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
- package/deps/rocksdb/rocksdb/port/port.h +5 -9
- package/deps/rocksdb/rocksdb/src.mk +8 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/format.cc +3 -3
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
- package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
- package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
- package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
- package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
- package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
- package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
- package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
- package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
- package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
- package/deps/rocksdb/rocksdb.gyp +2 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
|
@@ -139,9 +139,17 @@ ToggleUDT CompareComparator(const Comparator* new_comparator,
|
|
|
139
139
|
|
|
140
140
|
TimestampRecoveryHandler::TimestampRecoveryHandler(
|
|
141
141
|
const UnorderedMap<uint32_t, size_t>& running_ts_sz,
|
|
142
|
-
const UnorderedMap<uint32_t, size_t>& record_ts_sz
|
|
142
|
+
const UnorderedMap<uint32_t, size_t>& record_ts_sz, bool seq_per_batch,
|
|
143
|
+
bool batch_per_txn)
|
|
143
144
|
: running_ts_sz_(running_ts_sz),
|
|
144
145
|
record_ts_sz_(record_ts_sz),
|
|
146
|
+
// Write after commit currently uses one seq per key (instead of per
|
|
147
|
+
// batch). So seq_per_batch being false indicates write_after_commit
|
|
148
|
+
// approach.
|
|
149
|
+
write_after_commit_(!seq_per_batch),
|
|
150
|
+
// WriteUnprepared can write multiple WriteBatches per transaction, so
|
|
151
|
+
// batch_per_txn being false indicates write_before_prepare.
|
|
152
|
+
write_before_prepare_(!batch_per_txn),
|
|
145
153
|
new_batch_(new WriteBatch()),
|
|
146
154
|
handler_valid_(true),
|
|
147
155
|
new_batch_diff_from_orig_batch_(false) {}
|
|
@@ -258,6 +266,43 @@ Status TimestampRecoveryHandler::PutBlobIndexCF(uint32_t cf, const Slice& key,
|
|
|
258
266
|
return WriteBatchInternal::PutBlobIndex(new_batch_.get(), cf, new_key, value);
|
|
259
267
|
}
|
|
260
268
|
|
|
269
|
+
Status TimestampRecoveryHandler::MarkBeginPrepare(bool unprepare) {
|
|
270
|
+
// Transaction policy change requires empty WAL and User-defined timestamp is
|
|
271
|
+
// only supported for write committed txns.
|
|
272
|
+
// WriteBatch::Iterate has will handle this based on
|
|
273
|
+
// handler->WriteAfterCommit() and handler->WriteBeforePrepare().
|
|
274
|
+
if (unprepare) {
|
|
275
|
+
return Status::InvalidArgument(
|
|
276
|
+
"Handle user defined timestamp setting change is not supported for"
|
|
277
|
+
"write unprepared policy. The WAL must be emptied.");
|
|
278
|
+
}
|
|
279
|
+
return WriteBatchInternal::InsertBeginPrepare(new_batch_.get(),
|
|
280
|
+
write_after_commit_,
|
|
281
|
+
/* unprepared_batch */ false);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
Status TimestampRecoveryHandler::MarkEndPrepare(const Slice& name) {
|
|
285
|
+
return WriteBatchInternal::InsertEndPrepare(new_batch_.get(), name);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
Status TimestampRecoveryHandler::MarkCommit(const Slice& name) {
|
|
289
|
+
return WriteBatchInternal::MarkCommit(new_batch_.get(), name);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
Status TimestampRecoveryHandler::MarkCommitWithTimestamp(
|
|
293
|
+
const Slice& name, const Slice& commit_ts) {
|
|
294
|
+
return WriteBatchInternal::MarkCommitWithTimestamp(new_batch_.get(), name,
|
|
295
|
+
commit_ts);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
Status TimestampRecoveryHandler::MarkRollback(const Slice& name) {
|
|
299
|
+
return WriteBatchInternal::MarkRollback(new_batch_.get(), name);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
Status TimestampRecoveryHandler::MarkNoop(bool /*empty_batch*/) {
|
|
303
|
+
return WriteBatchInternal::InsertNoop(new_batch_.get());
|
|
304
|
+
}
|
|
305
|
+
|
|
261
306
|
Status TimestampRecoveryHandler::ReconcileTimestampDiscrepancy(
|
|
262
307
|
uint32_t cf, const Slice& key, std::string* new_key_buf, Slice* new_key) {
|
|
263
308
|
assert(handler_valid_);
|
|
@@ -304,8 +349,8 @@ Status HandleWriteBatchTimestampSizeDifference(
|
|
|
304
349
|
const WriteBatch* batch,
|
|
305
350
|
const UnorderedMap<uint32_t, size_t>& running_ts_sz,
|
|
306
351
|
const UnorderedMap<uint32_t, size_t>& record_ts_sz,
|
|
307
|
-
TimestampSizeConsistencyMode check_mode,
|
|
308
|
-
std::unique_ptr<WriteBatch>* new_batch) {
|
|
352
|
+
TimestampSizeConsistencyMode check_mode, bool seq_per_batch,
|
|
353
|
+
bool batch_per_txn, std::unique_ptr<WriteBatch>* new_batch) {
|
|
309
354
|
// Quick path to bypass checking the WriteBatch.
|
|
310
355
|
if (AllRunningColumnFamiliesConsistent(running_ts_sz, record_ts_sz)) {
|
|
311
356
|
return Status::OK();
|
|
@@ -318,7 +363,8 @@ Status HandleWriteBatchTimestampSizeDifference(
|
|
|
318
363
|
} else if (need_recovery) {
|
|
319
364
|
assert(new_batch);
|
|
320
365
|
SequenceNumber sequence = WriteBatchInternal::Sequence(batch);
|
|
321
|
-
TimestampRecoveryHandler recovery_handler(running_ts_sz, record_ts_sz
|
|
366
|
+
TimestampRecoveryHandler recovery_handler(running_ts_sz, record_ts_sz,
|
|
367
|
+
seq_per_batch, batch_per_txn);
|
|
322
368
|
status = batch->Iterate(&recovery_handler);
|
|
323
369
|
if (!status.ok()) {
|
|
324
370
|
return status;
|
|
@@ -105,7 +105,8 @@ class UserDefinedTimestampSizeRecord {
|
|
|
105
105
|
class TimestampRecoveryHandler : public WriteBatch::Handler {
|
|
106
106
|
public:
|
|
107
107
|
TimestampRecoveryHandler(const UnorderedMap<uint32_t, size_t>& running_ts_sz,
|
|
108
|
-
const UnorderedMap<uint32_t, size_t>& record_ts_sz
|
|
108
|
+
const UnorderedMap<uint32_t, size_t>& record_ts_sz,
|
|
109
|
+
bool seq_per_batch, bool batch_per_txn);
|
|
109
110
|
|
|
110
111
|
~TimestampRecoveryHandler() override {}
|
|
111
112
|
|
|
@@ -135,19 +136,18 @@ class TimestampRecoveryHandler : public WriteBatch::Handler {
|
|
|
135
136
|
Status PutBlobIndexCF(uint32_t cf, const Slice& key,
|
|
136
137
|
const Slice& value) override;
|
|
137
138
|
|
|
138
|
-
Status MarkBeginPrepare(bool) override
|
|
139
|
+
Status MarkBeginPrepare(bool unprepare) override;
|
|
139
140
|
|
|
140
|
-
Status MarkEndPrepare(const Slice&) override
|
|
141
|
+
Status MarkEndPrepare(const Slice& name) override;
|
|
141
142
|
|
|
142
|
-
Status MarkCommit(const Slice&) override
|
|
143
|
+
Status MarkCommit(const Slice& name) override;
|
|
143
144
|
|
|
144
|
-
Status MarkCommitWithTimestamp(const Slice
|
|
145
|
-
|
|
146
|
-
}
|
|
145
|
+
Status MarkCommitWithTimestamp(const Slice& name,
|
|
146
|
+
const Slice& commit_ts) override;
|
|
147
147
|
|
|
148
|
-
Status MarkRollback(const Slice&) override
|
|
148
|
+
Status MarkRollback(const Slice& name) override;
|
|
149
149
|
|
|
150
|
-
Status MarkNoop(bool
|
|
150
|
+
Status MarkNoop(bool empty_batch) override;
|
|
151
151
|
|
|
152
152
|
std::unique_ptr<WriteBatch>&& TransferNewBatch() {
|
|
153
153
|
assert(new_batch_diff_from_orig_batch_);
|
|
@@ -155,6 +155,16 @@ class TimestampRecoveryHandler : public WriteBatch::Handler {
|
|
|
155
155
|
return std::move(new_batch_);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
protected:
|
|
159
|
+
Handler::OptionState WriteBeforePrepare() const override {
|
|
160
|
+
return write_before_prepare_ ? Handler::OptionState::kEnabled
|
|
161
|
+
: Handler::OptionState::kDisabled;
|
|
162
|
+
}
|
|
163
|
+
Handler::OptionState WriteAfterCommit() const override {
|
|
164
|
+
return write_after_commit_ ? Handler::OptionState::kEnabled
|
|
165
|
+
: Handler::OptionState::kDisabled;
|
|
166
|
+
}
|
|
167
|
+
|
|
158
168
|
private:
|
|
159
169
|
Status ReconcileTimestampDiscrepancy(uint32_t cf, const Slice& key,
|
|
160
170
|
std::string* new_key_buf,
|
|
@@ -168,6 +178,9 @@ class TimestampRecoveryHandler : public WriteBatch::Handler {
|
|
|
168
178
|
// in the WAL. This only contains non-zero user-defined timestamp size.
|
|
169
179
|
const UnorderedMap<uint32_t, size_t>& record_ts_sz_;
|
|
170
180
|
|
|
181
|
+
bool write_after_commit_;
|
|
182
|
+
bool write_before_prepare_;
|
|
183
|
+
|
|
171
184
|
std::unique_ptr<WriteBatch> new_batch_;
|
|
172
185
|
// Handler is valid upon creation and becomes invalid after its `new_batch_`
|
|
173
186
|
// is transferred.
|
|
@@ -220,8 +233,8 @@ Status HandleWriteBatchTimestampSizeDifference(
|
|
|
220
233
|
const WriteBatch* batch,
|
|
221
234
|
const UnorderedMap<uint32_t, size_t>& running_ts_sz,
|
|
222
235
|
const UnorderedMap<uint32_t, size_t>& record_ts_sz,
|
|
223
|
-
TimestampSizeConsistencyMode check_mode,
|
|
224
|
-
std::unique_ptr<WriteBatch>* new_batch = nullptr);
|
|
236
|
+
TimestampSizeConsistencyMode check_mode, bool seq_per_batch,
|
|
237
|
+
bool batch_per_txn, std::unique_ptr<WriteBatch>* new_batch = nullptr);
|
|
225
238
|
|
|
226
239
|
// This util function is used when opening an existing column family and
|
|
227
240
|
// processing its VersionEdit. It does a sanity check for the column family's
|
|
@@ -226,11 +226,13 @@ TEST_F(HandleTimestampSizeDifferenceTest, AllColumnFamiliesConsistent) {
|
|
|
226
226
|
// All `check_mode` pass with OK status and `batch` not checked or updated.
|
|
227
227
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
228
228
|
&batch, running_ts_sz, record_ts_sz,
|
|
229
|
-
TimestampSizeConsistencyMode::kVerifyConsistency
|
|
229
|
+
TimestampSizeConsistencyMode::kVerifyConsistency,
|
|
230
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true));
|
|
230
231
|
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
231
232
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
232
233
|
&batch, running_ts_sz, record_ts_sz,
|
|
233
|
-
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
234
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
235
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
|
|
234
236
|
ASSERT_TRUE(new_batch.get() == nullptr);
|
|
235
237
|
}
|
|
236
238
|
|
|
@@ -245,11 +247,13 @@ TEST_F(HandleTimestampSizeDifferenceTest,
|
|
|
245
247
|
// All `check_mode` pass with OK status and `batch` not checked or updated.
|
|
246
248
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
247
249
|
&batch, running_ts_sz, record_ts_sz,
|
|
248
|
-
TimestampSizeConsistencyMode::kVerifyConsistency
|
|
250
|
+
TimestampSizeConsistencyMode::kVerifyConsistency,
|
|
251
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true));
|
|
249
252
|
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
250
253
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
251
254
|
&batch, running_ts_sz, record_ts_sz,
|
|
252
|
-
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
255
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
256
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
|
|
253
257
|
ASSERT_TRUE(new_batch.get() == nullptr);
|
|
254
258
|
}
|
|
255
259
|
|
|
@@ -263,11 +267,13 @@ TEST_F(HandleTimestampSizeDifferenceTest, InvolvedColumnFamiliesConsistent) {
|
|
|
263
267
|
// All `check_mode` pass with OK status and `batch` not updated.
|
|
264
268
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
265
269
|
&batch, running_ts_sz, record_ts_sz,
|
|
266
|
-
TimestampSizeConsistencyMode::kVerifyConsistency
|
|
270
|
+
TimestampSizeConsistencyMode::kVerifyConsistency,
|
|
271
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true));
|
|
267
272
|
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
268
273
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
269
274
|
&batch, running_ts_sz, record_ts_sz,
|
|
270
|
-
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
275
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
276
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
|
|
271
277
|
ASSERT_TRUE(new_batch.get() == nullptr);
|
|
272
278
|
}
|
|
273
279
|
|
|
@@ -282,13 +288,15 @@ TEST_F(HandleTimestampSizeDifferenceTest,
|
|
|
282
288
|
// families.
|
|
283
289
|
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
284
290
|
&batch, running_ts_sz, record_ts_sz,
|
|
285
|
-
TimestampSizeConsistencyMode::kVerifyConsistency
|
|
291
|
+
TimestampSizeConsistencyMode::kVerifyConsistency,
|
|
292
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true)
|
|
286
293
|
.IsInvalidArgument());
|
|
287
294
|
|
|
288
295
|
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
289
296
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
290
297
|
&batch, running_ts_sz, record_ts_sz,
|
|
291
|
-
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
298
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
299
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
|
|
292
300
|
ASSERT_TRUE(new_batch.get() != nullptr);
|
|
293
301
|
CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
|
|
294
302
|
std::nullopt /* dropped_cf */);
|
|
@@ -307,13 +315,15 @@ TEST_F(HandleTimestampSizeDifferenceTest,
|
|
|
307
315
|
// families.
|
|
308
316
|
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
309
317
|
&batch, running_ts_sz, record_ts_sz,
|
|
310
|
-
TimestampSizeConsistencyMode::kVerifyConsistency
|
|
318
|
+
TimestampSizeConsistencyMode::kVerifyConsistency,
|
|
319
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true)
|
|
311
320
|
.IsInvalidArgument());
|
|
312
321
|
|
|
313
322
|
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
314
323
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
315
324
|
&batch, running_ts_sz, record_ts_sz,
|
|
316
|
-
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
325
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
326
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
|
|
317
327
|
ASSERT_TRUE(new_batch.get() != nullptr);
|
|
318
328
|
CheckContentsWithTimestampPadding(batch, *new_batch, sizeof(uint64_t));
|
|
319
329
|
}
|
|
@@ -331,7 +341,8 @@ TEST_F(HandleTimestampSizeDifferenceTest,
|
|
|
331
341
|
// and all related entries copied over to the new WriteBatch.
|
|
332
342
|
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
333
343
|
&batch, running_ts_sz, record_ts_sz,
|
|
334
|
-
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
344
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
345
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
|
|
335
346
|
|
|
336
347
|
ASSERT_TRUE(new_batch.get() != nullptr);
|
|
337
348
|
CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
|
|
@@ -346,12 +357,14 @@ TEST_F(HandleTimestampSizeDifferenceTest, UnrecoverableInconsistency) {
|
|
|
346
357
|
|
|
347
358
|
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
348
359
|
&batch, running_ts_sz, record_ts_sz,
|
|
349
|
-
TimestampSizeConsistencyMode::kVerifyConsistency
|
|
360
|
+
TimestampSizeConsistencyMode::kVerifyConsistency,
|
|
361
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true)
|
|
350
362
|
.IsInvalidArgument());
|
|
351
363
|
|
|
352
364
|
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
353
365
|
&batch, running_ts_sz, record_ts_sz,
|
|
354
|
-
TimestampSizeConsistencyMode::kReconcileInconsistency
|
|
366
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency,
|
|
367
|
+
/* seq_per_batch */ false, /* batch_per_txn */ true)
|
|
355
368
|
.IsInvalidArgument());
|
|
356
369
|
}
|
|
357
370
|
|
|
@@ -34,15 +34,6 @@ class MemoryTest : public testing::Test {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
void GetCachePointersFromTableFactory(
|
|
38
|
-
const TableFactory* factory,
|
|
39
|
-
std::unordered_set<const Cache*>* cache_set) {
|
|
40
|
-
const auto bbto = factory->GetOptions<BlockBasedTableOptions>();
|
|
41
|
-
if (bbto != nullptr) {
|
|
42
|
-
cache_set->insert(bbto->block_cache.get());
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
37
|
void GetCachePointers(const std::vector<DB*>& dbs,
|
|
47
38
|
std::unordered_set<const Cache*>* cache_set) {
|
|
48
39
|
cache_set->clear();
|
|
@@ -61,13 +52,8 @@ class MemoryTest : public testing::Test {
|
|
|
61
52
|
cache_set->insert(db->GetDBOptions().row_cache.get());
|
|
62
53
|
|
|
63
54
|
// Cache from table factories
|
|
64
|
-
std::unordered_map<std::string, const ImmutableCFOptions*> iopts_map;
|
|
65
55
|
if (db_impl != nullptr) {
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
for (const auto& pair : iopts_map) {
|
|
69
|
-
GetCachePointersFromTableFactory(pair.second->table_factory.get(),
|
|
70
|
-
cache_set);
|
|
56
|
+
db_impl->TEST_GetAllBlockCaches(cache_set);
|
|
71
57
|
}
|
|
72
58
|
}
|
|
73
59
|
}
|
|
@@ -266,4 +252,3 @@ int main(int argc, char** argv) {
|
|
|
266
252
|
return 0;
|
|
267
253
|
#endif
|
|
268
254
|
}
|
|
269
|
-
|
|
@@ -179,6 +179,8 @@ class DummyTableFactory : public TableFactory {
|
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
std::string GetPrintableOptions() const override { return ""; }
|
|
182
|
+
|
|
183
|
+
std::unique_ptr<TableFactory> Clone() const override { return nullptr; }
|
|
182
184
|
};
|
|
183
185
|
|
|
184
186
|
class DummyMergeOperator : public MergeOperator {
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
3
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
5
|
+
|
|
6
|
+
#include "utilities/secondary_index/faiss_ivf_index.h"
|
|
7
|
+
|
|
8
|
+
#include <cassert>
|
|
9
|
+
|
|
10
|
+
#include "faiss/invlists/InvertedLists.h"
|
|
11
|
+
#include "util/coding.h"
|
|
12
|
+
|
|
13
|
+
namespace ROCKSDB_NAMESPACE {
|
|
14
|
+
|
|
15
|
+
class FaissIVFIndex::Adapter : public faiss::InvertedLists {
|
|
16
|
+
public:
|
|
17
|
+
Adapter(size_t num_lists, size_t code_size)
|
|
18
|
+
: faiss::InvertedLists(num_lists, code_size) {
|
|
19
|
+
use_iterator = true;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Non-iterator-based read interface; not implemented/used since use_iterator
|
|
23
|
+
// is true
|
|
24
|
+
size_t list_size(size_t /* list_no */) const override {
|
|
25
|
+
assert(false);
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const uint8_t* get_codes(size_t /* list_no */) const override {
|
|
30
|
+
assert(false);
|
|
31
|
+
return nullptr;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const faiss::idx_t* get_ids(size_t /* list_no */) const override {
|
|
35
|
+
assert(false);
|
|
36
|
+
return nullptr;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Iterator-based read interface; not yet implemented
|
|
40
|
+
faiss::InvertedListsIterator* get_iterator(
|
|
41
|
+
size_t /* list_no */,
|
|
42
|
+
void* /* inverted_list_context */ = nullptr) const override {
|
|
43
|
+
// TODO: implement this
|
|
44
|
+
|
|
45
|
+
assert(false);
|
|
46
|
+
return nullptr;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Write interface; only add_entry is implemented/required for now
|
|
50
|
+
size_t add_entry(size_t /* list_no */, faiss::idx_t /* id */,
|
|
51
|
+
const uint8_t* code,
|
|
52
|
+
void* inverted_list_context = nullptr) override {
|
|
53
|
+
std::string* const code_str =
|
|
54
|
+
static_cast<std::string*>(inverted_list_context);
|
|
55
|
+
assert(code_str);
|
|
56
|
+
|
|
57
|
+
code_str->assign(reinterpret_cast<const char*>(code), code_size);
|
|
58
|
+
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
size_t add_entries(size_t /* list_no */, size_t /* num_entries */,
|
|
63
|
+
const faiss::idx_t* /* ids */,
|
|
64
|
+
const uint8_t* /* code */) override {
|
|
65
|
+
assert(false);
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void update_entry(size_t /* list_no */, size_t /* offset */,
|
|
70
|
+
faiss::idx_t /* id */, const uint8_t* /* code */) override {
|
|
71
|
+
assert(false);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
void update_entries(size_t /* list_no */, size_t /* offset */,
|
|
75
|
+
size_t /* num_entries */, const faiss::idx_t* /* ids */,
|
|
76
|
+
const uint8_t* /* code */) override {
|
|
77
|
+
assert(false);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void resize(size_t /* list_no */, size_t /* new_size */) override {
|
|
81
|
+
assert(false);
|
|
82
|
+
}
|
|
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
|
+
|
|
92
|
+
faiss::idx_t FaissIVFIndex::DeserializeLabel(Slice label_slice) {
|
|
93
|
+
faiss::idx_t label = -1;
|
|
94
|
+
[[maybe_unused]] const bool ok = GetVarsignedint64(&label_slice, &label);
|
|
95
|
+
assert(ok);
|
|
96
|
+
|
|
97
|
+
return label;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
FaissIVFIndex::FaissIVFIndex(std::unique_ptr<faiss::IndexIVF>&& index,
|
|
101
|
+
std::string primary_column_name)
|
|
102
|
+
: adapter_(std::make_unique<Adapter>(index->nlist, index->code_size)),
|
|
103
|
+
index_(std::move(index)),
|
|
104
|
+
primary_column_name_(std::move(primary_column_name)) {
|
|
105
|
+
assert(index_);
|
|
106
|
+
assert(index_->quantizer);
|
|
107
|
+
|
|
108
|
+
index_->replace_invlists(adapter_.get());
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
FaissIVFIndex::~FaissIVFIndex() = default;
|
|
112
|
+
|
|
113
|
+
void FaissIVFIndex::SetPrimaryColumnFamily(ColumnFamilyHandle* column_family) {
|
|
114
|
+
assert(column_family);
|
|
115
|
+
primary_column_family_ = column_family;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
void FaissIVFIndex::SetSecondaryColumnFamily(
|
|
119
|
+
ColumnFamilyHandle* column_family) {
|
|
120
|
+
assert(column_family);
|
|
121
|
+
secondary_column_family_ = column_family;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
ColumnFamilyHandle* FaissIVFIndex::GetPrimaryColumnFamily() const {
|
|
125
|
+
return primary_column_family_;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
ColumnFamilyHandle* FaissIVFIndex::GetSecondaryColumnFamily() const {
|
|
129
|
+
return secondary_column_family_;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
Slice FaissIVFIndex::GetPrimaryColumnName() const {
|
|
133
|
+
return primary_column_name_;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
Status FaissIVFIndex::UpdatePrimaryColumnValue(
|
|
137
|
+
const Slice& /* primary_key */, const Slice& primary_column_value,
|
|
138
|
+
std::optional<std::variant<Slice, std::string>>* updated_column_value)
|
|
139
|
+
const {
|
|
140
|
+
assert(updated_column_value);
|
|
141
|
+
|
|
142
|
+
if (primary_column_value.size() != index_->d * sizeof(float)) {
|
|
143
|
+
return Status::InvalidArgument(
|
|
144
|
+
"Incorrectly sized vector passed to FaissIVFIndex");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
constexpr faiss::idx_t n = 1;
|
|
148
|
+
faiss::idx_t label = -1;
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
index_->quantizer->assign(
|
|
152
|
+
n, reinterpret_cast<const float*>(primary_column_value.data()), &label);
|
|
153
|
+
} catch (const std::exception& e) {
|
|
154
|
+
return Status::InvalidArgument(e.what());
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (label < 0 || label >= index_->nlist) {
|
|
158
|
+
return Status::InvalidArgument(
|
|
159
|
+
"Unexpected label returned by coarse quantizer");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
updated_column_value->emplace(SerializeLabel(label));
|
|
163
|
+
|
|
164
|
+
return Status::OK();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
Status FaissIVFIndex::GetSecondaryKeyPrefix(
|
|
168
|
+
const Slice& /* primary_key */, const Slice& primary_column_value,
|
|
169
|
+
std::variant<Slice, std::string>* secondary_key_prefix) const {
|
|
170
|
+
assert(secondary_key_prefix);
|
|
171
|
+
|
|
172
|
+
[[maybe_unused]] const faiss::idx_t label =
|
|
173
|
+
DeserializeLabel(primary_column_value);
|
|
174
|
+
assert(label >= 0);
|
|
175
|
+
assert(label < index_->nlist);
|
|
176
|
+
|
|
177
|
+
*secondary_key_prefix = primary_column_value;
|
|
178
|
+
|
|
179
|
+
return Status::OK();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
Status FaissIVFIndex::GetSecondaryValue(
|
|
183
|
+
const Slice& /* primary_key */, const Slice& primary_column_value,
|
|
184
|
+
const Slice& original_column_value,
|
|
185
|
+
std::optional<std::variant<Slice, std::string>>* secondary_value) const {
|
|
186
|
+
assert(secondary_value);
|
|
187
|
+
|
|
188
|
+
const faiss::idx_t label = DeserializeLabel(primary_column_value);
|
|
189
|
+
assert(label >= 0);
|
|
190
|
+
assert(label < index_->nlist);
|
|
191
|
+
|
|
192
|
+
constexpr faiss::idx_t n = 1;
|
|
193
|
+
constexpr faiss::idx_t* xids = nullptr;
|
|
194
|
+
std::string code_str;
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
index_->add_core(
|
|
198
|
+
n, reinterpret_cast<const float*>(original_column_value.data()), xids,
|
|
199
|
+
&label, &code_str);
|
|
200
|
+
} catch (const std::exception& e) {
|
|
201
|
+
return Status::InvalidArgument(e.what());
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (code_str.size() != index_->code_size) {
|
|
205
|
+
return Status::InvalidArgument(
|
|
206
|
+
"Unexpected code returned by fine quantizer");
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
secondary_value->emplace(std::move(code_str));
|
|
210
|
+
|
|
211
|
+
return Status::OK();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -0,0 +1,60 @@
|
|
|
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 <memory>
|
|
10
|
+
#include <string>
|
|
11
|
+
|
|
12
|
+
#include "faiss/IndexIVF.h"
|
|
13
|
+
#include "rocksdb/utilities/secondary_index.h"
|
|
14
|
+
|
|
15
|
+
namespace ROCKSDB_NAMESPACE {
|
|
16
|
+
|
|
17
|
+
// A SecondaryIndex implementation that wraps a FAISS inverted file index.
|
|
18
|
+
class FaissIVFIndex : public SecondaryIndex {
|
|
19
|
+
public:
|
|
20
|
+
explicit FaissIVFIndex(std::unique_ptr<faiss::IndexIVF>&& index,
|
|
21
|
+
std::string primary_column_name);
|
|
22
|
+
~FaissIVFIndex() override;
|
|
23
|
+
|
|
24
|
+
void SetPrimaryColumnFamily(ColumnFamilyHandle* column_family) override;
|
|
25
|
+
void SetSecondaryColumnFamily(ColumnFamilyHandle* column_family) override;
|
|
26
|
+
|
|
27
|
+
ColumnFamilyHandle* GetPrimaryColumnFamily() const override;
|
|
28
|
+
ColumnFamilyHandle* GetSecondaryColumnFamily() const override;
|
|
29
|
+
|
|
30
|
+
Slice GetPrimaryColumnName() const override;
|
|
31
|
+
|
|
32
|
+
Status UpdatePrimaryColumnValue(
|
|
33
|
+
const Slice& primary_key, const Slice& primary_column_value,
|
|
34
|
+
std::optional<std::variant<Slice, std::string>>* updated_column_value)
|
|
35
|
+
const override;
|
|
36
|
+
|
|
37
|
+
Status GetSecondaryKeyPrefix(
|
|
38
|
+
const Slice& primary_key, const Slice& primary_column_value,
|
|
39
|
+
std::variant<Slice, std::string>* secondary_key_prefix) const override;
|
|
40
|
+
|
|
41
|
+
Status GetSecondaryValue(const Slice& primary_key,
|
|
42
|
+
const Slice& primary_column_value,
|
|
43
|
+
const Slice& original_column_value,
|
|
44
|
+
std::optional<std::variant<Slice, std::string>>*
|
|
45
|
+
secondary_value) const override;
|
|
46
|
+
|
|
47
|
+
private:
|
|
48
|
+
class Adapter;
|
|
49
|
+
|
|
50
|
+
static std::string SerializeLabel(faiss::idx_t label);
|
|
51
|
+
static faiss::idx_t DeserializeLabel(Slice label_slice);
|
|
52
|
+
|
|
53
|
+
std::unique_ptr<Adapter> adapter_;
|
|
54
|
+
std::unique_ptr<faiss::IndexIVF> index_;
|
|
55
|
+
std::string primary_column_name_;
|
|
56
|
+
ColumnFamilyHandle* primary_column_family_{};
|
|
57
|
+
ColumnFamilyHandle* secondary_column_family_{};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
} // namespace ROCKSDB_NAMESPACE
|