Skip to content

Commit f972d77

Browse files
author
Xingbo Wang
committed
Allow passing comparator in UDI (facebook#14001)
Summary: Pass the comparator to UDI interface for both reader and builder. Pull Request resolved: facebook#14001 Test Plan: Unit test Reviewed By: anand1976 Differential Revision: D83339943 Pulled By: xingbowang fbshipit-source-id: 7f6541776b0995260e28224329f0cca37f13b3d4
1 parent 9775409 commit f972d77

4 files changed

Lines changed: 342 additions & 345 deletions

File tree

include/rocksdb/user_defined_index.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ inline const std::string kUserDefinedIndexPrefix =
3030
//
3131
// This is currently supported only for a restricted set of use cases. The
3232
// CF must be ingest only, and only files containing Puts generated by
33-
// SstFileWriter are supported. The user_comparator used for the CF must
34-
// be BytewiseComparator.
33+
// SstFileWriter are supported.
3534

3635
// The interface for building user-defined index.
3736
class UserDefinedIndexBuilder {
@@ -145,6 +144,11 @@ class UserDefinedIndexReader {
145144
virtual size_t ApproximateMemoryUsage() const = 0;
146145
};
147146

147+
// Options for user defined index
148+
struct UserDefinedIndexOption {
149+
const Comparator* comparator = BytewiseComparator();
150+
};
151+
148152
// Factory for creating user-defined index builders.
149153
class UserDefinedIndexFactory : public Customizable {
150154
public:
@@ -163,6 +167,21 @@ class UserDefinedIndexFactory : public Customizable {
163167
// block
164168
virtual std::unique_ptr<UserDefinedIndexReader> NewReader(
165169
Slice& index_block) const = 0;
170+
171+
// New API for allowing customized comparator
172+
virtual Status NewBuilder(
173+
const UserDefinedIndexOption& /*option*/,
174+
std::unique_ptr<UserDefinedIndexBuilder>& builder) const {
175+
builder.reset(NewBuilder());
176+
return Status::OK();
177+
};
178+
179+
virtual Status NewReader(
180+
const UserDefinedIndexOption& /*option*/, Slice& index_block,
181+
std::unique_ptr<UserDefinedIndexReader>& reader) const {
182+
reader = NewReader(index_block);
183+
return Status::OK();
184+
};
166185
};
167186

168187
} // namespace ROCKSDB_NAMESPACE

table/block_based/block_based_table_builder.cc

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,13 +1191,20 @@ struct BlockBasedTableBuilder::Rep {
11911191
Status::InvalidArgument("user_defined_index_factory not supported "
11921192
"with parallel compression"));
11931193
} else {
1194-
std::unique_ptr<UserDefinedIndexBuilder> user_defined_index_builder(
1195-
table_options.user_defined_index_factory->NewBuilder());
1196-
if (user_defined_index_builder != nullptr) {
1197-
index_builder = std::make_unique<UserDefinedIndexBuilderWrapper>(
1198-
std::string(table_options.user_defined_index_factory->Name()),
1199-
std::move(index_builder), std::move(user_defined_index_builder),
1200-
&internal_comparator, ts_sz, persist_user_defined_timestamps);
1194+
std::unique_ptr<UserDefinedIndexBuilder> user_defined_index_builder;
1195+
UserDefinedIndexOption udi_options;
1196+
udi_options.comparator = internal_comparator.user_comparator();
1197+
auto s = table_options.user_defined_index_factory->NewBuilder(
1198+
udi_options, user_defined_index_builder);
1199+
if (!s.ok()) {
1200+
SetStatus(s);
1201+
} else {
1202+
if (user_defined_index_builder != nullptr) {
1203+
index_builder = std::make_unique<UserDefinedIndexBuilderWrapper>(
1204+
std::string(table_options.user_defined_index_factory->Name()),
1205+
std::move(index_builder), std::move(user_defined_index_builder),
1206+
&internal_comparator, ts_sz, persist_user_defined_timestamps);
1207+
}
12011208
}
12021209
}
12031210
}

table/block_based/block_based_table_reader.cc

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,15 +1369,20 @@ Status BlockBasedTable::PrefetchIndexAndFilterBlocks(
13691369
if (s.ok()) {
13701370
assert(!rep_->udi_block.IsEmpty());
13711371

1372-
std::unique_ptr<UserDefinedIndexReader> udi_reader =
1373-
table_options.user_defined_index_factory->NewReader(
1374-
rep_->udi_block.GetValue()->data);
1375-
if (udi_reader) {
1376-
index_reader = std::make_unique<UserDefinedIndexReaderWrapper>(
1377-
udi_name, std::move(index_reader), std::move(udi_reader));
1378-
} else {
1379-
s = Status::Corruption("Failed to create UDI reader for " + udi_name +
1380-
" in file " + rep_->file->file_name());
1372+
std::unique_ptr<UserDefinedIndexReader> udi_reader;
1373+
UserDefinedIndexOption udi_option;
1374+
udi_option.comparator = rep_->internal_comparator.user_comparator();
1375+
s = table_options.user_defined_index_factory->NewReader(
1376+
udi_option, rep_->udi_block.GetValue()->data, udi_reader);
1377+
if (s.ok()) {
1378+
if (udi_reader) {
1379+
index_reader = std::make_unique<UserDefinedIndexReaderWrapper>(
1380+
udi_name, std::move(index_reader), std::move(udi_reader));
1381+
} else {
1382+
s = Status::Corruption("Failed to create UDI reader for " +
1383+
udi_name + " in file " +
1384+
rep_->file->file_name());
1385+
}
13811386
}
13821387
}
13831388
}

0 commit comments

Comments
 (0)