Skip to content

Commit 833a226

Browse files
ltamasifacebook-github-bot
authored andcommitted
Expose a simple secondary index implementation (facebook#13370)
Summary: Pull Request resolved: facebook#13370 We have a class called `DefaultSecondaryIndex` in `TransactionTest.SecondaryIndexPutDelete` that contains generally useful functionality. The patch generalizes it a bit to make the column name configurable, renames it to `SimpleSecondaryIndex`, and moves it to the public API so applications can use it. Reviewed By: jowlyzhang Differential Revision: D69147890 fbshipit-source-id: 0d2d1cc5adcde01f3978a450ec841c9e990d2170
1 parent ed2a87d commit 833a226

File tree

7 files changed

+143
-68
lines changed

7 files changed

+143
-68
lines changed

BUCK

+1
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
318318
"utilities/persistent_cache/persistent_cache_tier.cc",
319319
"utilities/persistent_cache/volatile_tier_impl.cc",
320320
"utilities/secondary_index/secondary_index_iterator.cc",
321+
"utilities/secondary_index/simple_secondary_index.cc",
321322
"utilities/simulator_cache/cache_simulator.cc",
322323
"utilities/simulator_cache/sim_cache.cc",
323324
"utilities/table_properties_collectors/compact_for_tiering_collector.cc",

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ set(SOURCES
940940
utilities/persistent_cache/persistent_cache_tier.cc
941941
utilities/persistent_cache/volatile_tier_impl.cc
942942
utilities/secondary_index/secondary_index_iterator.cc
943+
utilities/secondary_index/simple_secondary_index.cc
943944
utilities/simulator_cache/cache_simulator.cc
944945
utilities/simulator_cache/sim_cache.cc
945946
utilities/table_properties_collectors/compact_for_tiering_collector.cc
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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+
11+
#include "rocksdb/rocksdb_namespace.h"
12+
#include "rocksdb/utilities/secondary_index.h"
13+
14+
namespace ROCKSDB_NAMESPACE {
15+
16+
// EXPERIMENTAL
17+
//
18+
// A simple secondary index implementation that indexes the specified column
19+
// as-is.
20+
21+
class SimpleSecondaryIndex : public SecondaryIndex {
22+
public:
23+
explicit SimpleSecondaryIndex(std::string primary_column_name);
24+
25+
void SetPrimaryColumnFamily(ColumnFamilyHandle* column_family) override;
26+
void SetSecondaryColumnFamily(ColumnFamilyHandle* column_family) override;
27+
28+
ColumnFamilyHandle* GetPrimaryColumnFamily() const override;
29+
ColumnFamilyHandle* GetSecondaryColumnFamily() const override;
30+
31+
Slice GetPrimaryColumnName() const override;
32+
33+
Status UpdatePrimaryColumnValue(
34+
const Slice& primary_key, const Slice& primary_column_value,
35+
std::optional<std::variant<Slice, std::string>>* updated_column_value)
36+
const override;
37+
38+
Status GetSecondaryKeyPrefix(
39+
const Slice& primary_key, const Slice& primary_column_value,
40+
std::variant<Slice, std::string>* secondary_key_prefix) const override;
41+
42+
Status FinalizeSecondaryKeyPrefix(
43+
std::variant<Slice, std::string>* secondary_key_prefix) const override;
44+
45+
Status GetSecondaryValue(const Slice& primary_key,
46+
const Slice& primary_column_value,
47+
const Slice& original_column_value,
48+
std::optional<std::variant<Slice, std::string>>*
49+
secondary_value) const override;
50+
51+
private:
52+
std::string primary_column_name_;
53+
ColumnFamilyHandle* primary_column_family_{};
54+
ColumnFamilyHandle* secondary_column_family_{};
55+
};
56+
57+
} // namespace ROCKSDB_NAMESPACE

src.mk

+1
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ LIB_SOURCES = \
305305
utilities/persistent_cache/persistent_cache_tier.cc \
306306
utilities/persistent_cache/volatile_tier_impl.cc \
307307
utilities/secondary_index/secondary_index_iterator.cc \
308+
utilities/secondary_index/simple_secondary_index.cc \
308309
utilities/simulator_cache/cache_simulator.cc \
309310
utilities/simulator_cache/sim_cache.cc \
310311
utilities/table_properties_collectors/compact_for_tiering_collector.cc \
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Experimental feature: added support for simple secondary indices that index the specified column as-is. See `SimpleSecondaryIndex` and `SecondaryIndex` for more details.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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 <cassert>
7+
8+
#include "rocksdb/utilities/secondary_index_simple.h"
9+
#include "util/coding.h"
10+
#include "utilities/secondary_index/secondary_index_helper.h"
11+
12+
namespace ROCKSDB_NAMESPACE {
13+
14+
SimpleSecondaryIndex::SimpleSecondaryIndex(std::string primary_column_name)
15+
: primary_column_name_(std::move(primary_column_name)) {}
16+
17+
void SimpleSecondaryIndex::SetPrimaryColumnFamily(
18+
ColumnFamilyHandle* column_family) {
19+
assert(column_family);
20+
primary_column_family_ = column_family;
21+
}
22+
23+
void SimpleSecondaryIndex::SetSecondaryColumnFamily(
24+
ColumnFamilyHandle* column_family) {
25+
assert(column_family);
26+
secondary_column_family_ = column_family;
27+
}
28+
29+
ColumnFamilyHandle* SimpleSecondaryIndex::GetPrimaryColumnFamily() const {
30+
return primary_column_family_;
31+
}
32+
33+
ColumnFamilyHandle* SimpleSecondaryIndex::GetSecondaryColumnFamily() const {
34+
return secondary_column_family_;
35+
}
36+
37+
Slice SimpleSecondaryIndex::GetPrimaryColumnName() const {
38+
return primary_column_name_;
39+
}
40+
41+
Status SimpleSecondaryIndex::UpdatePrimaryColumnValue(
42+
const Slice& /* primary_key */, const Slice& /* primary_column_value */,
43+
std::optional<std::variant<Slice, std::string>>* /* updated_column_value */)
44+
const {
45+
return Status::OK();
46+
}
47+
48+
Status SimpleSecondaryIndex::GetSecondaryKeyPrefix(
49+
const Slice& /* primary_key */, const Slice& primary_column_value,
50+
std::variant<Slice, std::string>* secondary_key_prefix) const {
51+
assert(secondary_key_prefix);
52+
53+
*secondary_key_prefix = primary_column_value;
54+
55+
return Status::OK();
56+
}
57+
58+
Status SimpleSecondaryIndex::FinalizeSecondaryKeyPrefix(
59+
std::variant<Slice, std::string>* secondary_key_prefix) const {
60+
assert(secondary_key_prefix);
61+
62+
std::string prefix;
63+
PutLengthPrefixedSlice(&prefix,
64+
SecondaryIndexHelper::AsSlice(*secondary_key_prefix));
65+
66+
*secondary_key_prefix = std::move(prefix);
67+
68+
return Status::OK();
69+
}
70+
71+
Status SimpleSecondaryIndex::GetSecondaryValue(
72+
const Slice& /* primary_key */, const Slice& /* primary_column_value */,
73+
const Slice& /* original_column_value */,
74+
std::optional<std::variant<Slice, std::string>>* /* secondary_value */)
75+
const {
76+
return Status::OK();
77+
}
78+
79+
} // namespace ROCKSDB_NAMESPACE

utilities/transactions/transaction_test.cc

+3-68
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "rocksdb/options.h"
2020
#include "rocksdb/perf_context.h"
2121
#include "rocksdb/utilities/secondary_index.h"
22+
#include "rocksdb/utilities/secondary_index_simple.h"
2223
#include "rocksdb/utilities/transaction.h"
2324
#include "rocksdb/utilities/transaction_db.h"
2425
#include "table/mock_table.h"
@@ -8015,75 +8016,9 @@ TEST_P(TransactionTest, SecondaryIndexPutDelete) {
80158016
return;
80168017
}
80178018

8018-
// A basic secondary index that indexes the default column.
8019-
class DefaultSecondaryIndex : public SecondaryIndex {
8020-
public:
8021-
void SetPrimaryColumnFamily(ColumnFamilyHandle* cfh) override {
8022-
primary_cfh_ = cfh;
8023-
}
8024-
8025-
void SetSecondaryColumnFamily(ColumnFamilyHandle* cfh) override {
8026-
secondary_cfh_ = cfh;
8027-
}
8028-
8029-
ColumnFamilyHandle* GetPrimaryColumnFamily() const override {
8030-
return primary_cfh_;
8031-
}
8032-
8033-
ColumnFamilyHandle* GetSecondaryColumnFamily() const override {
8034-
return secondary_cfh_;
8035-
}
8036-
8037-
Slice GetPrimaryColumnName() const override {
8038-
return kDefaultWideColumnName;
8039-
}
8040-
8041-
Status UpdatePrimaryColumnValue(
8042-
const Slice& /* primary_key */, const Slice& /* primary_column_value */,
8043-
std::optional<
8044-
std::variant<Slice, std::string>>* /* updated_column_value */)
8045-
const override {
8046-
return Status::OK();
8047-
}
8048-
8049-
Status GetSecondaryKeyPrefix(
8050-
const Slice& /* primary_key */, const Slice& primary_column_value,
8051-
std::variant<Slice, std::string>* secondary_key_prefix) const override {
8052-
assert(secondary_key_prefix);
8053-
8054-
*secondary_key_prefix = primary_column_value;
8055-
8056-
return Status::OK();
8057-
}
8058-
8059-
Status FinalizeSecondaryKeyPrefix(
8060-
std::variant<Slice, std::string>* secondary_key_prefix) const override {
8061-
assert(secondary_key_prefix);
8062-
8063-
std::string prefix;
8064-
PutLengthPrefixedSlice(
8065-
&prefix, SecondaryIndexHelper::AsSlice(*secondary_key_prefix));
8066-
8067-
*secondary_key_prefix = std::move(prefix);
8068-
8069-
return Status::OK();
8070-
}
8071-
8072-
Status GetSecondaryValue(const Slice& /* primary_key */,
8073-
const Slice& /* primary_column_value */,
8074-
const Slice& /* previous_column_value */,
8075-
std::optional<std::variant<Slice, std::string>>*
8076-
/* secondary_value */) const override {
8077-
return Status::OK();
8078-
}
8079-
8080-
private:
8081-
ColumnFamilyHandle* primary_cfh_{};
8082-
ColumnFamilyHandle* secondary_cfh_{};
8083-
};
8084-
80858019
txn_db_options.secondary_indices.emplace_back(
8086-
std::make_shared<DefaultSecondaryIndex>());
8020+
std::make_shared<SimpleSecondaryIndex>(
8021+
kDefaultWideColumnName.ToString()));
80878022

80888023
ASSERT_OK(ReOpen());
80898024

0 commit comments

Comments
 (0)