diff --git a/db/view/view.cc b/db/view/view.cc index 707843664f..17efd546fe 100644 --- a/db/view/view.cc +++ b/db/view/view.cc @@ -54,6 +54,7 @@ #include #include +#include #include "database.hh" #include "clustering_bounds_comparator.hh" @@ -1053,7 +1054,7 @@ future> generate_view_updates( }); } -query::clustering_row_ranges calculate_affected_clustering_ranges(const schema& base, +future calculate_affected_clustering_ranges(const schema& base, const dht::decorated_key& key, const mutation_partition& mp, const std::vector& views, @@ -1070,6 +1071,7 @@ query::clustering_row_ranges calculate_affected_clustering_ranges(const schema& } for (auto&& r : v.view->view_info()->partition_slice().default_row_ranges()) { view_row_ranges.push_back(r.transform(std::mem_fn(&clustering_key_prefix::view))); + co_await make_ready_future<>(); // yield if needed } } } @@ -1086,6 +1088,7 @@ query::clustering_row_ranges calculate_affected_clustering_ranges(const schema& if (overlap) { row_ranges.push_back(std::move(overlap).value()); } + co_await make_ready_future<>(); // yield if needed } } } @@ -1094,6 +1097,7 @@ query::clustering_row_ranges calculate_affected_clustering_ranges(const schema& if (update_requires_read_before_write(base, views, key, row, now)) { row_ranges.emplace_back(row.key()); } + co_await make_ready_future<>(); // yield if needed } // Note that the views could have restrictions on regular columns, @@ -1104,7 +1108,7 @@ query::clustering_row_ranges calculate_affected_clustering_ranges(const schema& // this mutation. //FIXME: Unfortunate copy. - return boost::copy_range( + co_return boost::copy_range( nonwrapping_range::deoverlap(std::move(row_ranges), cmp) | boost::adaptors::transformed([] (auto&& v) { return std::move(v).transform([] (auto&& ckv) { return clustering_key_prefix(ckv); }); diff --git a/db/view/view.hh b/db/view/view.hh index c8f3277cd4..8c6554c6c0 100644 --- a/db/view/view.hh +++ b/db/view/view.hh @@ -141,7 +141,7 @@ future> generate_view_updates( flat_mutation_reader_opt&& existings, gc_clock::time_point now); -query::clustering_row_ranges calculate_affected_clustering_ranges( +future calculate_affected_clustering_ranges( const schema& base, const dht::decorated_key& key, const mutation_partition& mp, diff --git a/table.cc b/table.cc index e1f17b934f..398c912e59 100644 --- a/table.cc +++ b/table.cc @@ -2208,7 +2208,7 @@ future table::do_push_view_replica_updates(schema_ptr s if (views.empty()) { co_return row_locker::lock_holder(); } - auto cr_ranges = db::view::calculate_affected_clustering_ranges(*base, m.decorated_key(), m.partition(), views, now); + auto cr_ranges = co_await db::view::calculate_affected_clustering_ranges(*base, m.decorated_key(), m.partition(), views, now); if (cr_ranges.empty()) { tracing::trace(tr_state, "View updates do not require read-before-write"); co_await generate_and_propagate_view_updates(base, sem.make_permit(s.get(), "push-view-updates-1"), std::move(views), std::move(m), { }, std::move(tr_state), now);