fix(rest): download unknown cid

Downloading a CID that is unknown to the network would wait for the blockexchange to try to get the data. However, a subsequent API call, eg upload for that CID, or a blockexchange timeout would cause the dagger node to crash, due to an attempt to complete a future that had already been completed.

We were able to narrow this down to an attempt to call  `resp.finish()` when the download block had already returned an `RestApiResponse` (and never sent any chunks to the response from the libp2p stream).

Change the HTTP response code for an unknown cid from 400 to 404.

Fix spelling mistake “cunk”.

Co-authored-by: Michael Bradley <michaelsbradleyjr@gmail.com>
This commit is contained in:
Eric Mastro 2022-01-31 13:24:09 +11:00
parent 5f48de6a44
commit d87ea97b34
No known key found for this signature in database
GPG Key ID: 141E3048D95A4E63
1 changed files with 3 additions and 3 deletions

View File

@ -111,7 +111,7 @@ proc initRestApi*(node: DaggerNodeRef): RestRouter =
if (
let retr = await node.retrieve(stream, id.get());
retr.isErr):
return RestApiResponse.error(Http400, retr.error.msg)
return RestApiResponse.error(Http404, retr.error.msg)
await resp.prepareChunked()
while not stream.atEof:
@ -124,15 +124,15 @@ proc initRestApi*(node: DaggerNodeRef): RestRouter =
break
bytes += buff.len
trace "Sending cunk", size = buff.len
trace "Sending chunk", size = buff.len
await resp.sendChunk(addr buff[0], buff.len)
await resp.finish()
except CatchableError as exc:
trace "Excepting streaming blocks", exc = exc.msg
return RestApiResponse.error(Http500)
finally:
trace "Sent bytes", cid = id.get(), bytes
await stream.close()
await resp.finish()
router.rawApi(
MethodPost,