Coverage Report

Created: 2026-08-14 08:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rocksdb/db/multi_cf_iterator_impl.h
Line
Count
Source
1
//  Copyright (c) Meta Platforms, Inc. and affiliates.
2
//  This source code is licensed under both the GPLv2 (found in the
3
//  COPYING file in the root directory) and Apache 2.0 License
4
//  (found in the LICENSE.Apache file in the root directory).
5
6
#pragma once
7
8
#include <functional>
9
#include <variant>
10
11
#include "rocksdb/comparator.h"
12
#include "rocksdb/iterator.h"
13
#include "rocksdb/options.h"
14
#include "util/heap.h"
15
16
namespace ROCKSDB_NAMESPACE {
17
18
struct MultiCfIteratorInfo {
19
  ColumnFamilyHandle* cfh;
20
  Iterator* iterator;
21
  int order;
22
};
23
24
template <typename ResetFunc, typename PopulateFunc>
25
class MultiCfIteratorImpl {
26
 public:
27
  MultiCfIteratorImpl(
28
      const ReadOptions& read_options, const Comparator* comparator,
29
      std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>&&
30
          cfh_iter_pairs,
31
      ResetFunc reset_func, PopulateFunc populate_func)
32
0
      : allow_unprepared_value_(read_options.allow_unprepared_value),
33
0
        comparator_(comparator),
34
0
        cfh_iter_pairs_(std::move(cfh_iter_pairs)),
35
0
        reset_func_(std::move(reset_func)),
36
0
        populate_func_(std::move(populate_func)),
37
0
        heap_(MultiCfMinHeap(
38
0
            MultiCfHeapItemComparator<std::greater<int>>(comparator_))) {}
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfIteratorImpl(rocksdb::ReadOptions const&, rocksdb::Comparator const*, std::__1::vector<std::__1::pair<rocksdb::ColumnFamilyHandle*, std::__1::unique_ptr<rocksdb::Iterator, std::__1::default_delete<rocksdb::Iterator> > >, std::__1::allocator<std::__1::pair<rocksdb::ColumnFamilyHandle*, std::__1::unique_ptr<rocksdb::Iterator, std::__1::default_delete<rocksdb::Iterator> > > > >&&, rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc)
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfIteratorImpl(rocksdb::ReadOptions const&, rocksdb::Comparator const*, std::__1::vector<std::__1::pair<rocksdb::ColumnFamilyHandle*, std::__1::unique_ptr<rocksdb::Iterator, std::__1::default_delete<rocksdb::Iterator> > >, std::__1::allocator<std::__1::pair<rocksdb::ColumnFamilyHandle*, std::__1::unique_ptr<rocksdb::Iterator, std::__1::default_delete<rocksdb::Iterator> > > > >&&, rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc)
39
0
  ~MultiCfIteratorImpl() { status_.PermitUncheckedError(); }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::~MultiCfIteratorImpl()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::~MultiCfIteratorImpl()
40
41
  // No copy allowed
42
  MultiCfIteratorImpl(const MultiCfIteratorImpl&) = delete;
43
  MultiCfIteratorImpl& operator=(const MultiCfIteratorImpl&) = delete;
44
45
0
  Slice key() const {
46
0
    assert(Valid());
47
0
    return current()->key();
48
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::key() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::key() const
49
50
0
  bool Valid() const {
51
0
    if (std::holds_alternative<MultiCfMaxHeap>(heap_)) {
52
0
      auto& max_heap = std::get<MultiCfMaxHeap>(heap_);
53
0
      return !max_heap.empty() && status_.ok();
54
0
    }
55
0
    auto& min_heap = std::get<MultiCfMinHeap>(heap_);
56
0
    return !min_heap.empty() && status_.ok();
57
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Valid() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Valid() const
58
59
0
  Status status() const { return status_; }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::status() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::status() const
60
61
0
  void SeekToFirst() {
62
0
    auto& min_heap = GetHeap<MultiCfMinHeap>([this]() { InitMinHeap(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToFirst()::{lambda()#1}::operator()() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToFirst()::{lambda()#1}::operator()() const
63
0
    SeekCommon(min_heap, [](Iterator* iter) { iter->SeekToFirst(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToFirst()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToFirst()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
64
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToFirst()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToFirst()
65
0
  void Seek(const Slice& target) {
66
0
    auto& min_heap = GetHeap<MultiCfMinHeap>([this]() { InitMinHeap(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda()#1}::operator()() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda()#1}::operator()() const
67
0
    SeekCommon(min_heap, [&target](Iterator* iter) { iter->Seek(target); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
68
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Seek(rocksdb::Slice const&)
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Seek(rocksdb::Slice const&)
69
0
  void SeekToLast() {
70
0
    auto& max_heap = GetHeap<MultiCfMaxHeap>([this]() { InitMaxHeap(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToLast()::{lambda()#1}::operator()() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToLast()::{lambda()#1}::operator()() const
71
0
    SeekCommon(max_heap, [](Iterator* iter) { iter->SeekToLast(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToLast()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToLast()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
72
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToLast()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToLast()
73
0
  void SeekForPrev(const Slice& target) {
74
0
    auto& max_heap = GetHeap<MultiCfMaxHeap>([this]() { InitMaxHeap(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda()#1}::operator()() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda()#1}::operator()() const
75
0
    SeekCommon(max_heap,
76
0
               [&target](Iterator* iter) { iter->SeekForPrev(target); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
77
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)
78
79
0
  void Next() {
80
0
    assert(Valid());
81
0
    auto& min_heap = GetHeap<MultiCfMinHeap>([this]() {
82
0
      std::string target(key().data(), key().size());
83
0
      InitMinHeap();
84
0
      Seek(target);
85
0
    });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Next()::{lambda()#1}::operator()() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Next()::{lambda()#1}::operator()() const
86
0
    AdvanceIterator(min_heap, [](Iterator* iter) { iter->Next(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Next()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Next()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
87
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Next()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Next()
88
0
  void Prev() {
89
0
    assert(Valid());
90
0
    auto& max_heap = GetHeap<MultiCfMaxHeap>([this]() {
91
0
      std::string target(key().data(), key().size());
92
0
      InitMaxHeap();
93
0
      SeekForPrev(target);
94
0
    });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Prev()::{lambda()#1}::operator()() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Prev()::{lambda()#1}::operator()() const
95
0
    AdvanceIterator(max_heap, [](Iterator* iter) { iter->Prev(); });
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Prev()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Prev()::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
96
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Prev()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Prev()
97
98
0
  bool PrepareValue() {
99
0
    assert(Valid());
100
101
0
    if (!allow_unprepared_value_) {
102
0
      return true;
103
0
    }
104
105
0
    if (std::holds_alternative<MultiCfMaxHeap>(heap_)) {
106
0
      return PopulateIterator(std::get<MultiCfMaxHeap>(heap_));
107
0
    }
108
109
0
    return PopulateIterator(std::get<MultiCfMinHeap>(heap_));
110
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::PrepareValue()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::PrepareValue()
111
112
 private:
113
  Status status_;
114
  bool allow_unprepared_value_;
115
  const Comparator* comparator_;
116
  std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>
117
      cfh_iter_pairs_;
118
  ResetFunc reset_func_;
119
  PopulateFunc populate_func_;
120
121
  template <typename CompareOp>
122
  class MultiCfHeapItemComparator {
123
   public:
124
    explicit MultiCfHeapItemComparator(const Comparator* comparator)
125
0
        : comparator_(comparator) {}
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> >::MultiCfHeapItemComparator(rocksdb::Comparator const*)
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> >::MultiCfHeapItemComparator(rocksdb::Comparator const*)
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> >::MultiCfHeapItemComparator(rocksdb::Comparator const*)
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> >::MultiCfHeapItemComparator(rocksdb::Comparator const*)
126
    bool operator()(const MultiCfIteratorInfo& a,
127
0
                    const MultiCfIteratorInfo& b) const {
128
0
      assert(a.iterator);
129
0
      assert(b.iterator);
130
0
      assert(a.iterator->Valid());
131
0
      assert(b.iterator->Valid());
132
0
      int c = comparator_->Compare(a.iterator->key(), b.iterator->key());
133
0
      assert(c != 0 || a.order != b.order);
134
0
      return c == 0 ? a.order - b.order > 0 : CompareOp()(c, 0);
135
0
    }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> >::operator()(rocksdb::MultiCfIteratorInfo const&, rocksdb::MultiCfIteratorInfo const&) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> >::operator()(rocksdb::MultiCfIteratorInfo const&, rocksdb::MultiCfIteratorInfo const&) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> >::operator()(rocksdb::MultiCfIteratorInfo const&, rocksdb::MultiCfIteratorInfo const&) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> >::operator()(rocksdb::MultiCfIteratorInfo const&, rocksdb::MultiCfIteratorInfo const&) const
136
137
   private:
138
    const Comparator* comparator_;
139
  };
140
141
  using MultiCfMinHeap =
142
      BinaryHeap<MultiCfIteratorInfo,
143
                 MultiCfHeapItemComparator<std::greater<int>>>;
144
  using MultiCfMaxHeap = BinaryHeap<MultiCfIteratorInfo,
145
                                    MultiCfHeapItemComparator<std::less<int>>>;
146
147
  using MultiCfIterHeap = std::variant<MultiCfMinHeap, MultiCfMaxHeap>;
148
149
  MultiCfIterHeap heap_;
150
151
0
  Iterator* current() const {
152
0
    if (std::holds_alternative<MultiCfMaxHeap>(heap_)) {
153
0
      auto& max_heap = std::get<MultiCfMaxHeap>(heap_);
154
0
      return max_heap.top().iterator;
155
0
    }
156
0
    auto& min_heap = std::get<MultiCfMinHeap>(heap_);
157
0
    return min_heap.top().iterator;
158
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::current() const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::current() const
159
160
0
  void considerStatus(Status s) {
161
0
    if (!s.ok() && status_.ok()) {
162
0
      status_ = std::move(s);
163
0
    }
164
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::considerStatus(rocksdb::Status)
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::considerStatus(rocksdb::Status)
165
166
  template <typename HeapType, typename InitFunc>
167
0
  HeapType& GetHeap(InitFunc initFunc) {
168
0
    if (!std::holds_alternative<HeapType>(heap_)) {
169
0
      initFunc();
170
0
    }
171
0
    return std::get<HeapType>(heap_);
172
0
  }
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToFirst()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToFirst()::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToLast()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToLast()::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Next()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Next()::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Prev()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Prev()::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToFirst()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToFirst()::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToLast()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToLast()::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Next()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Next()::{lambda()#1})
Unexecuted instantiation: rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >& rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::GetHeap<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Prev()::{lambda()#1}>(rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Prev()::{lambda()#1})
173
174
0
  void InitMinHeap() {
175
0
    heap_.template emplace<MultiCfMinHeap>(
176
0
        MultiCfHeapItemComparator<std::greater<int>>(comparator_));
177
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::InitMinHeap()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::InitMinHeap()
178
0
  void InitMaxHeap() {
179
0
    heap_.template emplace<MultiCfMaxHeap>(
180
0
        MultiCfHeapItemComparator<std::less<int>>(comparator_));
181
0
  }
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::InitMaxHeap()
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::InitMaxHeap()
182
183
  template <typename BinaryHeap, typename ChildSeekFuncType>
184
0
  void SeekCommon(BinaryHeap& heap, ChildSeekFuncType child_seek_func) {
185
0
    reset_func_();
186
0
    heap.clear();
187
0
    int i = 0;
188
0
    for (auto& [cfh, iter] : cfh_iter_pairs_) {
189
0
      child_seek_func(iter.get());
190
0
      if (iter->Valid()) {
191
0
        assert(iter->status().ok());
192
0
        heap.push(MultiCfIteratorInfo{cfh, iter.get(), i});
193
0
      } else {
194
0
        considerStatus(iter->status());
195
0
        if (!status_.ok()) {
196
          // Non-OK status from the iterator. Bail out early
197
0
          heap.clear();
198
0
          return;
199
0
        }
200
0
      }
201
0
      ++i;
202
0
    }
203
0
    if (!allow_unprepared_value_ && !heap.empty()) {
204
0
      [[maybe_unused]] const bool result = PopulateIterator(heap);
205
0
      assert(result || (!Valid() && !status_.ok()));
206
0
    }
207
0
  }
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToFirst()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToFirst()::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToLast()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekToLast()::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToFirst()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToFirst()::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToLast()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekToLast()::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Seek(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekCommon<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::SeekForPrev(rocksdb::Slice const&)::{lambda(rocksdb::Iterator*)#1})
208
209
  template <typename BinaryHeap, typename AdvanceFuncType>
210
0
  void AdvanceIterator(BinaryHeap& heap, AdvanceFuncType advance_func) {
211
0
    reset_func_();
212
    // It is possible for one or more child iters are at invalid keys due to
213
    // manual prefix iteration. For such cases, we consider the result of the
214
    // multi-cf-iter is also undefined.
215
    // https://github.com/facebook/rocksdb/wiki/Prefix-Seek#manual-prefix-iterating
216
    // for details about manual prefix iteration
217
0
    if (heap.empty()) {
218
0
      return;
219
0
    }
220
221
    // 1. Keep the top iterator (by popping it from the heap)
222
    // 2. Make sure all others have iterated past the top iterator key slice
223
    // 3. Advance the top iterator, and add it back to the heap if valid
224
0
    auto top = heap.top();
225
0
    assert(top.iterator);
226
0
    assert(top.iterator->Valid());
227
0
    assert(top.iterator->status().ok());
228
229
0
    heap.pop();
230
231
0
    while (!heap.empty()) {
232
0
      auto current = heap.top();
233
0
      assert(current.iterator);
234
0
      assert(current.iterator->Valid());
235
0
      assert(current.iterator->status().ok());
236
237
0
      if (comparator_->Compare(current.iterator->key(), top.iterator->key()) !=
238
0
          0) {
239
0
        break;
240
0
      }
241
242
0
      advance_func(current.iterator);
243
244
0
      if (current.iterator->Valid()) {
245
0
        assert(current.iterator->status().ok());
246
0
        heap.replace_top(current);
247
0
      } else {
248
0
        considerStatus(current.iterator->status());
249
0
        if (!status_.ok()) {
250
0
          heap.clear();
251
0
          return;
252
0
        } else {
253
0
          heap.pop();
254
0
        }
255
0
      }
256
0
    }
257
258
0
    advance_func(top.iterator);
259
260
0
    if (top.iterator->Valid()) {
261
0
      assert(top.iterator->status().ok());
262
0
      heap.push(top);
263
0
    } else {
264
0
      considerStatus(top.iterator->status());
265
0
      if (!status_.ok()) {
266
0
        heap.clear();
267
0
        return;
268
0
      }
269
0
    }
270
271
0
    if (!allow_unprepared_value_ && !heap.empty()) {
272
0
      [[maybe_unused]] const bool result = PopulateIterator(heap);
273
0
      assert(result || (!Valid() && !status_.ok()));
274
0
    }
275
0
  }
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::AdvanceIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Next()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Next()::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::AdvanceIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Prev()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::Prev()::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::AdvanceIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Next()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Next()::{lambda(rocksdb::Iterator*)#1})
Unexecuted instantiation: void rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::AdvanceIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Prev()::{lambda(rocksdb::Iterator*)#1}>(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::Prev()::{lambda(rocksdb::Iterator*)#1})
276
277
  template <typename BinaryHeap>
278
0
  bool PopulateIterator(BinaryHeap& heap) {
279
    // 1. Keep the top iterator (by popping it from the heap) and add it to list
280
    //    to populate
281
    // 2. For all non-top iterators having the same key as top iter popped
282
    //    from the previous step, add them to the same list and pop it
283
    //    temporarily from the heap
284
    // 3. Once no other iters have the same key as the top iter from step 1,
285
    //    populate the value/columns and attribute_groups from the list
286
    //    collected in step 1 and 2 and add all the iters back to the heap
287
0
    assert(!heap.empty());
288
289
0
    auto prepare_value = [this, &heap](Iterator* iterator) {
290
0
      assert(iterator);
291
0
      assert(iterator->Valid());
292
0
      assert(iterator->status().ok());
293
294
0
      if (!iterator->PrepareValue()) {
295
0
        assert(!iterator->Valid());
296
0
        assert(!iterator->status().ok());
297
298
0
        considerStatus(iterator->status());
299
0
        heap.clear();
300
301
0
        assert(!Valid());
302
0
        assert(!status_.ok());
303
304
0
        return false;
305
0
      }
306
307
0
      return true;
308
0
    };
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
Unexecuted instantiation: rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&)::{lambda(rocksdb::Iterator*)#1}::operator()(rocksdb::Iterator*) const
309
310
0
    auto top = heap.top();
311
0
    assert(top.iterator);
312
0
    assert(top.iterator->Valid());
313
0
    assert(top.iterator->status().ok());
314
315
0
    if (!prepare_value(top.iterator)) {
316
0
      return false;
317
0
    }
318
319
0
    autovector<MultiCfIteratorInfo> to_populate;
320
321
0
    to_populate.push_back(top);
322
0
    heap.pop();
323
324
0
    while (!heap.empty()) {
325
0
      auto current = heap.top();
326
0
      assert(current.iterator);
327
0
      assert(current.iterator->Valid());
328
0
      assert(current.iterator->status().ok());
329
330
0
      if (comparator_->Compare(current.iterator->key(), top.iterator->key()) !=
331
0
          0) {
332
0
        break;
333
0
      }
334
335
0
      if (!prepare_value(current.iterator)) {
336
0
        return false;
337
0
      }
338
339
0
      to_populate.push_back(current);
340
0
      heap.pop();
341
0
    }
342
343
    // Add the items back to the heap
344
0
    for (auto& item : to_populate) {
345
0
      heap.push(item);
346
0
    }
347
348
0
    populate_func_(to_populate);
349
350
0
    return true;
351
0
  }
Unexecuted instantiation: bool rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&)
Unexecuted instantiation: bool rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::CoalescingIterator::ResetFunc, rocksdb::CoalescingIterator::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&)
Unexecuted instantiation: bool rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::greater<int> > >&)
Unexecuted instantiation: bool rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::PopulateIterator<rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > > >(rocksdb::BinaryHeap<rocksdb::MultiCfIteratorInfo, rocksdb::MultiCfIteratorImpl<rocksdb::AttributeGroupIteratorImpl::ResetFunc, rocksdb::AttributeGroupIteratorImpl::PopulateFunc>::MultiCfHeapItemComparator<std::__1::less<int> > >&)
352
};
353
354
}  // namespace ROCKSDB_NAMESPACE