struct FilePickerContext;
public:
- FilePickerMultiGet(std::vector<FileMetaData*>* files, MultiGetRange* range,
+ FilePickerMultiGet(MultiGetRange* range,
autovector<LevelFilesBrief>* file_levels,
unsigned int num_levels, FileIndexer* file_indexer,
const Comparator* user_comparator,
maybe_repeat_key_(false),
current_level_range_(*range, range->begin(), range->end()),
current_file_range_(*range, range->begin(), range->end()),
-#ifndef NDEBUG
- files_(files),
-#endif
level_files_brief_(file_levels),
is_hit_file_last_in_level_(false),
curr_file_level_(nullptr),
file_indexer_(file_indexer),
user_comparator_(user_comparator),
internal_comparator_(internal_comparator) {
-#ifdef NDEBUG
- (void)files;
-#endif
for (auto iter = range_->begin(); iter != range_->end(); ++iter) {
fp_ctx_array_[iter.index()] =
FilePickerContext(0, FileIndexer::kLevelMaxIndex);
} else {
file_hit = true;
}
-#ifndef NDEBUG
- // Sanity check to make sure that the files are correctly sorted
- if (f != prev_file_) {
- if (prev_file_) {
- if (curr_level_ != 0) {
- int comp_sign = internal_comparator_->Compare(
- prev_file_->largest_key, f->smallest_key);
- assert(comp_sign < 0);
- } else if (fp_ctx.curr_index_in_curr_level > 0) {
- // level == 0, the current file cannot be newer than the previous
- // one. Use compressed data structure, has no attribute seqNo
- assert(!NewestFirstBySeqNo(
- files_[0][fp_ctx.curr_index_in_curr_level],
- files_[0][fp_ctx.curr_index_in_curr_level - 1]));
- }
- }
- prev_file_ = f;
- }
-#endif
if (cmp_largest == 0) {
// cmp_largest is 0, which means the next key will not be in this
// file, so stop looking further. Also don't increment megt_iter_
bool maybe_repeat_key_;
MultiGetRange current_level_range_;
MultiGetRange current_file_range_;
-#ifndef NDEBUG
- std::vector<FileMetaData*>* files_;
-#endif
autovector<LevelFilesBrief>* level_files_brief_;
bool search_ended_;
bool is_hit_file_last_in_level_;
FileIndexer* file_indexer_;
const Comparator* user_comparator_;
const InternalKeyComparator* internal_comparator_;
-#ifndef NDEBUG
- FdWithKeyRange* prev_file_;
-#endif
// Setup local variables to search next level.
// Returns false if there are no more levels to search.
MultiGetRange::Iterator mget_iter = current_level_range_.begin();
if (fp_ctx_array_[mget_iter.index()].curr_index_in_curr_level <
curr_file_level_->num_files) {
-#ifndef NDEBUG
- prev_file_ = nullptr;
-#endif
batch_iter_prev_ = current_level_range_.begin();
batch_iter_ = current_level_range_.begin();
return true;
fp_ctx.curr_index_in_curr_level = start_index;
}
if (level_contains_keys) {
-#ifndef NDEBUG
- prev_file_ = nullptr;
-#endif
batch_iter_prev_ = current_level_range_.begin();
batch_iter_ = current_level_range_.begin();
return true;
MultiGetRange file_picker_range(*range, range->begin(), range->end());
FilePickerMultiGet fp(
- storage_info_.files_, &file_picker_range,
+ &file_picker_range,
&storage_info_.level_files_brief_, storage_info_.num_non_empty_levels_,
&storage_info_.file_indexer_, user_comparator(), internal_comparator());
FdWithKeyRange* f = fp.GetNextFile();
const ReadOptions& readoptions,
const std::vector<int>& rand_column_families,
const std::vector<int64_t>& rand_keys) {
- int num_keys = rand_keys.size();
- std::vector<Status> statuses(num_keys);
- std::string keys[10] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
- for (int key = 0; key < 10; ++key) {
+ size_t num_keys = rand_keys.size();
+ std::vector<Status> ret_status(num_keys);
+ std::array<std::string, 10> keys = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
+ size_t num_prefixes = keys.size();
+ for (size_t rand_key = 0; rand_key < num_keys; ++rand_key) {
std::vector<Slice> key_slices;
- std::vector<PinnableSlice> values(num_keys);
+ std::vector<PinnableSlice> values(num_prefixes);
+ std::vector<Status> statuses(num_prefixes);
ReadOptions readoptionscopy = readoptions;
readoptionscopy.snapshot = db_->GetSnapshot();
std::vector<std::string> key_str;
- key_str.reserve(num_keys);
- key_slices.reserve(num_keys);
+ key_str.reserve(num_prefixes);
+ key_slices.reserve(num_prefixes);
std::string from_db;
ColumnFamilyHandle* cfh = column_families_[rand_column_families[0]];
- for (int rand_key = 0; rand_key < num_keys; ++rand_key) {
+ for (size_t key = 0; key < num_prefixes; ++key) {
key_str.emplace_back(keys[key] + Key(rand_keys[rand_key]));
key_slices.emplace_back(key_str.back());
}
- db_->MultiGet(readoptionscopy, cfh, num_keys, key_slices.data(),
+ db_->MultiGet(readoptionscopy, cfh, num_prefixes, key_slices.data(),
values.data(), statuses.data());
- for (int i = 0; i < num_keys; i++) {
+ for (size_t i = 0; i < num_prefixes; i++) {
Status s = statuses[i];
if (!s.ok() && !s.IsNotFound()) {
fprintf(stderr, "get error: %s\n", s.ToString().c_str());
thread->stats.AddErrors(1);
+ ret_status[rand_key] = s;
// we continue after error rather than exiting so that we can
// find more errors if any
} else if (s.IsNotFound()) {
thread->stats.AddGets(1, 0);
+ ret_status[rand_key] = s;
} else {
- char expected_prefix = (keys[key])[0];
+ char expected_prefix = (keys[i])[0];
char actual_prefix = (values[i])[0];
if (actual_prefix != expected_prefix) {
fprintf(stderr, "error expected prefix = %c actual = %c\n",
db_->ReleaseSnapshot(readoptionscopy.snapshot);
// Now that we retrieved all values, check that they all match
- for (int i = 1; i < num_keys; i++) {
+ for (size_t i = 1; i < num_prefixes; i++) {
if (values[i] != values[0]) {
fprintf(stderr, "error : inconsistent values for key %s: %s, %s\n",
key_str[i].c_str(),
}
}
- return statuses;
+ return ret_status;
}
// Given a key, this does prefix scans for "0"+P, "1"+P,..."9"+P