Fix intermittent wallet.work_watcher_update failure (#2677)

This was due to sometimes the blocks having difficulty larger than `limited_active_difficulty` (min between trended_active_difficulty and `config.max_work_generate_difficulty`). Forcing the config value to a high value and the trend to immediately above the highest difficulty between the blocks is sufficient.
This commit is contained in:
Guilherme Lawless 2020-03-24 13:39:48 +00:00 committed by GitHub
commit f875f303f7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1129,7 +1129,10 @@ TEST (wallet, work_watcher_update)
nano::node_config node_config (nano::get_available_port (), system.logging);
node_config.enable_voting = false;
node_config.work_watcher_period = 1s;
auto & node = *system.add_node (node_config);
node_config.max_work_generate_difficulty = std::numeric_limits<uint64_t>::max ();
nano::node_flags node_flags;
node_flags.disable_request_loop = true;
auto & node = *system.add_node (node_config, node_flags);
auto & wallet (*system.wallet (0));
wallet.insert_adhoc (nano::test_genesis_key.prv);
nano::keypair key;
@ -1137,18 +1140,10 @@ TEST (wallet, work_watcher_update)
auto difficulty1 (block1->difficulty ());
auto const block2 (wallet.send_action (nano::test_genesis_key.pub, key.pub, 200));
auto difficulty2 (block2->difficulty ());
auto multiplier = nano::difficulty::to_multiplier (std::max (difficulty1, difficulty2), node.network_params.network.publish_thresholds.base);
uint64_t updated_difficulty1{ difficulty1 }, updated_difficulty2{ difficulty2 };
{
nano::unique_lock<std::mutex> lock (node.active.mutex);
// Prevent active difficulty repopulating multipliers
node.network_params.network.request_interval_ms = 10000;
//fill multipliers_cb and update active difficulty;
for (auto i (0); i < node.active.multipliers_cb.size (); i++)
{
node.active.multipliers_cb.push_back (multiplier * (1.5 + i / 100.));
}
node.active.update_active_difficulty (lock);
nano::lock_guard<std::mutex> guard (node.active.mutex);
node.active.trended_active_difficulty = std::max (difficulty1, difficulty2) + 1;
}
system.deadline_set (20s);
while (updated_difficulty1 == difficulty1 || updated_difficulty2 == difficulty2)