Skip to content

Commit

Permalink
Merge pull request facebook#923 from petermattis/pmattis/prefix-may-m…
Browse files Browse the repository at this point in the history
…atch

Fix index seeking in BlockTableReader::PrefixMayMatch.
  • Loading branch information
igorcanadi committed Jan 6, 2016
2 parents da03249 + 260c297 commit ba83447
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
2 changes: 1 addition & 1 deletion table/block_based_table_reader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1122,7 +1122,7 @@ bool BlockBasedTable::PrefixMayMatch(const Slice& internal_key) {
assert(rep_->ioptions.prefix_extractor != nullptr);
auto prefix = rep_->ioptions.prefix_extractor->Transform(
ExtractUserKey(internal_key));
InternalKey internal_key_prefix(prefix, 0, kTypeValue);
InternalKey internal_key_prefix(prefix, kMaxSequenceNumber, kTypeValue);
auto internal_prefix = internal_key_prefix.Encode();

bool may_match = true;
Expand Down
34 changes: 34 additions & 0 deletions table/table_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,40 @@ TEST_F(BlockBasedTableTest, TotalOrderSeekOnHashIndex) {
}
}

TEST_F(BlockBasedTableTest, NoopTransformSeek) {
BlockBasedTableOptions table_options;
table_options.filter_policy.reset(NewBloomFilterPolicy(10));

Options options;
options.comparator = BytewiseComparator();
options.table_factory.reset(new BlockBasedTableFactory(table_options));
options.prefix_extractor.reset(NewNoopTransform());

TableConstructor c(options.comparator);
// To tickle the PrefixMayMatch bug it is important that the
// user-key is a single byte so that the index key exactly matches
// the user-key.
InternalKey key("a", 1, kTypeValue);
c.Add(key.Encode().ToString(), "b");
std::vector<std::string> keys;
stl_wrappers::KVMap kvmap;
const ImmutableCFOptions ioptions(options);
c.Finish(options, ioptions, table_options,
InternalKeyComparator(options.comparator), &keys, &kvmap);

auto* reader = c.GetTableReader();
for (int i = 0; i < 2; ++i) {
ReadOptions ro;
ro.total_order_seek = (i == 0);
std::unique_ptr<InternalIterator> iter(reader->NewIterator(ro));

iter->Seek(key.Encode());
ASSERT_OK(iter->status());
ASSERT_TRUE(iter->Valid());
ASSERT_EQ("a", ExtractUserKey(iter->key()).ToString());
}
}

static std::string RandomString(Random* rnd, int len) {
std::string r;
test::RandomString(rnd, len, &r);
Expand Down

0 comments on commit ba83447

Please sign in to comment.