Skip to content

Commit

Permalink
Improve node::process_confirmed () (#1664)
Browse files Browse the repository at this point in the history
* Improve node::process_confirmed ()

Fixing rare node.vote_republish test failures

* Fix std::chrono::steady_clock::now ()

* Make static consexpr process_confirmed_interval
  • Loading branch information
SergiySW authored Jan 30, 2019
1 parent daba0f6 commit e3c47df
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 11 deletions.
25 changes: 15 additions & 10 deletions nano/node/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ std::chrono::minutes constexpr nano::node::backup_interval;
std::chrono::seconds constexpr nano::node::search_pending_interval;
std::chrono::seconds constexpr nano::node::peer_interval;
std::chrono::hours constexpr nano::node::unchecked_cleaning_interval;
std::chrono::milliseconds constexpr nano::node::process_confirmed_interval;

int constexpr nano::port_mapping::mapping_timeout;
int constexpr nano::port_mapping::check_timeout;
Expand Down Expand Up @@ -3264,18 +3265,10 @@ class confirmed_visitor : public nano::block_visitor
};
}

void nano::node::process_confirmed (std::shared_ptr<nano::block> block_a)
void nano::node::process_confirmed (std::shared_ptr<nano::block> block_a, uint8_t iteration)
{
auto hash (block_a->hash ());
bool exists (ledger.block_exists (block_a->type (), hash));
// Attempt to process confirmed block if it's not in ledger yet
if (!exists)
{
auto transaction (store.tx_begin_write ());
block_processor.process_one (transaction, block_a);
exists = store.block_exists (transaction, block_a->type (), hash);
}
if (exists)
if (ledger.block_exists (block_a->type (), hash))
{
auto transaction (store.tx_begin_read ());
confirmed_visitor visitor (transaction, *this, block_a, hash);
Expand Down Expand Up @@ -3303,6 +3296,18 @@ void nano::node::process_confirmed (std::shared_ptr<nano::block> block_a)
}
}
}
// Limit to 0.5 * 20 = 10 seconds (more than max block_processor::process_batch finish time)
else if (iteration < 20)
{
iteration++;
std::weak_ptr<nano::node> node_w (shared ());
alarm.add (std::chrono::steady_clock::now () + process_confirmed_interval, [node_w, block_a, iteration]() {
if (auto node_l = node_w.lock ())
{
node_l->process_confirmed (block_a, iteration);
}
});
}
}

void nano::node::process_message (nano::message & message_a, nano::endpoint const & sender_a)
Expand Down
3 changes: 2 additions & 1 deletion nano/node/node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,7 @@ class node : public std::enable_shared_from_this<nano::node>
void stop ();
std::shared_ptr<nano::node> shared ();
int store_version ();
void process_confirmed (std::shared_ptr<nano::block>);
void process_confirmed (std::shared_ptr<nano::block>, uint8_t = 0);
void process_message (nano::message &, nano::endpoint const &);
void process_active (std::shared_ptr<nano::block>);
nano::process_return process (nano::block const &);
Expand Down Expand Up @@ -623,6 +623,7 @@ class node : public std::enable_shared_from_this<nano::node>
static std::chrono::seconds constexpr peer_interval = search_pending_interval;
static std::chrono::hours constexpr unchecked_cleaning_interval = std::chrono::hours (2);
std::chrono::seconds unchecked_cutoff = std::chrono::seconds (7 * 24 * 60 * 60); // Week
static std::chrono::milliseconds constexpr process_confirmed_interval = (nano::nano_network == nano::nano_networks::nano_test_network) ? std::chrono::milliseconds (50) : std::chrono::milliseconds (500);
};

std::unique_ptr<seq_con_info_component> collect_seq_con_info (node & node, const std::string & name);
Expand Down

0 comments on commit e3c47df

Please sign in to comment.