}
}
+TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFUnsorted) {
+ Options options = CurrentOptions();
+ CreateAndReopenWithCF({"one", "two"}, options);
+
+ ASSERT_OK(Put(1, "foo", "bar"));
+ ASSERT_OK(Put(2, "baz", "xyz"));
+ ASSERT_OK(Put(1, "abc", "def"));
+
+ // Note: keys for the same CF do not form a consecutive range
+ std::vector<int> cfs{1, 2, 1};
+ std::vector<std::string> keys{"foo", "baz", "abc"};
+ std::vector<std::string> values;
+
+ values =
+ MultiGet(cfs, keys, /* snapshot */ nullptr, /* batched */ GetParam());
+
+ ASSERT_EQ(values.size(), 3);
+ ASSERT_EQ(values[0], "bar");
+ ASSERT_EQ(values[1], "xyz");
+ ASSERT_EQ(values[2], "def");
+}
+
INSTANTIATE_TEST_CASE_P(DBMultiGetTestWithParam, DBMultiGetTestWithParam,
testing::Bool());
multiget_cf_data;
size_t cf_start = 0;
ColumnFamilyHandle* cf = sorted_keys[0]->column_family;
+
for (size_t i = 0; i < num_keys; ++i) {
KeyContext* key_ctx = sorted_keys[i];
if (key_ctx->column_family != cf) {
- multiget_cf_data.emplace_back(
- MultiGetColumnFamilyData(cf, cf_start, i - cf_start, nullptr));
+ multiget_cf_data.emplace_back(cf, cf_start, i - cf_start, nullptr);
cf_start = i;
cf = key_ctx->column_family;
}
}
- {
- // multiget_cf_data.emplace_back(
- // MultiGetColumnFamilyData(cf, cf_start, num_keys - cf_start, nullptr));
- multiget_cf_data.emplace_back(cf, cf_start, num_keys - cf_start, nullptr);
- }
+
+ multiget_cf_data.emplace_back(cf, cf_start, num_keys - cf_start, nullptr);
+
std::function<MultiGetColumnFamilyData*(
autovector<MultiGetColumnFamilyData,
MultiGetContext::MAX_BATCH_SIZE>::iterator&)>
static_cast<ColumnFamilyHandleImpl*>(lhs->column_family);
uint32_t cfd_id1 = cfh->cfd()->GetID();
const Comparator* comparator = cfh->cfd()->user_comparator();
- cfh = static_cast<ColumnFamilyHandleImpl*>(lhs->column_family);
+ cfh = static_cast<ColumnFamilyHandleImpl*>(rhs->column_family);
uint32_t cfd_id2 = cfh->cfd()->GetID();
if (cfd_id1 < cfd_id2) {
void DBImpl::PrepareMultiGetKeys(
size_t num_keys, bool sorted_input,
autovector<KeyContext*, MultiGetContext::MAX_BATCH_SIZE>* sorted_keys) {
-#ifndef NDEBUG
if (sorted_input) {
- for (size_t index = 0; index < sorted_keys->size(); ++index) {
- if (index > 0) {
- KeyContext* lhs = (*sorted_keys)[index - 1];
- KeyContext* rhs = (*sorted_keys)[index];
- ColumnFamilyHandleImpl* cfh =
- static_cast_with_check<ColumnFamilyHandleImpl>(lhs->column_family);
- uint32_t cfd_id1 = cfh->cfd()->GetID();
- const Comparator* comparator = cfh->cfd()->user_comparator();
- cfh =
- static_cast_with_check<ColumnFamilyHandleImpl>(lhs->column_family);
- uint32_t cfd_id2 = cfh->cfd()->GetID();
-
- assert(cfd_id1 <= cfd_id2);
- if (cfd_id1 < cfd_id2) {
- continue;
- }
+#ifndef NDEBUG
+ CompareKeyContext key_context_less;
- // Both keys are from the same column family
- int cmp = comparator->CompareWithoutTimestamp(
- *(lhs->key), /*a_has_ts=*/false, *(rhs->key), /*b_has_ts=*/false);
- assert(cmp <= 0);
- }
- index++;
+ for (size_t index = 1; index < sorted_keys->size(); ++index) {
+ const KeyContext* const lhs = (*sorted_keys)[index - 1];
+ const KeyContext* const rhs = (*sorted_keys)[index];
+
+ // lhs should be <= rhs, or in other words, rhs should NOT be < lhs
+ assert(!key_context_less(rhs, lhs));
}
- }
#endif
- if (!sorted_input) {
- CompareKeyContext sort_comparator;
- std::sort(sorted_keys->begin(), sorted_keys->begin() + num_keys,
- sort_comparator);
+
+ return;
}
+
+ std::sort(sorted_keys->begin(), sorted_keys->begin() + num_keys,
+ CompareKeyContext());
}
void DBImpl::MultiGet(const ReadOptions& read_options,