bool poller::is_duplicate_block_ask(const block_locator_type& locator, const hash_digest& hash_stop, channel_ptr node) { return last_locator_begin_ == locator.front() && last_hash_stop_ == hash_stop && last_requested_node_ == node.get(); }
// Not having orphans will cause a stall void poller::ask_blocks(const std::error_code& ec, const block_locator_type& locator, const hash_digest& hash_stop, channel_ptr node) { if (!node) return; if (ec) { log_debug(LOG_POLLER) << "Failed to fetch block locator: " << ec.message(); return; } if (is_duplicate_block_ask(locator, hash_stop, node)) { log_debug(LOG_POLLER) << "Skipping duplicate ask blocks with locator front [" << encode_hash(locator.front()) << "]"; return; } log_debug(LOG_POLLER) << "Ask for blocks with stop [" << encode_hash(hash_stop) << "]"; const auto handle_error = [node](const std::error_code& ec) { if (!node) return; if (ec) { log_debug(LOG_POLLER) << "Send get blocks problem: " << ec.message(); // TODO: modify send() to terminate the connection on send failure. node->stop(); } }; // Send get_blocks request. const get_blocks_type packet{ locator, hash_stop }; node->send(packet, handle_error); // Update last values. last_locator_begin_ = locator.front(); last_hash_stop_ = hash_stop; last_requested_node_ = node.get(); }