Page MenuHomeSoftware Heritage

swh-graph: "Cannot open client FIFO" when answering HEAD requests
Closed, MigratedEdits Locked

Description

The current implementation of HEAD requests works fine from the point of view of the client, but makes the Java backend fail with a traceback when trying to write the body of the answer (to the Py4J middleware, I *think*). Example follows:

Client:

$ curl --head http://0.0.0.0:5009/graph/leaves/swh:1:ori:44ae7491d67a6879a1fba30cadb189c60e34b877
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Date: Tue, 12 Nov 2019 13:55:49 GMT
Server: Python/3.7 aiohttp/3.5.4

Server:

$ swh graph rpc-serve -g sample/big/compressed/swh-graph
INFO:root:using swh-graph JAR: /home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/java/target/swh-graph-0.2.0.jar
Loading graph sample/big/compressed/swh-graph ...
Graph loaded.
======== Running on http://0.0.0.0:5009 ========
(Press CTRL+C to quit)
ERROR:root:
Traceback (most recent call last):
  File "/home/zack/dati/projects/sw-heritage/git/swh-environment/swh-core/swh/core/api/asynchronous.py", line 56, in middleware_handler
    return await handler(request)
  File "/home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/swh/graph/server/app.py", line 119, in simple_traversal
    ttype, direction, edges, src_node
  File "/home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/swh/graph/backend.py", line 109, in simple_traversal
    async for node_id in method(direction, edges_fmt, src):
  File "/home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/swh/graph/backend.py", line 208, in java_call_iterator
    async for value in reader:
  File "/home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/swh/graph/backend.py", line 169, in read_node_ids
    with (await asyncio.wait_for(open_thread, timeout=2)) as f:
  File "/usr/lib/python3.7/asyncio/tasks.py", line 435, in wait_for
    await waiter
concurrent.futures._base.CancelledError
ERROR:aiohttp.server:Unhandled exception
Traceback (most recent call last):
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/aiohttp/web_protocol.py", line 447, in start
    await resp.prepare(request)
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/aiohttp/web_response.py", line 353, in prepare
    return await self._start(request)
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/aiohttp/web_response.py", line 667, in _start
    return await super()._start(request)
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/aiohttp/web_response.py", line 410, in _start
    await writer.write_headers(status_line, headers)
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/aiohttp/http_writer.py", line 112, in write_headers
    self._write(buf)
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/aiohttp/http_writer.py", line 67, in _write
    raise ConnectionResetError('Cannot write to closing transport')
ConnectionResetError: Cannot write to closing transport
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<JavaStreamProxy._HandlerWrapper.__getattr__.<locals>.java_call() done, defined at /home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/swh/graph/backend.py:184> exception=Py4JJavaError('An error occurred while calling o1.leaves.\n', JavaObject id=o2)>
Traceback (most recent call last):
  File "/home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/swh/graph/backend.py", line 186, in java_call
    await loop.run_in_executor(None, lambda: func(*args, **kwargs))
  File "/usr/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/zack/dati/projects/sw-heritage/git/swh-environment/swh-graph/swh/graph/backend.py", line 186, in <lambda>
    await loop.run_in_executor(None, lambda: func(*args, **kwargs))
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/py4j/java_gateway.py", line 1286, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/home/zack/.virtualenvs/swh/lib/python3.7/site-packages/py4j/protocol.py", line 328, in get_return_value
    format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling o1.leaves.
: java.lang.RuntimeException: Cannot open client FIFO: java.io.FileNotFoundException: /tmp/swh-graph-_e6bobe5/swh-graph.fifo (No such file or directory)
	at org.softwareheritage.graph.Entry$QueryHandler.open(Entry.java:101)
	at org.softwareheritage.graph.Entry$QueryHandler.leaves(Entry.java:114)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
	at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
	at py4j.Gateway.invoke(Gateway.java:282)
	at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
	at py4j.commands.CallCommand.execute(CallCommand.java:79)
	at py4j.GatewayConnection.run(GatewayConnection.java:238)
	at java.base/java.lang.Thread.run(Thread.java:834)

Event Timeline

zack triaged this task as Low priority.Nov 12 2019, 2:58 PM
zack created this task.
seirl claimed this task.
seirl added a subscriber: seirl.

No longer happens after the GRPC migration:

INFO:aiohttp.access:127.0.0.1 [30/Jun/2022:14:19:08 +0000] "HEAD /graph/leaves/swh:1:rel:0000000000000000000000000000000000000019 HTTP/1.1" 405 180 "-" "curl/7.84.0"