mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-25 22:44:05 +00:00
d3a3b02134
Summary: When opening an SST file created using index_type=kHashSearch, the *current* prefix_extractor would be saved, and used with hash index if the *new current* prefix_extractor at query time is compatible with the SST file. This is a problem if the prefix_extractor at SST open time is not compatible but SetOptions later changes (back) to one that is compatible. This change fixes that by using the known compatible (or missing) prefix extractor we save for use with prefix filtering. Detail: I have moved the InternalKeySliceTransform wrapper to avoid some indirection and remove unnecessary fields. Pull Request resolved: https://github.com/facebook/rocksdb/pull/10128 Test Plan: expanded unit test (using some logic from https://github.com/facebook/rocksdb/issues/10122) that fails before fix and probably covers some other previously uncovered cases. Reviewed By: siying Differential Revision: D36955738 Pulled By: pdillinger fbshipit-source-id: 0c78a6b0d24054ef2f3cb237bf010c1c5589fb10
71 lines
2.3 KiB
C++
71 lines
2.3 KiB
C++
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under both the GPLv2 (found in the
|
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
// (found in the LICENSE.Apache file in the root directory).
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "db/dbformat.h"
|
|
#include "rocksdb/status.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
class Comparator;
|
|
class Iterator;
|
|
class Slice;
|
|
class SliceTransform;
|
|
|
|
// Build a hash-based index to speed up the lookup for "index block".
|
|
// BlockHashIndex accepts a key and, if found, returns its restart index within
|
|
// that index block.
|
|
class BlockPrefixIndex {
|
|
public:
|
|
// Maps a key to a list of data blocks that could potentially contain
|
|
// the key, based on the prefix.
|
|
// Returns the total number of relevant blocks, 0 means the key does
|
|
// not exist.
|
|
uint32_t GetBlocks(const Slice& key, uint32_t** blocks);
|
|
|
|
size_t ApproximateMemoryUsage() const {
|
|
return sizeof(BlockPrefixIndex) +
|
|
(num_block_array_buffer_entries_ + num_buckets_) * sizeof(uint32_t);
|
|
}
|
|
|
|
// Create hash index by reading from the metadata blocks.
|
|
// Note: table reader (caller) is responsible for keeping shared_ptr to
|
|
// underlying prefix extractor
|
|
// @params prefixes: a sequence of prefixes.
|
|
// @params prefix_meta: contains the "metadata" to of the prefixes.
|
|
static Status Create(const SliceTransform* hash_key_extractor,
|
|
const Slice& prefixes, const Slice& prefix_meta,
|
|
BlockPrefixIndex** prefix_index);
|
|
|
|
~BlockPrefixIndex() {
|
|
delete[] buckets_;
|
|
delete[] block_array_buffer_;
|
|
}
|
|
|
|
private:
|
|
class Builder;
|
|
friend Builder;
|
|
|
|
BlockPrefixIndex(const SliceTransform* prefix_extractor, uint32_t num_buckets,
|
|
uint32_t* buckets, uint32_t num_block_array_buffer_entries,
|
|
uint32_t* block_array_buffer)
|
|
: internal_prefix_extractor_(prefix_extractor),
|
|
num_buckets_(num_buckets),
|
|
num_block_array_buffer_entries_(num_block_array_buffer_entries),
|
|
buckets_(buckets),
|
|
block_array_buffer_(block_array_buffer) {}
|
|
|
|
InternalKeySliceTransform internal_prefix_extractor_;
|
|
|
|
uint32_t num_buckets_;
|
|
uint32_t num_block_array_buffer_entries_;
|
|
uint32_t* buckets_;
|
|
uint32_t* block_array_buffer_;
|
|
};
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|