From c81cf80d8a4b6081d18b95331ef47575adf69dde Mon Sep 17 00:00:00 2001 From: Gleb Natapov Date: Thu, 2 Jul 2015 12:35:20 +0300 Subject: [PATCH] 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. --- service/storage_proxy.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/service/storage_proxy.cc b/service/storage_proxy.cc index af4d9bf624..075d7bbee3 100644 --- a/service/storage_proxy.cc +++ b/service/storage_proxy.cc @@ -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(), 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(), + std::move(reply_to_), std::move(shard_), std::move(response_id_)); }) ); }).discard_result();