From 2fb0f7315cacfcbcf71060b666172b2309a38819 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Wed, 7 Apr 2021 11:06:20 +0300 Subject: [PATCH] partition_snapshot_row_cursor: Relax vector of iterators The cursor maintains a vector of iterators that correspond to each of the versions scanned. However, only the iterator in the latest one is really needed, so the whole vector can be reduced down to an optional. Signed-off-by: Pavel Emelyanov --- partition_snapshot_row_cursor.hh | 38 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/partition_snapshot_row_cursor.hh b/partition_snapshot_row_cursor.hh index a4dfda828b..01f482d0ac 100644 --- a/partition_snapshot_row_cursor.hh +++ b/partition_snapshot_row_cursor.hh @@ -128,8 +128,8 @@ class partition_snapshot_row_cursor final { const schema& _schema; partition_snapshot& _snp; utils::small_vector _heap; - utils::small_vector _iterators; utils::small_vector _current_row; + std::optional _latest_it; bool _continuous{}; bool _dummy{}; const bool _unique_owner; @@ -166,7 +166,7 @@ class partition_snapshot_row_cursor final { position_in_version::less_compare heap_less(_schema); _heap.clear(); _current_row.clear(); - _iterators.clear(); + _latest_it.reset(); int version_no = 0; bool unique_owner = _unique_owner; bool first = true; @@ -175,7 +175,9 @@ class partition_snapshot_row_cursor final { auto& rows = v.partition().clustered_rows(); auto pos = rows.lower_bound(lower_bound, cmp); auto end = rows.end(); - _iterators.push_back(pos); + if (first) { + _latest_it = pos; + } if (pos != end) { _heap.push_back({pos, end, version_no, unique_owner}); } @@ -193,7 +195,8 @@ public: { } mutation_partition::rows_type::iterator get_iterator_in_latest_version() const { - return _iterators[0]; + assert(_latest_it); + return *_latest_it; } // Returns true iff the iterators obtained since the cursor was last made valid @@ -242,7 +245,8 @@ public: position_in_partition::equal_compare eq(_schema); position_in_version::less_compare heap_less(_schema); auto& rows = _snp.version()->partition().clustered_rows(); - auto it = _iterators[0] = rows.lower_bound(_position, cmp); + auto it = rows.lower_bound(_position, cmp); + _latest_it = it; auto heap_i = boost::find_if(_heap, [](auto&& v) { return v.version_no == 0; }); if (it == rows.end()) { if (heap_i != _heap.end()) { @@ -308,7 +312,9 @@ public: assert(iterators_valid()); for (auto&& curr : _current_row) { ++curr.it; - _iterators[curr.version_no] = curr.it; + if (curr.version_no == 0) { + _latest_it = curr.it; + } if (curr.it != curr.end) { _heap.push_back(curr); boost::range::push_heap(_heap, heap_less); @@ -336,7 +342,9 @@ public: } else { ++curr.it; } - _iterators[curr.version_no] = curr.it; + if (curr.version_no == 0) { + _latest_it = curr.it; + } if (curr.it != curr.end) { _heap.push_back(curr); boost::range::push_heap(_heap, heap_less); @@ -514,20 +522,16 @@ public: first = false; out << "{v=" << v.version_no << ", pos=" << v.it->position() << ", cont=" << v.it->continuous() << "}"; } - out << "], iterators=[\n "; - first = true; - auto v = cur._snp.versions().begin(); - for (auto&& i : cur._iterators) { - if (!first) { - out << ",\n "; - } - first = false; - if (i == v->partition().clustered_rows().end()) { + out << "], latest_iterator=["; + if (cur._latest_it) { + mutation_partition::rows_type::iterator i = *cur._latest_it; + if (!i) { out << "end"; } else { out << i->position(); } - ++v; + } else { + out << ""; } return out << "]}"; };