@nxtedition/rocksdb 13.1.4 → 13.2.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 +43 -16
- 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
|
@@ -0,0 +1,124 @@
|
|
|
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 <charconv>
|
|
9
|
+
#include <memory>
|
|
10
|
+
#include <string>
|
|
11
|
+
#include <vector>
|
|
12
|
+
|
|
13
|
+
#include "faiss/IndexFlat.h"
|
|
14
|
+
#include "faiss/IndexIVFFlat.h"
|
|
15
|
+
#include "faiss/utils/random.h"
|
|
16
|
+
#include "rocksdb/utilities/transaction_db.h"
|
|
17
|
+
#include "test_util/testharness.h"
|
|
18
|
+
#include "util/coding.h"
|
|
19
|
+
|
|
20
|
+
namespace ROCKSDB_NAMESPACE {
|
|
21
|
+
|
|
22
|
+
TEST(FaissIVFIndexTest, Basic) {
|
|
23
|
+
constexpr size_t dim = 128;
|
|
24
|
+
auto quantizer = std::make_unique<faiss::IndexFlatL2>(dim);
|
|
25
|
+
|
|
26
|
+
constexpr size_t num_lists = 16;
|
|
27
|
+
auto index =
|
|
28
|
+
std::make_unique<faiss::IndexIVFFlat>(quantizer.get(), dim, num_lists);
|
|
29
|
+
|
|
30
|
+
constexpr faiss::idx_t num_vectors = 1024;
|
|
31
|
+
std::vector<float> embeddings(dim * num_vectors);
|
|
32
|
+
faiss::float_rand(embeddings.data(), dim * num_vectors, 42);
|
|
33
|
+
|
|
34
|
+
index->train(num_vectors, embeddings.data());
|
|
35
|
+
|
|
36
|
+
index->nprobe = 2;
|
|
37
|
+
|
|
38
|
+
const std::string db_name = test::PerThreadDBPath("faiss_ivf_index_test");
|
|
39
|
+
EXPECT_OK(DestroyDB(db_name, Options()));
|
|
40
|
+
|
|
41
|
+
Options options;
|
|
42
|
+
options.create_if_missing = true;
|
|
43
|
+
|
|
44
|
+
TransactionDBOptions txn_db_options;
|
|
45
|
+
const std::string primary_column_name = "embedding";
|
|
46
|
+
txn_db_options.secondary_indices.emplace_back(
|
|
47
|
+
std::make_shared<FaissIVFIndex>(std::move(index), primary_column_name));
|
|
48
|
+
|
|
49
|
+
TransactionDB* db = nullptr;
|
|
50
|
+
ASSERT_OK(TransactionDB::Open(options, txn_db_options, db_name, &db));
|
|
51
|
+
|
|
52
|
+
std::unique_ptr<TransactionDB> db_guard(db);
|
|
53
|
+
|
|
54
|
+
ColumnFamilyOptions cf1_opts;
|
|
55
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
56
|
+
ASSERT_OK(db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
|
|
57
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
58
|
+
|
|
59
|
+
ColumnFamilyOptions cf2_opts;
|
|
60
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
61
|
+
ASSERT_OK(db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
|
|
62
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
63
|
+
|
|
64
|
+
const auto& secondary_index = txn_db_options.secondary_indices.back();
|
|
65
|
+
secondary_index->SetPrimaryColumnFamily(cfh1);
|
|
66
|
+
secondary_index->SetSecondaryColumnFamily(cfh2);
|
|
67
|
+
|
|
68
|
+
{
|
|
69
|
+
std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
|
|
70
|
+
|
|
71
|
+
for (faiss::idx_t i = 0; i < num_vectors; ++i) {
|
|
72
|
+
const std::string primary_key = std::to_string(i);
|
|
73
|
+
|
|
74
|
+
ASSERT_OK(txn->PutEntity(
|
|
75
|
+
cfh1, primary_key,
|
|
76
|
+
WideColumns{
|
|
77
|
+
{primary_column_name,
|
|
78
|
+
Slice(reinterpret_cast<const char*>(embeddings.data() + i * dim),
|
|
79
|
+
dim * sizeof(float))}}));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
ASSERT_OK(txn->Commit());
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
{
|
|
86
|
+
size_t num_found = 0;
|
|
87
|
+
|
|
88
|
+
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
|
|
89
|
+
|
|
90
|
+
for (it->SeekToFirst(); it->Valid(); it->Next()) {
|
|
91
|
+
Slice key = it->key();
|
|
92
|
+
faiss::idx_t label = -1;
|
|
93
|
+
ASSERT_TRUE(GetVarsignedint64(&key, &label));
|
|
94
|
+
ASSERT_GE(label, 0);
|
|
95
|
+
ASSERT_LT(label, num_lists);
|
|
96
|
+
|
|
97
|
+
faiss::idx_t id = -1;
|
|
98
|
+
ASSERT_EQ(std::from_chars(key.data(), key.data() + key.size(), id).ec,
|
|
99
|
+
std::errc());
|
|
100
|
+
ASSERT_GE(id, 0);
|
|
101
|
+
ASSERT_LT(id, num_vectors);
|
|
102
|
+
|
|
103
|
+
// Since we use IndexIVFFlat, there is no fine quantization, so the code
|
|
104
|
+
// is actually just the original embedding
|
|
105
|
+
ASSERT_EQ(
|
|
106
|
+
it->value(),
|
|
107
|
+
Slice(reinterpret_cast<const char*>(embeddings.data() + id * dim),
|
|
108
|
+
dim * sizeof(float)));
|
|
109
|
+
|
|
110
|
+
++num_found;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
ASSERT_OK(it->status());
|
|
114
|
+
ASSERT_EQ(num_found, num_vectors);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
119
|
+
|
|
120
|
+
int main(int argc, char** argv) {
|
|
121
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
122
|
+
::testing::InitGoogleTest(&argc, argv);
|
|
123
|
+
return RUN_ALL_TESTS();
|
|
124
|
+
}
|
|
@@ -0,0 +1,441 @@
|
|
|
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 <cassert>
|
|
10
|
+
#include <memory>
|
|
11
|
+
#include <optional>
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
#include "db/wide/wide_columns_helper.h"
|
|
16
|
+
#include "rocksdb/options.h"
|
|
17
|
+
#include "rocksdb/utilities/secondary_index.h"
|
|
18
|
+
#include "rocksdb/wide_columns.h"
|
|
19
|
+
#include "util/autovector.h"
|
|
20
|
+
#include "util/overload.h"
|
|
21
|
+
|
|
22
|
+
namespace ROCKSDB_NAMESPACE {
|
|
23
|
+
|
|
24
|
+
template <typename Txn>
|
|
25
|
+
class SecondaryIndexMixin : public Txn {
|
|
26
|
+
public:
|
|
27
|
+
template <typename... Args>
|
|
28
|
+
explicit SecondaryIndexMixin(
|
|
29
|
+
const std::vector<std::shared_ptr<SecondaryIndex>>* secondary_indices,
|
|
30
|
+
Args&&... args)
|
|
31
|
+
: Txn(std::forward<Args>(args)...),
|
|
32
|
+
secondary_indices_(secondary_indices) {
|
|
33
|
+
assert(secondary_indices_);
|
|
34
|
+
assert(!secondary_indices_->empty());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
using Txn::Put;
|
|
38
|
+
Status Put(ColumnFamilyHandle* /* column_family */, const Slice& /* key */,
|
|
39
|
+
const Slice& /* value */,
|
|
40
|
+
const bool /* assume_tracked */ = false) override {
|
|
41
|
+
return Status::NotSupported("Put with secondary indices not yet supported");
|
|
42
|
+
}
|
|
43
|
+
Status Put(ColumnFamilyHandle* /* column_family */,
|
|
44
|
+
const SliceParts& /* key */, const SliceParts& /* value */,
|
|
45
|
+
const bool /* assume_tracked */ = false) override {
|
|
46
|
+
return Status::NotSupported("Put with secondary indices not yet supported");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Status PutEntity(ColumnFamilyHandle* column_family, const Slice& key,
|
|
50
|
+
const WideColumns& columns,
|
|
51
|
+
bool assume_tracked = false) override {
|
|
52
|
+
return PerformWithSavePoint([&]() {
|
|
53
|
+
const bool do_validate = !assume_tracked;
|
|
54
|
+
return PutEntityWithSecondaryIndices(column_family, key, columns,
|
|
55
|
+
do_validate);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
using Txn::Merge;
|
|
60
|
+
Status Merge(ColumnFamilyHandle* /* column_family */, const Slice& /* key */,
|
|
61
|
+
const Slice& /* value */,
|
|
62
|
+
const bool /* assume_tracked */ = false) override {
|
|
63
|
+
return Status::NotSupported(
|
|
64
|
+
"Merge with secondary indices not yet supported");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
using Txn::Delete;
|
|
68
|
+
Status Delete(ColumnFamilyHandle* /* column_family */, const Slice& /* key */,
|
|
69
|
+
const bool /* assume_tracked */ = false) override {
|
|
70
|
+
return Status::NotSupported(
|
|
71
|
+
"Delete with secondary indices not yet supported");
|
|
72
|
+
}
|
|
73
|
+
Status Delete(ColumnFamilyHandle* /* column_family */,
|
|
74
|
+
const SliceParts& /* key */,
|
|
75
|
+
const bool /* assume_tracked */ = false) override {
|
|
76
|
+
return Status::NotSupported(
|
|
77
|
+
"Delete with secondary indices not yet supported");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
using Txn::SingleDelete;
|
|
81
|
+
Status SingleDelete(ColumnFamilyHandle* /* column_family */,
|
|
82
|
+
const Slice& /* key */,
|
|
83
|
+
const bool /* assume_tracked */ = false) override {
|
|
84
|
+
return Status::NotSupported(
|
|
85
|
+
"SingleDelete with secondary indices not yet supported");
|
|
86
|
+
}
|
|
87
|
+
Status SingleDelete(ColumnFamilyHandle* /* column_family */,
|
|
88
|
+
const SliceParts& /* key */,
|
|
89
|
+
const bool /* assume_tracked */ = false) override {
|
|
90
|
+
return Status::NotSupported(
|
|
91
|
+
"SingleDelete with secondary indices not yet supported");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
using Txn::PutUntracked;
|
|
95
|
+
Status PutUntracked(ColumnFamilyHandle* /* column_family */,
|
|
96
|
+
const Slice& /* key */,
|
|
97
|
+
const Slice& /* value */) override {
|
|
98
|
+
return Status::NotSupported(
|
|
99
|
+
"PutUntracked with secondary indices not yet supported");
|
|
100
|
+
}
|
|
101
|
+
Status PutUntracked(ColumnFamilyHandle* /* column_family */,
|
|
102
|
+
const SliceParts& /* key */,
|
|
103
|
+
const SliceParts& /* value */) override {
|
|
104
|
+
return Status::NotSupported(
|
|
105
|
+
"PutUntracked with secondary indices not yet supported");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
Status PutEntityUntracked(ColumnFamilyHandle* column_family, const Slice& key,
|
|
109
|
+
const WideColumns& columns) override {
|
|
110
|
+
return PerformWithSavePoint([&]() {
|
|
111
|
+
constexpr bool do_validate = false;
|
|
112
|
+
return PutEntityWithSecondaryIndices(column_family, key, columns,
|
|
113
|
+
do_validate);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
using Txn::MergeUntracked;
|
|
118
|
+
Status MergeUntracked(ColumnFamilyHandle* /* column_family */,
|
|
119
|
+
const Slice& /* key */,
|
|
120
|
+
const Slice& /* value */) override {
|
|
121
|
+
return Status::NotSupported(
|
|
122
|
+
"MergeUntracked with secondary indices not yet supported");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
using Txn::DeleteUntracked;
|
|
126
|
+
Status DeleteUntracked(ColumnFamilyHandle* /* column_family */,
|
|
127
|
+
const Slice& /* key */) override {
|
|
128
|
+
return Status::NotSupported(
|
|
129
|
+
"DeleteUntracked with secondary indices not yet supported");
|
|
130
|
+
}
|
|
131
|
+
Status DeleteUntracked(ColumnFamilyHandle* /* column_family */,
|
|
132
|
+
const SliceParts& /* key */) override {
|
|
133
|
+
return Status::NotSupported(
|
|
134
|
+
"DeleteUntracked with secondary indices not yet supported");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
using Txn::SingleDeleteUntracked;
|
|
138
|
+
Status SingleDeleteUntracked(ColumnFamilyHandle* /* column_family */,
|
|
139
|
+
const Slice& /* key */) override {
|
|
140
|
+
return Status::NotSupported(
|
|
141
|
+
"SingleDeleteUntracked with secondary indices not yet supported");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private:
|
|
145
|
+
class IndexData {
|
|
146
|
+
public:
|
|
147
|
+
IndexData(const SecondaryIndex* index, const Slice& previous_column_value)
|
|
148
|
+
: index_(index), previous_column_value_(previous_column_value) {
|
|
149
|
+
assert(index_);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const SecondaryIndex* index() const { return index_; }
|
|
153
|
+
const Slice& previous_column_value() const {
|
|
154
|
+
return previous_column_value_;
|
|
155
|
+
}
|
|
156
|
+
std::optional<std::variant<Slice, std::string>>& updated_column_value() {
|
|
157
|
+
return updated_column_value_;
|
|
158
|
+
}
|
|
159
|
+
Slice primary_column_value() const {
|
|
160
|
+
return updated_column_value_.has_value() ? AsSlice(*updated_column_value_)
|
|
161
|
+
: previous_column_value_;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private:
|
|
165
|
+
const SecondaryIndex* index_;
|
|
166
|
+
Slice previous_column_value_;
|
|
167
|
+
std::optional<std::variant<Slice, std::string>> updated_column_value_;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
static Slice AsSlice(const std::variant<Slice, std::string>& var) {
|
|
171
|
+
return std::visit([](const auto& value) -> Slice { return value; }, var);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static std::string AsString(const std::variant<Slice, std::string>& var) {
|
|
175
|
+
return std::visit(
|
|
176
|
+
overload{
|
|
177
|
+
[](const Slice& value) -> std::string { return value.ToString(); },
|
|
178
|
+
[](const std::string& value) -> std::string { return value; }},
|
|
179
|
+
var);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
template <typename Iterator>
|
|
183
|
+
static Iterator FindPrimaryColumn(const SecondaryIndex* secondary_index,
|
|
184
|
+
ColumnFamilyHandle* column_family,
|
|
185
|
+
Iterator begin, Iterator end) {
|
|
186
|
+
assert(secondary_index);
|
|
187
|
+
assert(column_family);
|
|
188
|
+
|
|
189
|
+
if (column_family != secondary_index->GetPrimaryColumnFamily()) {
|
|
190
|
+
return end;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return WideColumnsHelper::Find(begin, end,
|
|
194
|
+
secondary_index->GetPrimaryColumnName());
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
template <typename Operation>
|
|
198
|
+
Status PerformWithSavePoint(Operation&& operation) {
|
|
199
|
+
Txn::SetSavePoint();
|
|
200
|
+
|
|
201
|
+
const Status s = operation();
|
|
202
|
+
|
|
203
|
+
if (!s.ok()) {
|
|
204
|
+
[[maybe_unused]] const Status st = Txn::RollbackToSavePoint();
|
|
205
|
+
assert(st.ok());
|
|
206
|
+
|
|
207
|
+
return s;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
[[maybe_unused]] const Status st = Txn::PopSavePoint();
|
|
211
|
+
assert(st.ok());
|
|
212
|
+
|
|
213
|
+
return Status::OK();
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
Status GetPrimaryEntryForUpdate(ColumnFamilyHandle* column_family,
|
|
217
|
+
const Slice& primary_key,
|
|
218
|
+
PinnableWideColumns* existing_primary_columns,
|
|
219
|
+
bool do_validate) {
|
|
220
|
+
assert(column_family);
|
|
221
|
+
assert(existing_primary_columns);
|
|
222
|
+
|
|
223
|
+
constexpr bool exclusive = true;
|
|
224
|
+
|
|
225
|
+
return Txn::GetEntityForUpdate(ReadOptions(), column_family, primary_key,
|
|
226
|
+
existing_primary_columns, exclusive,
|
|
227
|
+
do_validate);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
Status RemoveSecondaryEntry(const SecondaryIndex* secondary_index,
|
|
231
|
+
const Slice& primary_key,
|
|
232
|
+
const Slice& existing_primary_column_value) {
|
|
233
|
+
assert(secondary_index);
|
|
234
|
+
|
|
235
|
+
std::variant<Slice, std::string> secondary_key_prefix;
|
|
236
|
+
|
|
237
|
+
const Status s = secondary_index->GetSecondaryKeyPrefix(
|
|
238
|
+
primary_key, existing_primary_column_value, &secondary_key_prefix);
|
|
239
|
+
if (!s.ok()) {
|
|
240
|
+
return s;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const std::string secondary_key =
|
|
244
|
+
AsString(secondary_key_prefix) + primary_key.ToString();
|
|
245
|
+
|
|
246
|
+
return Txn::SingleDelete(secondary_index->GetSecondaryColumnFamily(),
|
|
247
|
+
secondary_key);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
Status AddPrimaryEntry(ColumnFamilyHandle* column_family,
|
|
251
|
+
const Slice& primary_key,
|
|
252
|
+
const WideColumns& primary_columns) {
|
|
253
|
+
assert(column_family);
|
|
254
|
+
|
|
255
|
+
constexpr bool assume_tracked = true;
|
|
256
|
+
|
|
257
|
+
return Txn::PutEntity(column_family, primary_key, primary_columns,
|
|
258
|
+
assume_tracked);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
Status AddSecondaryEntry(const SecondaryIndex* secondary_index,
|
|
262
|
+
const Slice& primary_key,
|
|
263
|
+
const Slice& primary_column_value,
|
|
264
|
+
const Slice& previous_column_value) {
|
|
265
|
+
assert(secondary_index);
|
|
266
|
+
|
|
267
|
+
std::variant<Slice, std::string> secondary_key_prefix;
|
|
268
|
+
|
|
269
|
+
{
|
|
270
|
+
const Status s = secondary_index->GetSecondaryKeyPrefix(
|
|
271
|
+
primary_key, primary_column_value, &secondary_key_prefix);
|
|
272
|
+
if (!s.ok()) {
|
|
273
|
+
return s;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
std::optional<std::variant<Slice, std::string>> secondary_value;
|
|
278
|
+
|
|
279
|
+
{
|
|
280
|
+
const Status s = secondary_index->GetSecondaryValue(
|
|
281
|
+
primary_key, primary_column_value, previous_column_value,
|
|
282
|
+
&secondary_value);
|
|
283
|
+
if (!s.ok()) {
|
|
284
|
+
return s;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
{
|
|
289
|
+
const std::string secondary_key =
|
|
290
|
+
AsString(secondary_key_prefix) + primary_key.ToString();
|
|
291
|
+
|
|
292
|
+
const Status s = Txn::Put(
|
|
293
|
+
secondary_index->GetSecondaryColumnFamily(), secondary_key,
|
|
294
|
+
secondary_value.has_value() ? AsSlice(*secondary_value) : Slice());
|
|
295
|
+
if (!s.ok()) {
|
|
296
|
+
return s;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return Status::OK();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
Status RemoveSecondaryEntries(ColumnFamilyHandle* column_family,
|
|
304
|
+
const Slice& primary_key, bool do_validate) {
|
|
305
|
+
assert(column_family);
|
|
306
|
+
|
|
307
|
+
PinnableWideColumns existing_primary_columns;
|
|
308
|
+
|
|
309
|
+
const Status s = GetPrimaryEntryForUpdate(
|
|
310
|
+
column_family, primary_key, &existing_primary_columns, do_validate);
|
|
311
|
+
if (s.IsNotFound()) {
|
|
312
|
+
return Status::OK();
|
|
313
|
+
}
|
|
314
|
+
if (!s.ok()) {
|
|
315
|
+
return s;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const auto& existing_columns = existing_primary_columns.columns();
|
|
319
|
+
|
|
320
|
+
for (const auto& secondary_index : *secondary_indices_) {
|
|
321
|
+
const auto it =
|
|
322
|
+
FindPrimaryColumn(secondary_index.get(), column_family,
|
|
323
|
+
existing_columns.cbegin(), existing_columns.cend());
|
|
324
|
+
if (it == existing_columns.cend()) {
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const Status st =
|
|
329
|
+
RemoveSecondaryEntry(secondary_index.get(), primary_key, it->value());
|
|
330
|
+
if (!st.ok()) {
|
|
331
|
+
return st;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return Status::OK();
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
Status UpdatePrimaryColumnValues(ColumnFamilyHandle* column_family,
|
|
339
|
+
const Slice& primary_key,
|
|
340
|
+
WideColumns& primary_columns,
|
|
341
|
+
autovector<IndexData>& applicable_indices) {
|
|
342
|
+
assert(applicable_indices.empty());
|
|
343
|
+
|
|
344
|
+
applicable_indices.reserve(secondary_indices_->size());
|
|
345
|
+
|
|
346
|
+
for (const auto& secondary_index : *secondary_indices_) {
|
|
347
|
+
const auto it =
|
|
348
|
+
FindPrimaryColumn(secondary_index.get(), column_family,
|
|
349
|
+
primary_columns.begin(), primary_columns.end());
|
|
350
|
+
if (it == primary_columns.end()) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
applicable_indices.emplace_back(
|
|
355
|
+
IndexData(secondary_index.get(), it->value()));
|
|
356
|
+
|
|
357
|
+
auto& index_data = applicable_indices.back();
|
|
358
|
+
|
|
359
|
+
const Status s = secondary_index->UpdatePrimaryColumnValue(
|
|
360
|
+
primary_key, index_data.previous_column_value(),
|
|
361
|
+
&index_data.updated_column_value());
|
|
362
|
+
if (!s.ok()) {
|
|
363
|
+
return s;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
it->value() = index_data.primary_column_value();
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return Status::OK();
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
Status AddSecondaryEntries(const Slice& primary_key,
|
|
373
|
+
const autovector<IndexData>& applicable_indices) {
|
|
374
|
+
for (const auto& index_data : applicable_indices) {
|
|
375
|
+
const Status s = AddSecondaryEntry(index_data.index(), primary_key,
|
|
376
|
+
index_data.primary_column_value(),
|
|
377
|
+
index_data.previous_column_value());
|
|
378
|
+
if (!s.ok()) {
|
|
379
|
+
return s;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return Status::OK();
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
Status PutEntityWithSecondaryIndices(ColumnFamilyHandle* column_family,
|
|
387
|
+
const Slice& key,
|
|
388
|
+
const WideColumns& columns,
|
|
389
|
+
bool do_validate) {
|
|
390
|
+
// TODO: we could avoid removing and recreating secondary entries for
|
|
391
|
+
// which neither the secondary key prefix nor the value has changed
|
|
392
|
+
|
|
393
|
+
if (!column_family) {
|
|
394
|
+
column_family = Txn::DefaultColumnFamily();
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const Slice& primary_key = key;
|
|
398
|
+
|
|
399
|
+
{
|
|
400
|
+
const Status s =
|
|
401
|
+
RemoveSecondaryEntries(column_family, primary_key, do_validate);
|
|
402
|
+
if (!s.ok()) {
|
|
403
|
+
return s;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
autovector<IndexData> applicable_indices;
|
|
408
|
+
|
|
409
|
+
WideColumns primary_columns(columns);
|
|
410
|
+
WideColumnsHelper::SortColumns(primary_columns);
|
|
411
|
+
|
|
412
|
+
{
|
|
413
|
+
const Status s = UpdatePrimaryColumnValues(
|
|
414
|
+
column_family, primary_key, primary_columns, applicable_indices);
|
|
415
|
+
if (!s.ok()) {
|
|
416
|
+
return s;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
{
|
|
421
|
+
const Status s =
|
|
422
|
+
AddPrimaryEntry(column_family, primary_key, primary_columns);
|
|
423
|
+
if (!s.ok()) {
|
|
424
|
+
return s;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
{
|
|
429
|
+
const Status s = AddSecondaryEntries(primary_key, applicable_indices);
|
|
430
|
+
if (!s.ok()) {
|
|
431
|
+
return s;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
return Status::OK();
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const std::vector<std::shared_ptr<SecondaryIndex>>* secondary_indices_;
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
} // namespace ROCKSDB_NAMESPACE
|
package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc
CHANGED
|
@@ -21,14 +21,29 @@ namespace ROCKSDB_NAMESPACE {
|
|
|
21
21
|
const std::string
|
|
22
22
|
CompactForTieringCollector::kNumEligibleLastLevelEntriesPropertyName =
|
|
23
23
|
"rocksdb.eligible.last.level.entries";
|
|
24
|
+
const std::string
|
|
25
|
+
CompactForTieringCollector::kAverageDataUnixWriteTimePropertyName =
|
|
26
|
+
"rocksdb.data.unix.write.time.average";
|
|
27
|
+
const std::string
|
|
28
|
+
CompactForTieringCollector::kMaxDataUnixWriteTimePropertyName =
|
|
29
|
+
"rocksdb.data.unix.write.time.max";
|
|
30
|
+
const std::string
|
|
31
|
+
CompactForTieringCollector::kMinDataUnixWriteTimePropertyName =
|
|
32
|
+
"rocksdb.data.unix.write.time.min";
|
|
33
|
+
const std::string
|
|
34
|
+
CompactForTieringCollector::kNumInfinitelyOldEntriesPropertyName =
|
|
35
|
+
"rocksdb.num.infinitely.old.entries";
|
|
24
36
|
|
|
25
37
|
CompactForTieringCollector::CompactForTieringCollector(
|
|
26
38
|
SequenceNumber last_level_inclusive_max_seqno_threshold,
|
|
27
|
-
double compaction_trigger_ratio)
|
|
39
|
+
double compaction_trigger_ratio, bool collect_data_age_stats)
|
|
28
40
|
: last_level_inclusive_max_seqno_threshold_(
|
|
29
41
|
last_level_inclusive_max_seqno_threshold),
|
|
30
|
-
compaction_trigger_ratio_(compaction_trigger_ratio)
|
|
42
|
+
compaction_trigger_ratio_(compaction_trigger_ratio),
|
|
43
|
+
collect_data_age_stats_(collect_data_age_stats) {
|
|
31
44
|
assert(last_level_inclusive_max_seqno_threshold_ != kMaxSequenceNumber);
|
|
45
|
+
// TODO(yuzhangyu): implement collect the data age stats.
|
|
46
|
+
(void)collect_data_age_stats_;
|
|
32
47
|
}
|
|
33
48
|
|
|
34
49
|
Status CompactForTieringCollector::AddUserKey(const Slice& /*key*/,
|
|
@@ -93,9 +108,11 @@ CompactForTieringCollectorFactory::CreateTablePropertiesCollector(
|
|
|
93
108
|
context.last_level_inclusive_max_seqno_threshold == kMaxSequenceNumber) {
|
|
94
109
|
return nullptr;
|
|
95
110
|
}
|
|
111
|
+
// TODO(yuzhangyu): pass actual value.
|
|
96
112
|
return new CompactForTieringCollector(
|
|
97
113
|
context.last_level_inclusive_max_seqno_threshold,
|
|
98
|
-
compaction_trigger_ratio
|
|
114
|
+
compaction_trigger_ratio,
|
|
115
|
+
/*collect_data_age_stats*/ false);
|
|
99
116
|
}
|
|
100
117
|
|
|
101
118
|
static std::unordered_map<std::string, OptionTypeInfo>
|
|
@@ -141,4 +158,18 @@ NewCompactForTieringCollectorFactory(double compaction_trigger_ratio) {
|
|
|
141
158
|
compaction_trigger_ratio);
|
|
142
159
|
}
|
|
143
160
|
|
|
161
|
+
Status GetDataCollectionUnixWriteTimeInfoForFile(
|
|
162
|
+
const std::shared_ptr<const TableProperties>& /* table_properties */,
|
|
163
|
+
std::unique_ptr<DataCollectionUnixWriteTimeInfo>* /* file_info */) {
|
|
164
|
+
return Status::NotSupported();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
Status GetDataCollectionUnixWriteTimeInfoForLevels(
|
|
168
|
+
const std::vector<std::unique_ptr<
|
|
169
|
+
TablePropertiesCollection>>& /* levels_table_properties */,
|
|
170
|
+
std::vector<
|
|
171
|
+
std::unique_ptr<DataCollectionUnixWriteTimeInfo>>* /* levels_info */) {
|
|
172
|
+
return Status::NotSupported();
|
|
173
|
+
}
|
|
174
|
+
|
|
144
175
|
} // namespace ROCKSDB_NAMESPACE
|
package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h
CHANGED
|
@@ -16,10 +16,14 @@ namespace ROCKSDB_NAMESPACE {
|
|
|
16
16
|
class CompactForTieringCollector : public TablePropertiesCollector {
|
|
17
17
|
public:
|
|
18
18
|
static const std::string kNumEligibleLastLevelEntriesPropertyName;
|
|
19
|
+
static const std::string kAverageDataUnixWriteTimePropertyName;
|
|
20
|
+
static const std::string kMaxDataUnixWriteTimePropertyName;
|
|
21
|
+
static const std::string kMinDataUnixWriteTimePropertyName;
|
|
22
|
+
static const std::string kNumInfinitelyOldEntriesPropertyName;
|
|
19
23
|
|
|
20
24
|
CompactForTieringCollector(
|
|
21
|
-
SequenceNumber
|
|
22
|
-
double compaction_trigger_ratio);
|
|
25
|
+
SequenceNumber last_level_inclusive_max_seqno_threshold,
|
|
26
|
+
double compaction_trigger_ratio, bool collect_data_age_stats);
|
|
23
27
|
|
|
24
28
|
Status AddUserKey(const Slice& key, const Slice& value, EntryType type,
|
|
25
29
|
SequenceNumber seq, uint64_t file_size) override;
|
|
@@ -41,5 +45,6 @@ class CompactForTieringCollector : public TablePropertiesCollector {
|
|
|
41
45
|
size_t total_entries_counter_ = 0;
|
|
42
46
|
bool finish_called_ = false;
|
|
43
47
|
bool need_compaction_ = false;
|
|
48
|
+
bool collect_data_age_stats_ = false;
|
|
44
49
|
};
|
|
45
50
|
} // namespace ROCKSDB_NAMESPACE
|