NRTM responses can hang on PyPy
Closed this issue · 0 comments
mxsasha commented
When using PyPy (confirmed with 3.9), larger but reasonable NRTM requests can entirely hang the whois worker. The query never returns, the worker does not recover. This starts to occur around a few thousand serials. The same queries respond fine with CPython in reasonable time with reasonable response sizes.
Temporary workaround: use CPython.
Sample traceback from SIGUSR1:
## Thread: MainThread(140687221291968) ##
File "/home/irrd/irrd-venv/bin/irrd", line 8, in <module>
sys.exit(main())
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/daemon/main.py", line 81, in main
run_irrd(mirror_frequency=mirror_frequency,
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/daemon/main.py", line 104, in run_irrd
whois_process.start()
File "/opt/pypy/lib/pypy3.9/multiprocessing/process.py", line 121, in start
self._popen = self._Popen(self)
File "/opt/pypy/lib/pypy3.9/multiprocessing/context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "/opt/pypy/lib/pypy3.9/multiprocessing/context.py", line 277, in _Popen
return Popen(process_obj)
File "/opt/pypy/lib/pypy3.9/multiprocessing/popen_fork.py", line 19, in __init__
self._launch(process_obj)
File "/opt/pypy/lib/pypy3.9/multiprocessing/popen_fork.py", line 71, in _launch
code = process_obj._bootstrap(parent_sentinel=child_r)
File "/opt/pypy/lib/pypy3.9/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/utils/process_support.py", line 21, in run
super().run()
File "/opt/pypy/lib/pypy3.9/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/server.py", line 35, in start_whois_server
server = WhoisTCPServer(
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/server.py", line 78, in __init__
worker.start()
File "/opt/pypy/lib/pypy3.9/multiprocessing/process.py", line 121, in start
self._popen = self._Popen(self)
File "/opt/pypy/lib/pypy3.9/multiprocessing/context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "/opt/pypy/lib/pypy3.9/multiprocessing/context.py", line 277, in _Popen
return Popen(process_obj)
File "/opt/pypy/lib/pypy3.9/multiprocessing/popen_fork.py", line 19, in __init__
self._launch(process_obj)
File "/opt/pypy/lib/pypy3.9/multiprocessing/popen_fork.py", line 71, in _launch
code = process_obj._bootstrap(parent_sentinel=child_r)
File "/opt/pypy/lib/pypy3.9/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/server.py", line 145, in run
self.handle_connection()
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/server.py", line 198, in handle_connection
if not self.handle_query(query):
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/server.py", line 212, in handle_query
response = self.query_parser.handle_query(query)
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/query_parser.py", line 77, in handle_query
return self.handle_ripe_command(query)
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/query_parser.py", line 381, in handle_ripe_command
result = self.handle_nrtm_request(components.pop(0))
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/server/whois/query_parser.py", line 480, in handle_nrtm_request
return NRTMGenerator().generate(
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/mirroring/nrtm_generator.py", line 71, in generate
output += '\n' + operation['operation'].value
File "/home/irrd/irrd-venv/lib/pypy3.9/site-packages/irrd/utils/process_support.py", line 48, in sigusr1_handler
code += traceback.format_list(traceback.extract_stack(stack))
Sample strace:
munmap(0x7ff419381000, 95555584) = 0
munmap(0x7ff41eea2000, 95551488) = 0
mmap(NULL, 95555584, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41eea1000
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff40dd37000
munmap(0x7ff41eea1000, 95555584) = 0
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41ee99000
munmap(0x7ff40dd37000, 95588352) = 0
munmap(0x7ff413860000, 95555584) = 0
munmap(0x7ff4249c2000, 95551488) = 0
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff42a4d7000
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff419370000
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff413847000
munmap(0x7ff419370000, 95588352) = 0
munmap(0x7ff42a4d7000, 95588352) = 0
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff42a4d7000
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff419370000
munmap(0x7ff42a4d7000, 95588352) = 0
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff42a4d7000
munmap(0x7ff419370000, 95588352) = 0
munmap(0x7ff413847000, 95588352) = 0
munmap(0x7ff41ee99000, 95588352) = 0
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff4249ae000
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41ee85000
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41935c000
munmap(0x7ff41ee85000, 95588352) = 0
munmap(0x7ff4249ae000, 95588352) = 0
mmap(NULL, 95588352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff4249ae000
mmap(NULL, 95592448, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff413832000
munmap(0x7ff4249ae000, 95588352) = 0
mmap(NULL, 95592448, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff4249ad000
munmap(0x7ff413832000, 95592448) = 0
munmap(0x7ff41935c000, 95588352) = 0
munmap(0x7ff42a4d7000, 95588352) = 0
mmap(NULL, 95592448, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41ee83000
mmap(NULL, 95592448, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff419359000
mmap(NULL, 95592448, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41382f000
munmap(0x7ff419359000, 95592448) = 0
munmap(0x7ff41ee83000, 95592448) = 0
mmap(NULL, 95592448, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41ee83000
mmap(NULL, 95617024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff40dcff000
munmap(0x7ff41ee83000, 95592448) = 0
mmap(NULL, 95617024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41ee7d000
munmap(0x7ff40dcff000, 95617024) = 0
munmap(0x7ff41382f000, 95592448) = 0
munmap(0x7ff4249ad000, 95592448) = 0
mmap(NULL, 95617024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff42a4d0000
mmap(NULL, 95617024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41934d000
mmap(NULL, 95617024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff41381d000
munmap(0x7ff41934d000, 95617024) = 0
munmap(0x7ff42a4d0000, 95617024) = 0