I hit this while refactoring the wallet functional tests to remove the ‘account’ API.
To reproduce this, take the commit at https://github.com/bitcoin/bitcoin/pull/13075/commits/6f3b8657c8e6564112d519cc90fa9042fc4504c1 and run wallet_importprunedfunds.py. I’ve tried to pare that test down to a minimal failure scenario, but I haven’t been able to reliably reproduce this with a shorter test yet.
What I know so far is that some combination of importprunedfunds
, removeprunedfunds
and listtransactions
leads to the node OOM’ing. The failure occurs at line 107:
0→ /wallet_importprunedfunds.py
12018-04-25T20:32:37.762000Z TestFramework (INFO): Initializing test directory /tmp/user/1000/testjke6yfkx
22018-04-25T20:32:38.143000Z TestFramework (INFO): Mining blocks...
3terminate called without an active exception
42018-04-25T20:32:38.465000Z TestFramework (ERROR): Unexpected exception caught during testing
5Traceback (most recent call last):
6 File "/home/ubuntu/bitcoin/test/functional/test_framework/authproxy.py", line 107, in _request
7 return self._get_response()
8 File "/home/ubuntu/bitcoin/test/functional/test_framework/authproxy.py", line 153, in _get_response
9 http_response = self.__conn.getresponse()
10 File "/usr/lib/python3.5/http/client.py", line 1197, in getresponse
11 response.begin()
12 File "/usr/lib/python3.5/http/client.py", line 297, in begin
13 version, status, reason = self._read_status()
14 File "/usr/lib/python3.5/http/client.py", line 266, in _read_status
15 raise RemoteDisconnected("Remote end closed connection without"
16http.client.RemoteDisconnected: Remote end closed connection without response
17
18During handling of the above exception, another exception occurred:
19
20Traceback (most recent call last):
21 File "/home/ubuntu/bitcoin/test/functional/test_framework/test_framework.py", line 147, in main
22 self.run_test()
23 File "./wallet_importprunedfunds.py", line 107, in run_test
24 assert not [tx for tx in self.nodes[1].listtransactions(include_watchonly=True) if tx['txid'] == txnid2]
25 File "/home/ubuntu/bitcoin/test/functional/test_framework/coverage.py", line 47, in __call__
26 return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
27 File "/home/ubuntu/bitcoin/test/functional/test_framework/authproxy.py", line 136, in __call__
28 response = self._request('POST', self.__url.path, postdata.encode('utf-8'))
29 File "/home/ubuntu/bitcoin/test/functional/test_framework/authproxy.py", line 111, in _request
30 self.__conn.request(method, path, postdata, headers)
31 File "/usr/lib/python3.5/http/client.py", line 1106, in request
32 self._send_request(method, url, body, headers)
33 File "/usr/lib/python3.5/http/client.py", line 1151, in _send_request
34 self.endheaders(body)
35 File "/usr/lib/python3.5/http/client.py", line 1102, in endheaders
36 self._send_output(message_body)
37 File "/usr/lib/python3.5/http/client.py", line 934, in _send_output
38 self.send(msg)
39 File "/usr/lib/python3.5/http/client.py", line 877, in send
40 self.connect()
41 File "/usr/lib/python3.5/http/client.py", line 849, in connect
42 (self.host,self.port), self.timeout, self.source_address)
43 File "/usr/lib/python3.5/socket.py", line 711, in create_connection
44 raise err
45 File "/usr/lib/python3.5/socket.py", line 702, in create_connection
46 sock.connect(sa)
47ConnectionRefusedError: [Errno 111] Connection refused
482018-04-25T20:32:38.473000Z TestFramework (INFO): Stopping nodes
492018-04-25T20:32:38.475000Z TestFramework.node1 (ERROR): Unable to stop node.
50Traceback (most recent call last):
51 File "/home/ubuntu/bitcoin/test/functional/test_framework/test_node.py", line 187, in stop_node
52 self.stop()
53 File "/home/ubuntu/bitcoin/test/functional/test_framework/coverage.py", line 47, in __call__
54 return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)
55 File "/home/ubuntu/bitcoin/test/functional/test_framework/authproxy.py", line 136, in __call__
56 response = self._request('POST', self.__url.path, postdata.encode('utf-8'))
57 File "/home/ubuntu/bitcoin/test/functional/test_framework/authproxy.py", line 106, in _request
58 self.__conn.request(method, path, postdata, headers)
59 File "/usr/lib/python3.5/http/client.py", line 1106, in request
60 self._send_request(method, url, body, headers)
61 File "/usr/lib/python3.5/http/client.py", line 1141, in _send_request
62 self.putrequest(method, url, **skips)
63 File "/usr/lib/python3.5/http/client.py", line 974, in putrequest
64 raise CannotSendRequest(self.__state)
65http.client.CannotSendRequest: Request-sent
66Traceback (most recent call last):
67 File "./wallet_importprunedfunds.py", line 113, in <module>
68 ImportPrunedFundsTest().main()
69 File "/home/ubuntu/bitcoin/test/functional/test_framework/test_framework.py", line 170, in main
70 self.stop_nodes()
71 File "/home/ubuntu/bitcoin/test/functional/test_framework/test_framework.py", line 300, in stop_nodes
72 node.wait_until_stopped()
73 File "/home/ubuntu/bitcoin/test/functional/test_framework/test_node.py", line 214, in wait_until_stopped
74 wait_until(self.is_node_stopped, timeout=timeout)
75 File "/home/ubuntu/bitcoin/test/functional/test_framework/util.py", line 216, in wait_until
76 if predicate():
77 File "/home/ubuntu/bitcoin/test/functional/test_framework/test_node.py", line 205, in is_node_stopped
78 "Node returned non-zero exit code (%d) when stopping" % return_code)
79AssertionError: [node 1] Node returned non-zero exit code (-6) when stopping
80[node 1] Cleaning up leftover process
Tail of node1’s debug.log:
02018-04-25T20:32:38.338225Z ThreadRPCServer method=removeprunedfunds user=__cookie__
12018-04-25T20:32:38.339174Z Received a POST request for / from 127.0.0.1:34026
22018-04-25T20:32:38.339214Z ThreadRPCServer method=listtransactions user=__cookie__
32018-04-25T20:32:38.339348Z Error: Out of memory. Terminating.