From c7c87660345c0d92cfcf2d08c8b2dada14da92f0 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Sun, 26 Aug 2018 17:08:05 -0500 Subject: [PATCH] Fix duplicate send ID insufficient balance again The non-test part of edcdb15 was reverted in 2a6030c, which broke the test --- rai/core_test/rpc.cpp | 3 ++- rai/node/rpc.cpp | 37 +++++++++++++++++++------------------ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 4db4dc2d18..0ecdd597b3 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -375,7 +375,8 @@ TEST (rpc, send_idempotent) system.poll (); } ASSERT_EQ (200, response2.status); - ASSERT_EQ (response2.json.get ("block"), block_text); + ASSERT_EQ ("", response2.json.get ("error", "")); + ASSERT_EQ (block_text, response2.json.get ("block")); ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount / 4); request.erase ("id"); request.put ("id", "456def"); diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index cfe9dbc7a6..2d63c9fb96 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -2611,29 +2611,30 @@ void rai::rpc_handler::send () if (!ec) { boost::optional send_id (request.get_optional ("id")); - if (balance >= amount.number ()) - { - auto rpc_l (shared_from_this ()); - auto response_a (response); - wallet->send_async (source, destination, amount.number (), [response_a](std::shared_ptr block_a) { - if (block_a != nullptr) + auto rpc_l (shared_from_this ()); + auto response_a (response); + wallet->send_async (source, destination, amount.number (), [balance, amount, response_a](std::shared_ptr block_a) { + if (block_a != nullptr) + { + rai::uint256_union hash (block_a->hash ()); + boost::property_tree::ptree response_l; + response_l.put ("block", hash.to_string ()); + response_a (response_l); + } + else + { + if (balance >= amount.number ()) { - rai::uint256_union hash (block_a->hash ()); - boost::property_tree::ptree response_l; - response_l.put ("block", hash.to_string ()); - response_a (response_l); + error_response (response_a, "Error generating block"); } else { - error_response (response_a, "Error generating block"); + std::error_code ec (nano::error_common::insufficient_balance); + error_response (response_a, ec.message ()); } - }, - work == 0, send_id); - } - else - { - ec = nano::error_common::insufficient_balance; - } + } + }, + work == 0, send_id); } } else