mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-27 11:43:49 +00:00
d34712e0ac
Summary: Continuing from the previous MultiCfIterator Implementations - (https://github.com/facebook/rocksdb/issues/12422, https://github.com/facebook/rocksdb/issues/12480 #12465), this PR completes the `AttributeGroupIterator` by implementing `AttributeGroupIteratorImpl::AddToAttributeGroups()`. While implementing the `AttributeGroupIterator`, we had to make some changes in `MultiCfIteratorImpl` and found an opportunity to improve `Coalesce()` in `CoalescingIterator`. Lifting `UNDER CONSTRUCTION - DO NOT USE` comment by replacing it with `EXPERIMENTAL` Here are some implementation details: - `IteratorAttributeGroups` is introduced to avoid having to copy all `WideColumn` objects during iteration. - `PopulateIterator()` no longer advances non-top iterators that have the same key as the top iterator in the heap. - `AdvanceIterator()` needs to advance the non-top iterators when they have the same key as the top iterator in the heap. - Instead of populating one by one, `PopulateIterator()` now collects all items with the same key and calls `populate_func(items)` at once. - This allowed optimization in `Coalesce()` such that we no longer do K-1 rounds of 2-way merge, but do one K-way merge instead. Pull Request resolved: https://github.com/facebook/rocksdb/pull/12534 Test Plan: Uncommented the assertions in `verifyAttributeGroupIterator()` ``` ./multi_cf_iterator_test ``` Reviewed By: ltamasi Differential Revision: D56089019 Pulled By: jaykorean fbshipit-source-id: 6b0b4247e221f69b40b147d41492008cc9b15054
48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
// 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).
|
|
|
|
#include "db/coalescing_iterator.h"
|
|
|
|
#include "db/wide/wide_columns_helper.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
void CoalescingIterator::Coalesce(
|
|
const autovector<MultiCfIteratorInfo>& items) {
|
|
assert(wide_columns_.empty());
|
|
MinHeap heap;
|
|
for (const auto& item : items) {
|
|
assert(item.iterator);
|
|
for (auto& column : item.iterator->columns()) {
|
|
heap.push(WideColumnWithOrder{&column, item.order});
|
|
}
|
|
}
|
|
if (heap.empty()) {
|
|
return;
|
|
}
|
|
wide_columns_.reserve(heap.size());
|
|
auto current = heap.top();
|
|
heap.pop();
|
|
while (!heap.empty()) {
|
|
int comparison = current.column->name().compare(heap.top().column->name());
|
|
if (comparison < 0) {
|
|
wide_columns_.push_back(*current.column);
|
|
} else if (comparison > 0) {
|
|
// Shouldn't reach here.
|
|
// Current item in the heap is greater than the top item in the min heap
|
|
assert(false);
|
|
}
|
|
current = heap.top();
|
|
heap.pop();
|
|
}
|
|
wide_columns_.push_back(*current.column);
|
|
|
|
if (WideColumnsHelper::HasDefaultColumn(wide_columns_)) {
|
|
value_ = WideColumnsHelper::GetDefaultColumn(wide_columns_);
|
|
}
|
|
}
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|