https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105373
--- Comment #6 from Avi Kivity <avi at scylladb dot com> ---
Some more findings: if I replace the lambda (which is not a coroutine, but is
contained in a coroutine lambda) with an equivalent struct, the problem goes
away, both at runtime and in terms of an __old4 copy.
+ struct inner_lambda {
+ table* zis;
+ lw_shared_ptr<memtable> old4;
+ std::vector<sstables::shared_sstable>& newtabs;
+ inner_lambda(table* zis, lw_shared_ptr<memtable>& old3,
std::vector<sstables::shared_sstable>& newtabs)
+ : zis(zis), old4(old3), newtabs(newtabs) {}
+ future<> operator()() {
+ tlogger.info("updating cache {}",
fmt::ptr(old4.get()));
+ return zis->update_cache(old4, newtabs);
+ }
+ };
+
tlogger.info("before updating cache {}",
fmt::ptr(old3.get()));
- co_await
with_scheduling_group(_config.memtable_to_cache_scheduling_group, [this, old4 =
old3, &newtabs] () -> future<> {
+ co_await
with_scheduling_group(_config.memtable_to_cache_scheduling_group, /* [this,
old4 = old3, &newtabs] () mutable -> future<> {
tlogger.info("updating cache {}", fmt::ptr(old4.get()));
return update_cache(old4, newtabs);
- });
+ } */ inner_lambda(this, old3, newtabs));
tlogger.info("updating cache {} done", fmt::ptr(old3.get()));
_memtables->erase(old3);
tlogger.debug("Memtable for {}.{} replaced, into {} sstables",
old3->schema()->ks_name(), old3->schema()->cf_name(), newtabs.size());
tlogger.info("try_flush_memtable_to_sstable post_flush:end old
{} refcnt {}", fmt::ptr(old3.get()), old3.use_count());
co_return stop_iteration::yes;