crimson/osd: merge pg_temp_wanted before sending them

there is chance that new pg_temp_wanted is added when we are sending
them in ShardServices::send_pg_temp(), but the pg temp are already
collected into the messages before seastar::parallel_for_each(). so,
we cannot move all elements from pg_temp_wanted to pg_temp_pending after
sending the messages, that'd also move the unsent pg temps to
pg_temp_pending as well. so we have to do this before do the async call,

this issue was root caused by Xuehan Xu <xxhdx1985126@gmail.com>.

Signed-off-by: Kefu Chai <kchai@redhat.com>
This commit is contained in:
Kefu Chai 2020-11-01 11:23:13 +08:00
parent dbbd2d32f3
commit 4d17fda7e3

View File

@ -200,6 +200,8 @@ seastar::future<> ShardServices::send_pg_temp()
}
m->pg_temp.emplace(pgid, pg_temp.acting);
}
pg_temp_pending.merge(pg_temp_wanted);
pg_temp_wanted.clear();
return seastar::parallel_for_each(std::begin(ms), std::end(ms),
[this](auto m) {
if (m) {
@ -207,9 +209,6 @@ seastar::future<> ShardServices::send_pg_temp()
} else {
return seastar::now();
}
}).then([this] {
pg_temp_pending.merge(pg_temp_wanted);
pg_temp_wanted.clear();
});
}