Fix duplicate send ID insufficient balance (#1015)

This commit is contained in:
Lee Bousfield 2018-08-24 13:09:33 -05:00 committed by GitHub
commit edcdb15aec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 30 deletions

View file

@ -355,8 +355,8 @@ TEST (rpc, send_idempotent)
request.put ("wallet", wallet); request.put ("wallet", wallet);
request.put ("action", "send"); request.put ("action", "send");
request.put ("source", rai::test_genesis_key.pub.to_account ()); request.put ("source", rai::test_genesis_key.pub.to_account ());
request.put ("destination", rai::test_genesis_key.pub.to_account ()); request.put ("destination", rai::account (0).to_account ());
request.put ("amount", "100"); request.put ("amount", (rai::genesis_amount - (rai::genesis_amount / 4)).convert_to<std::string> ());
request.put ("id", "123abc"); request.put ("id", "123abc");
test_response response (request, rpc, system.service); test_response response (request, rpc, system.service);
while (response.status == 0) while (response.status == 0)
@ -368,7 +368,7 @@ TEST (rpc, send_idempotent)
rai::block_hash block; rai::block_hash block;
ASSERT_FALSE (block.decode_hex (block_text)); ASSERT_FALSE (block.decode_hex (block_text));
ASSERT_TRUE (system.nodes[0]->ledger.block_exists (block)); ASSERT_TRUE (system.nodes[0]->ledger.block_exists (block));
ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount - 100); ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount / 4);
test_response response2 (request, rpc, system.service); test_response response2 (request, rpc, system.service);
while (response2.status == 0) while (response2.status == 0)
{ {
@ -376,7 +376,7 @@ TEST (rpc, send_idempotent)
} }
ASSERT_EQ (200, response2.status); ASSERT_EQ (200, response2.status);
ASSERT_EQ (response2.json.get<std::string> ("block"), block_text); ASSERT_EQ (response2.json.get<std::string> ("block"), block_text);
ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount - 100); ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount / 4);
request.erase ("id"); request.erase ("id");
request.put ("id", "456def"); request.put ("id", "456def");
test_response response3 (request, rpc, system.service); test_response response3 (request, rpc, system.service);
@ -385,12 +385,7 @@ TEST (rpc, send_idempotent)
system.poll (); system.poll ();
} }
ASSERT_EQ (200, response3.status); ASSERT_EQ (200, response3.status);
std::string block2_text (response3.json.get<std::string> ("block")); ASSERT_EQ (response3.json.get<std::string> ("error"), "Insufficient balance");
rai::block_hash block2;
ASSERT_NE (block2, block);
ASSERT_FALSE (block2.decode_hex (block2_text));
ASSERT_TRUE (system.nodes[0]->ledger.block_exists (block2));
ASSERT_EQ (system.nodes[0]->balance (rai::test_genesis_key.pub), rai::genesis_amount - 200);
} }
TEST (rpc, stop) TEST (rpc, stop)

View file

@ -2606,29 +2606,30 @@ void rai::rpc_handler::send ()
if (!ec) if (!ec)
{ {
boost::optional<std::string> send_id (request.get_optional<std::string> ("id")); boost::optional<std::string> send_id (request.get_optional<std::string> ("id"));
if (balance >= amount.number ()) auto rpc_l (shared_from_this ());
{ auto response_a (response);
auto rpc_l (shared_from_this ()); wallet->send_async (source, destination, amount.number (), [balance, amount, response_a](std::shared_ptr<rai::block> block_a) {
auto response_a (response); if (block_a != nullptr)
wallet->send_async (source, destination, amount.number (), [response_a](std::shared_ptr<rai::block> block_a) { {
if (block_a != nullptr) rai::uint256_union hash (block_a->hash ());
{ boost::property_tree::ptree response_l;
rai::uint256_union hash (block_a->hash ()); response_l.put ("block", hash.to_string ());
boost::property_tree::ptree response_l; response_a (response_l);
response_l.put ("block", hash.to_string ()); }
response_a (response_l); else
} {
else if (balance >= amount.number ())
{ {
error_response (response_a, "Error generating block"); error_response (response_a, "Error generating block");
} }
}, else
work == 0, send_id); {
} std::error_code ec (nano::error_common::insufficient_balance);
else error_response (response_a, ec.message ());
{ }
ec = nano::error_common::insufficient_balance; }
} },
work == 0, send_id);
} }
} }
else else