From b67feea6876499481fd8e1374392e34a7a010966 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Fri, 30 Mar 2018 13:19:27 -0500 Subject: [PATCH] Moving work generation, which is a potentially slow operation, outside of an open database transaction. --- rai/node/wallet.cpp | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/rai/node/wallet.cpp b/rai/node/wallet.cpp index 691e95ce..ce51bc6f 100644 --- a/rai/node/wallet.cpp +++ b/rai/node/wallet.cpp @@ -859,6 +859,8 @@ std::shared_ptr rai::wallet::receive_action (rai::block const & send rai::raw_key prv; if (!store.fetch (transaction, account, prv)) { + uint64_t cached_work (0); + store.work_get (transaction, account, cached_work); rai::account_info info; auto new_account (node.ledger.store.account_get (transaction, account, info)); if (!new_account) @@ -867,22 +869,22 @@ std::shared_ptr rai::wallet::receive_action (rai::block const & send assert (rep_block != nullptr); if (should_generate_state_block (transaction, info.head)) { - block.reset (new rai::state_block (account, info.head, rep_block->representative (), info.balance.number () + pending_info.amount.number (), hash, prv, account, generate_work_a ? work_fetch (transaction, account, info.head) : 0)); + block.reset (new rai::state_block (account, info.head, rep_block->representative (), info.balance.number () + pending_info.amount.number (), hash, prv, account, cached_work)); } else { - block.reset (new rai::receive_block (info.head, hash, prv, account, generate_work_a ? work_fetch (transaction, account, info.head) : 0)); + block.reset (new rai::receive_block (info.head, hash, prv, account, cached_work)); } } else { if (node.ledger.state_block_generation_enabled (transaction)) { - block.reset (new rai::state_block (account, 0, representative_a, pending_info.amount, hash, prv, account, generate_work_a ? work_fetch (transaction, account, account) : 0)); + block.reset (new rai::state_block (account, 0, representative_a, pending_info.amount, hash, prv, account, cached_work)); } else { - block.reset (new rai::open_block (hash, representative_a, account, prv, account, generate_work_a ? work_fetch (transaction, account, account) : 0)); + block.reset (new rai::open_block (hash, representative_a, account, prv, account, cached_work)); } } } @@ -908,7 +910,10 @@ std::shared_ptr rai::wallet::receive_action (rai::block const & send } if (block != nullptr) { - assert (block != nullptr); + if (generate_work_a && rai::work_validate (*block)) + { + node.generate_work (*block); + } node.block_arrival.add (block->hash ()); node.block_processor.process_receive_many (block); if (generate_work_a) @@ -940,20 +945,25 @@ std::shared_ptr rai::wallet::change_action (rai::account const & sou rai::raw_key prv; auto error2 (store.fetch (transaction, source_a, prv)); assert (!error2); + uint64_t cached_work (0); + store.work_get (transaction, source_a, cached_work); if (should_generate_state_block (transaction, info.head)) { - block.reset (new rai::state_block (source_a, info.head, representative_a, info.balance, 0, prv, source_a, generate_work_a ? work_fetch (transaction, source_a, info.head) : 0)); + block.reset (new rai::state_block (source_a, info.head, representative_a, info.balance, 0, prv, source_a, cached_work)); } else { - block.reset (new rai::change_block (info.head, representative_a, prv, source_a, generate_work_a ? work_fetch (transaction, source_a, info.head) : 0)); + block.reset (new rai::change_block (info.head, representative_a, prv, source_a, cached_work)); } } } } if (block != nullptr) { - assert (block != nullptr); + if (generate_work_a && rai::work_validate (*block)) + { + node.generate_work (*block); + } node.block_arrival.add (block->hash ()); node.block_processor.process_receive_many (block); if (generate_work_a) @@ -1017,13 +1027,15 @@ std::shared_ptr rai::wallet::send_action (rai::account const & sourc assert (!error2); std::shared_ptr rep_block = node.ledger.store.block_get (transaction, info.rep_block); assert (rep_block != nullptr); + uint64_t cached_work (0); + store.work_get (transaction, source_a, cached_work); if (should_generate_state_block (transaction, info.head)) { - block.reset (new rai::state_block (source_a, info.head, rep_block->representative (), balance - amount_a, account_a, prv, source_a, generate_work_a ? work_fetch (transaction, source_a, info.head) : 0)); + block.reset (new rai::state_block (source_a, info.head, rep_block->representative (), balance - amount_a, account_a, prv, source_a, cached_work)); } else { - block.reset (new rai::send_block (info.head, account_a, balance - amount_a, prv, source_a, generate_work_a ? work_fetch (transaction, source_a, info.head) : 0)); + block.reset (new rai::send_block (info.head, account_a, balance - amount_a, prv, source_a, cached_work)); } if (id_mdb_val) { @@ -1041,6 +1053,10 @@ std::shared_ptr rai::wallet::send_action (rai::account const & sourc } if (!error && block != nullptr && !cached_block) { + if (generate_work_a && rai::work_validate (*block)) + { + node.generate_work (*block); + } node.block_arrival.add (block->hash ()); node.block_processor.process_receive_many (block); auto hash (block->hash ());