fix mutation forwarding for muti-DC setup

Forwarding lambda is reused, so we cannot move captures out of it
and we cannot pass references to them either since lambda can be
destroyed before send completes.
This commit is contained in:
Gleb Natapov
2015-07-02 12:35:20 +03:00
committed by Avi Kivity
parent 53aa239865
commit c81cf80d8a

View File

@@ -2791,9 +2791,15 @@ void storage_proxy::init_messaging_service() {
ms.send_message_oneway(net::messaging_verb::MUTATION_DONE, net::messaging_service::shard_id{reply_to, shard}, std::move(shard), std::move(response_id));
// return void, no need to wait for send to complete
}),
parallel_for_each(forward.begin(), forward.end(), [reply_to, shard, response_id, &m] (gms::inet_address forward) mutable {
parallel_for_each(forward.begin(), forward.end(), [reply_to, shard, response_id, &m] (gms::inet_address forward) {
auto& ms = net::get_local_messaging_service();
return ms.send_message_oneway(net::messaging_verb::MUTATION, net::messaging_service::shard_id{forward, 0}, m, std::vector<gms::inet_address>(), reply_to, std::move(shard), std::move(response_id));
// we need to get copy of all captured element since lambda is used more than one, so we cannot move from it
// we cannot pass references to send_message either since lambda may be destroyed before send completes
auto reply_to_ = reply_to;
auto shard_ = shard;
auto response_id_ = response_id;
return ms.send_message_oneway(net::messaging_verb::MUTATION, net::messaging_service::shard_id{forward, 0}, m, std::vector<gms::inet_address>(),
std::move(reply_to_), std::move(shard_), std::move(response_id_));
})
);
}).discard_result();