Without this interrupt bitcoind takes a long time to exit if requested to do so after a failed pcp lookup on startup.
net: Add interrupt to pcp retry loop #33338
pull TheCharlatan wants to merge 1 commits into bitcoin:master from TheCharlatan:pcp_interrupt changing 5 files +36 −24-
TheCharlatan commented at 10:20 AM on September 8, 2025: contributor
-
188de70c86
net: Add interrupt to pcp retry loop
Without this interrupt bitcoind takes a long time to exit if requested to do so after a failed pcp lookup on startup.
- DrahtBot added the label P2P on Sep 8, 2025
-
DrahtBot commented at 10:20 AM on September 8, 2025: contributor
<!--e57a25ab6845829454e8d69fc972939a-->
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.
<!--006a51241073e994b41acfe9ec718e94-->
Code Coverage & Benchmarks
For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/33338.
<!--021abf342d371248e50ceaed478a90ca-->
Reviews
See the guideline for information on the review process.
Type Reviewers ACK fjahr, hodlinator, achow101 If your review is incorrectly listed, please react with 👎 to this comment and the bot will ignore it on the next update.
<!--5faf32d7da4f0f540f40219e4f7537a3-->
-
TheCharlatan commented at 10:21 AM on September 8, 2025: contributor
Logs:
<details> <summary>Master logs when mapping fails (Click to expand)</summary>
2025-09-08T10:02:52Z msghand thread start 2025-09-08T10:02:52Z Imported mempool transactions from file: 3 succeeded, 0 failed, 0 expired, 0 already there, 0 waiting for initial broadcast 2025-09-08T10:02:52Z initload thread exit 2025-09-08T10:02:52Z [net:warning] pcp: Could not receive response: Connection refused (111) 2025-09-08T10:02:52Z [net] portmap: gateway [IPv6]: fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:02:52Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:4bfd:91da:7cba:67cb port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:02:52Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:4bfd:91da:7cba:67cb 2025-09-08T10:02:53Z [net] trying v2 connection [2001:e60:1154:ccd9:3515:d56c:bb7:5f4c]:38333 lastseen=58.3hrs 2025-09-08T10:02:53Z [net] pcp: Timeout 2025-09-08T10:02:53Z [net] pcp: Retrying (1) 2025-09-08T10:02:54Z [net] pcp: Timeout 2025-09-08T10:02:54Z [net] pcp: Retrying (2) ^C2025-09-08T10:02:54Z tor: Thread interrupt 2025-09-08T10:02:54Z Shutdown in progress... 2025-09-08T10:02:54Z torcontrol thread exit 2025-09-08T10:02:54Z dnsseed thread exit 2025-09-08T10:02:54Z addcon thread exit 2025-09-08T10:02:54Z net thread exit 2025-09-08T10:02:55Z msghand thread exit 2025-09-08T10:02:55Z [net] pcp: Timeout 2025-09-08T10:02:55Z [net] pcp: Giving up after 3 tries 2025-09-08T10:02:55Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:1386:bc1d:7d89:306d port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:02:55Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:1386:bc1d:7d89:306d 2025-09-08T10:02:56Z [net] pcp: Timeout 2025-09-08T10:02:56Z [net] pcp: Retrying (1) 2025-09-08T10:02:57Z [net] pcp: Timeout 2025-09-08T10:02:57Z [net] pcp: Retrying (2) 2025-09-08T10:02:58Z [net] connection attempt to [2001:e60:1154:ccd9:3515:d56c:bb7:5f4c]:38333 timed out 2025-09-08T10:02:58Z opencon thread exit 2025-09-08T10:02:58Z [net] pcp: Timeout 2025-09-08T10:02:58Z [net] pcp: Giving up after 3 tries 2025-09-08T10:02:58Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:17ff:1c49:2591:5195 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:02:58Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:17ff:1c49:2591:5195 2025-09-08T10:02:59Z [net] pcp: Timeout 2025-09-08T10:02:59Z [net] pcp: Retrying (1) 2025-09-08T10:03:00Z [net] pcp: Timeout 2025-09-08T10:03:00Z [net] pcp: Retrying (2) 2025-09-08T10:03:01Z [net] pcp: Timeout 2025-09-08T10:03:01Z [net] pcp: Giving up after 3 tries 2025-09-08T10:03:01Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:5e43:d231:cd0b:5424 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:03:01Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:5e43:d231:cd0b:5424 2025-09-08T10:03:02Z [net] pcp: Timeout 2025-09-08T10:03:02Z [net] pcp: Retrying (1) 2025-09-08T10:03:03Z [net] pcp: Timeout 2025-09-08T10:03:03Z [net] pcp: Retrying (2) 2025-09-08T10:03:04Z [net] pcp: Timeout 2025-09-08T10:03:04Z [net] pcp: Giving up after 3 tries 2025-09-08T10:03:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:eb22:5bda:fe93:efb3 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:03:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:eb22:5bda:fe93:efb3 2025-09-08T10:03:05Z [net] pcp: Timeout 2025-09-08T10:03:05Z [net] pcp: Retrying (1) 2025-09-08T10:03:06Z [net] pcp: Timeout 2025-09-08T10:03:06Z [net] pcp: Retrying (2) 2025-09-08T10:03:07Z [net] pcp: Timeout 2025-09-08T10:03:07Z [net] pcp: Giving up after 3 tries 2025-09-08T10:03:07Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:ad0f:260a:2c63:7494 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:03:07Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:ad0f:260a:2c63:7494 2025-09-08T10:03:08Z [net] pcp: Timeout 2025-09-08T10:03:08Z [net] pcp: Retrying (1) 2025-09-08T10:03:09Z [net] pcp: Timeout 2025-09-08T10:03:09Z [net] pcp: Retrying (2) 2025-09-08T10:03:10Z [net] pcp: Timeout 2025-09-08T10:03:10Z [net] pcp: Giving up after 3 tries 2025-09-08T10:03:10Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:65cf:20cb:5921:45bf port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:03:10Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:65cf:20cb:5921:45bf 2025-09-08T10:03:11Z [net] pcp: Timeout 2025-09-08T10:03:11Z [net] pcp: Retrying (1) 2025-09-08T10:03:12Z [net] pcp: Timeout 2025-09-08T10:03:12Z [net] pcp: Retrying (2) 2025-09-08T10:03:13Z [net] pcp: Timeout 2025-09-08T10:03:13Z [net] pcp: Giving up after 3 tries 2025-09-08T10:03:13Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:5f6b:1db9:7ba0:44a port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:03:13Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:5f6b:1db9:7ba0:44a 2025-09-08T10:03:14Z [net] pcp: Timeout 2025-09-08T10:03:14Z [net] pcp: Retrying (1) 2025-09-08T10:03:15Z [net] pcp: Timeout 2025-09-08T10:03:15Z [net] pcp: Retrying (2) 2025-09-08T10:03:16Z [net] pcp: Timeout 2025-09-08T10:03:16Z [net] pcp: Giving up after 3 tries 2025-09-08T10:03:16Z [net] pcp: Requesting port mapping for addr 1111:1111::1 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:03:16Z [net] pcp: Internal address after connect: 1111:1111::1 2025-09-08T10:03:17Z [net] pcp: Timeout 2025-09-08T10:03:17Z [net] pcp: Retrying (1) 2025-09-08T10:03:18Z [net] pcp: Timeout 2025-09-08T10:03:18Z [net] pcp: Retrying (2) 2025-09-08T10:03:19Z [net] pcp: Timeout 2025-09-08T10:03:19Z [net] pcp: Giving up after 3 tries 2025-09-08T10:03:19Z mapport thread exit 2025-09-08T10:03:19Z [net] Flushed 13682 addresses to peers.dat 22ms 2025-09-08T10:03:19Z DumpAnchors: Flush 0 outbound block-relay-only peer addresses to anchors.dat started 2025-09-08T10:03:19Z DumpAnchors: Flush 0 outbound block-relay-only peer addresses to anchors.dat completed (0.01s) 2025-09-08T10:03:19Z scheduler thread exit 2025-09-08T10:03:19Z Writing 3 mempool transactions to file... 2025-09-08T10:03:19Z Writing 0 unbroadcast transactions to file. 2025-09-08T10:03:19Z Dumped mempool: 0.000s to copy, 0.008s to dump, 1011 bytes dumped to file 2025-09-08T10:03:19Z Flushed fee estimates to fee_estimates.dat. 2025-09-08T10:03:19Z Shutdown done</details>
<details> <summary>This PR's logs when mapping fails (Click to expand)</summary>
2025-09-08T10:07:03Z msghand thread start 2025-09-08T10:07:03Z addcon thread start 2025-09-08T10:07:03Z initload thread exit 2025-09-08T10:07:03Z [net:warning] pcp: Could not receive response: Connection refused (111) 2025-09-08T10:07:03Z [net] portmap: gateway [IPv6]: fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:03Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:4bfd:91da:7cba:67cb port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:03Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:4bfd:91da:7cba:67cb ^C2025-09-08T10:07:03Z tor: Thread interrupt 2025-09-08T10:07:03Z Shutdown in progress... 2025-09-08T10:07:03Z torcontrol thread exit 2025-09-08T10:07:03Z addcon thread exit 2025-09-08T10:07:03Z opencon thread exit 2025-09-08T10:07:03Z dnsseed thread exit 2025-09-08T10:07:03Z net thread exit 2025-09-08T10:07:03Z msghand thread exit 2025-09-08T10:07:04Z [net] pcp: Timeout 2025-09-08T10:07:04Z [net] pcp: Retrying (1) 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:1386:bc1d:7d89:306d port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:1386:bc1d:7d89:306d 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:17ff:1c49:2591:5195 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:17ff:1c49:2591:5195 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:5e43:d231:cd0b:5424 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:5e43:d231:cd0b:5424 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:eb22:5bda:fe93:efb3 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:eb22:5bda:fe93:efb3 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:ad0f:260a:2c63:7494 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:ad0f:260a:2c63:7494 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:65cf:20cb:5921:45bf port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:65cf:20cb:5921:45bf 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 2a02:1210:4a25:2f00:5f6b:1db9:7ba0:44a port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 2a02:1210:4a25:2f00:5f6b:1db9:7ba0:44a 2025-09-08T10:07:04Z [net] pcp: Requesting port mapping for addr 1111:1111::1 port 38333 from gateway fe80::a6ce:daff:fe8f:12a0%4 2025-09-08T10:07:04Z [net] pcp: Internal address after connect: 1111:1111::1 2025-09-08T10:07:04Z mapport thread exit 2025-09-08T10:07:04Z [net] Flushed 13692 addresses to peers.dat 20ms 2025-09-08T10:07:04Z DumpAnchors: Flush 0 outbound block-relay-only peer addresses to anchors.dat started 2025-09-08T10:07:04Z DumpAnchors: Flush 0 outbound block-relay-only peer addresses to anchors.dat completed (0.01s) 2025-09-08T10:07:04Z scheduler thread exit 2025-09-08T10:07:04Z Writing 3 mempool transactions to file... 2025-09-08T10:07:04Z Writing 0 unbroadcast transactions to file. 2025-09-08T10:07:04Z Dumped mempool: 0.000s to copy, 0.006s to dump, 1011 bytes dumped to file 2025-09-08T10:07:04Z Flushed fee estimates to fee_estimates.dat. 2025-09-08T10:07:04Z Shutdown done</details>
- fanquake added this to the milestone 30.0 on Sep 8, 2025
-
in src/common/pcp.cpp:222 in 188de70c86
217 | @@ -217,7 +218,8 @@ CNetAddr PCPUnwrapAddress(std::span<const uint8_t> wrapped_addr) 218 | //! PCP or NAT-PMP send-receive loop. 219 | std::optional<std::vector<uint8_t>> PCPSendRecv(Sock &sock, const std::string &protocol, std::span<const uint8_t> request, int num_tries, 220 | std::chrono::milliseconds timeout_per_try, 221 | - std::function<bool(std::span<const uint8_t>)> check_packet) 222 | + std::function<bool(std::span<const uint8_t>)> check_packet, 223 | + CThreadInterrupt& interrupt)
hodlinator commented at 1:04 PM on September 8, 2025:nit: Would prefer keeping the lambda as the last parameter and also avoiding to mix
&-placement within the same argument list.CThreadInterrupt &interrupt, std::function<bool(std::span<const uint8_t>)> check_packet)
fjahr commented at 7:29 PM on September 8, 2025:CThreadInterrupt& interruptis our preferred style though (seePointerAlignment: Leftinsrc/.clang-format), so maybe we rather want to fix the other parameter to keep it consistent.in src/common/pcp.cpp:243 in 188de70c86
239 | @@ -238,6 +240,7 @@ std::optional<std::vector<uint8_t>> PCPSendRecv(Sock &sock, const std::string &p 240 | auto cur_time = time_point_cast<milliseconds>(MockableSteadyClock::now()); 241 | auto deadline = cur_time + timeout_per_try; 242 | while ((cur_time = time_point_cast<milliseconds>(MockableSteadyClock::now())) < deadline) { 243 | + if (interrupt) return std::nullopt;
fjahr commented at 2:51 PM on September 8, 2025:nit: comment above lists all the conditions for the wait to exit so it should list interrupt as well.
in src/test/pcp_tests.cpp:18 in 188de70c86
14 | @@ -15,6 +15,8 @@ 15 | 16 | using namespace std::literals; 17 | 18 | +static CThreadInterrupt g_interrupt;
fjahr commented at 2:52 PM on September 8, 2025:nit: Could add a simple test where the interrupt is instantly called to make sure the line is covered somehow.
fjahr commented at 2:54 PM on September 8, 2025: contributorutACK 188de70c86414b8b2ad5143f5c607b67686526ea
Looks good to me, happy to re-review if you decide to address the nits.
hodlinator approvedhodlinator commented at 7:15 PM on September 8, 2025: contributorutACK 188de70c86414b8b2ad5143f5c607b67686526ea
Change just passes down
interruptfor checking in inner loops.
Didn't figure out a way of reproducing the behavior PR-author describes in #33338 (comment).
Wasn't able to bring to (zombie) life a local IPv6 gateway.
Only have one ethernet interface on my local machine. Seems the author may have a handful.
Reproduced something similar anyway through hacking this in:
diff --git a/src/common/pcp.cpp b/src/common/pcp.cpp index ed6624cb89..33b4c653fa 100644 --- a/src/common/pcp.cpp +++ b/src/common/pcp.cpp @@ -246,9 +246,11 @@ std::optional<std::vector<uint8_t>> PCPSendRecv(Sock &sock, const std::string &p LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "%s: Could not wait on socket: %s\n", protocol, NetworkErrorString(WSAGetLastError())); return std::nullopt; // Network-level error, probably no use retrying. } - if (!occurred) { + std::this_thread::sleep_for(3s); + //if (!occurred) { LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "%s: Timeout\n", protocol); break; // Retry. + /* } // Receive response. @@ -263,6 +265,7 @@ std::optional<std::vector<uint8_t>> PCPSendRecv(Sock &sock, const std::string &p got_response = true; // Got expected response, break from receive loop as well as from retry loop. break; } + */ } } if (!got_response) {...and testing Ctrl+C with/without interrupt/PR.
achow101 commented at 8:29 PM on September 8, 2025: memberACK 188de70c86414b8b2ad5143f5c607b67686526ea
achow101 merged this on Sep 8, 2025achow101 closed this on Sep 8, 2025
This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-04-29 21:13 UTC
More mirrored repositories can be found on mirror.b10c.me