diff --git a/src/init.cpp b/src/init.cpp index 988daefeec800..937107c273022 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -543,7 +543,7 @@ void SetupServerArgs(ArgsManager& argsman) argsman.AddArg("-port=", strprintf("Listen for connections on . Nodes not using the default ports (default: %u, testnet: %u, signet: %u, regtest: %u) are unlikely to get incoming connections. Not relevant for I2P (see doc/i2p.md).", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION); argsman.AddArg("-proxy=", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled)", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION); argsman.AddArg("-proxyrandomize", strprintf("Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)", DEFAULT_PROXYRANDOMIZE), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-seednode=", "Connect to a node to retrieve peer addresses, and disconnect. This option can be specified multiple times to connect to multiple nodes.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + argsman.AddArg("-seednode=", "Connect to a node to retrieve peer addresses, and disconnect. This option can be specified multiple times to connect to multiple nodes. During startup, seednodes will be tried before dnsseeds.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-networkactive", "Enable all P2P network activity (default: 1). Can be changed by the setnetworkactive RPC command", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-timeout=", strprintf("Specify socket connection timeout in milliseconds. If an initial attempt to connect is unsuccessful after this amount of time, drop it (minimum: 1, default: %d)", DEFAULT_CONNECT_TIMEOUT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); argsman.AddArg("-peertimeout=", strprintf("Specify a p2p connection timeout delay in seconds. After connecting to a peer, wait this amount of time before considering disconnection based on inactivity (minimum: 1, default: %d)", DEFAULT_PEER_CONNECT_TIMEOUT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CONNECTION); diff --git a/src/net.cpp b/src/net.cpp index 1f319366a4148..9e9d34b4d229f 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2185,35 +2185,37 @@ void CConnman::WakeMessageHandler() void CConnman::ThreadDNSAddressSeed() { - FastRandomContext rng; - std::vector seeds = m_params.DNSSeeds(); - Shuffle(seeds.begin(), seeds.end(), rng); - int seeds_right_now = 0; // Number of seeds left before testing if we have enough connections - int target_outbound_connections = 2; + constexpr int TARGET_OUTBOUND_CONNECTIONS = 2; int outbound_connection_count = 0; - auto start = NodeClock::now(); if (gArgs.IsArgSet("-seednode")) { - LogPrintf("-seednode enabled. Trying the provided seeds before defaulting to the dnsseeds.\n"); + auto start = NodeClock::now(); + constexpr std::chrono::seconds SEEDNODE_TIMEOUT = 30s; + LogPrintf("-seednode enabled. Trying the provided seeds for %d seconds before defaulting to the dnsseeds.\n", SEEDNODE_TIMEOUT.count()); while (!interruptNet) { if (!interruptNet.sleep_for(std::chrono::milliseconds(500))) return; // Abort if we have spent enough time without reaching our target. // Giving seed nodes 30 seconds so this does not become a race against fixedseeds (which triggers after 1 min) - if (NodeClock::now() > start + 30s) { + if (NodeClock::now() > start + SEEDNODE_TIMEOUT) { LogPrintf("Couldn't connect to enough peers via seed nodes. Handing fetch logic to the DNS seeds.\n"); break; } outbound_connection_count = GetFullOutboundConnCount(); - if (outbound_connection_count >= target_outbound_connections) { - LogPrintf("P2P peers available. Finished fetching data from seed nodes.\n"); + if (outbound_connection_count >= TARGET_OUTBOUND_CONNECTIONS) { + LogPrintf("P2P peers available. Finished fetching data from seed nodes.\n"); break; } } } + FastRandomContext rng; + std::vector seeds = m_params.DNSSeeds(); + Shuffle(seeds.begin(), seeds.end(), rng); + int seeds_right_now = 0; // Number of seeds left before testing if we have enough connections + if (gArgs.GetBoolArg("-forcednsseed", DEFAULT_FORCEDNSSEED)) { // When -forcednsseed is provided, query all. seeds_right_now = seeds.size(); @@ -2225,7 +2227,7 @@ void CConnman::ThreadDNSAddressSeed() } // Proceed with dnsseeds if seednodes hasn't reached the target or if forcednsseed is set - if (outbound_connection_count < target_outbound_connections || seeds_right_now) { + if (outbound_connection_count < TARGET_OUTBOUND_CONNECTIONS || seeds_right_now) { // goal: only query DNS seed if address need is acute // * If we have a reasonable number of peers in addrman, spend // some time trying them first. This improves user privacy by @@ -2256,7 +2258,7 @@ void CConnman::ThreadDNSAddressSeed() if (!interruptNet.sleep_for(w)) return; to_wait -= w; - if (GetFullOutboundConnCount() >= target_outbound_connections) { + if (GetFullOutboundConnCount() >= TARGET_OUTBOUND_CONNECTIONS) { if (found > 0) { LogPrintf("%d addresses found from DNS seeds\n", found); LogPrintf("P2P peers available. Finished DNS seeding.\n");