mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-19 23:03:45 +01:00
76e0e6087dqa: Account for errno not always being set for ConnectionResetError (Hodlinator) Pull request description: The lack of errno can cause unclear and long log output. Issue can be triggered by: ```diff --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -263,6 +263,7 @@ std::string RequestMethodString(HTTPRequest::RequestMethod m) /** HTTP request callback */ static void http_request_cb(struct evhttp_request* req, void* arg) { + throw std::runtime_error{"Hello"}; evhttp_connection* conn{evhttp_request_get_connection(req)}; // Track active requests { ``` and running a functional test such as *test/functional/feature_abortnode.py*. `http.client.RemoteDisconnected` not specifying `errno` to `ConnectionResetError`-ctor:ce4b0ede16/Lib/http/client.py (L1556C9-L1556C29)<details><summary>Before/after log examples</summary> #### Log before ``` 2025-11-14T20:53:05.272804Z TestFramework (ERROR): Unexpected exception Traceback (most recent call last): File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 138, in main self.setup() ~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 268, in setup self.setup_network() ~~~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/./build/test/functional/feature_abortnode.py", line 21, in setup_network self.setup_nodes() ~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 381, in setup_nodes self.start_nodes() ~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 527, in start_nodes node.wait_for_rpc_connection() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_node.py", line 326, in wait_for_rpc_connection rpc.getblockcount() ~~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/coverage.py", line 50, in __call__ return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs) File "/home/hodlinator/bc/3/test/functional/test_framework/authproxy.py", line 137, in __call__ response, status = self._request('POST', self.__url.path, postdata.encode('utf-8')) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hodlinator/bc/3/test/functional/test_framework/authproxy.py", line 111, in _request return self._get_response() ~~~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/authproxy.py", line 174, in _get_response http_response = self.__conn.getresponse() File "/nix/store/62fdlzq1x1ak2lsxp4ij7ip5k9nia3hc-python3-3.13.7/lib/python3.13/http/client.py", line 1430, in getresponse response.begin() ~~~~~~~~~~~~~~^^ File "/nix/store/62fdlzq1x1ak2lsxp4ij7ip5k9nia3hc-python3-3.13.7/lib/python3.13/http/client.py", line 331, in begin version, status, reason = self._read_status() ~~~~~~~~~~~~~~~~~^^ File "/nix/store/62fdlzq1x1ak2lsxp4ij7ip5k9nia3hc-python3-3.13.7/lib/python3.13/http/client.py", line 300, in _read_status raise RemoteDisconnected("Remote end closed connection without" " response") http.client.RemoteDisconnected: Remote end closed connection without response ``` #### Log after ``` 2025-11-14T20:48:10.552126Z TestFramework (ERROR): Unexpected exception Traceback (most recent call last): File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 138, in main self.setup() ~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 268, in setup self.setup_network() ~~~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/./build/test/functional/feature_abortnode.py", line 21, in setup_network self.setup_nodes() ~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 381, in setup_nodes self.start_nodes() ~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_framework.py", line 527, in start_nodes node.wait_for_rpc_connection() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ File "/home/hodlinator/bc/3/test/functional/test_framework/test_node.py", line 316, in wait_for_rpc_connection raise FailedToStartError(self._node_msg( f'bitcoind exited with status {self.process.returncode} during initialization. {str_error}')) test_framework.test_node.FailedToStartError: [node 0] bitcoind exited with status -6 during initialization. terminate called after throwing an instance of 'std::runtime_error' what(): Hello ************************ ``` Note how even the C++ exception message is now included. </details> ACKs for top commit: maflcko: review ACK76e0e6087d🌬 furszy: Tested ACK76e0e6087dl0rinc: untested code review ACK76e0e6087dTree-SHA512: 55a83d664624932b919ab2a5b6369121db448d27628029f21c5df297892dd56d179d710ad744f6407b51aa576fb6905a38bbc29885c534ec20704c22717a0880