Timeout error for #JV8

I’m stuck on Stage #JV8 with a timeout error. This may be similar to the following posts:
JV8 timing out when downloading a file,
#jv8: Cannot get it to work when running tests in codecrafters,
Execution time out on test #JV8.

I believe my download is asynchronous across multiple peers. I have also been minded to send cancel messages for a block received to all other peers after having received that block from one peer. It seems I still get stuck after Piece 7 (0-based), though, whether the test has 10 or 12 pieces in total. And for the test where there are only 4 pieces, the client isn’t downloading anything at all. This seems to suggest I am having trouble with the final two to four pieces. But I do not know what is stopping them from downloading the way the first 8 pieces download.

Here are my logs:

remote: [tester::#JV8] Running tests for Stage #JV8 (Download the whole file)
remote: [tester::#JV8] Running ./your_program.sh download -o /tmp/torrents1002386082/itsworking.gif /tmp/torrents1002386082/itsworking.gif.torrent
remote: [your_program] There are 10 pieces in total.
remote: [your_program] Piece 0 has 16 blocks.
remote: [your_program] Piece 1 has 16 blocks.
remote: [your_program] Piece 2 has 16 blocks.
remote: [your_program] Piece 3 has 16 blocks.
remote: [your_program] Piece 4 has 16 blocks.
remote: [your_program] Piece 5 has 16 blocks.
remote: [your_program] Piece 6 has 16 blocks.
remote: [your_program] Piece 7 has 16 blocks.
remote: [your_program] Piece 8 has 16 blocks.
remote: [your_program] Piece 9 has 12 blocks.
remote: [your_program] *********************************
remote: [your_program] Piece 0, Block 0 incoming.
remote: [your_program] Piece 0 has block 0.
remote: [your_program] Piece 0, Block 1 incoming.
remote: [your_program] Piece 0 has block 1.
remote: [your_program] Piece 0, Block 2 incoming.
remote: [your_program] Piece 0 has block 2.
remote: [your_program] Piece 0, Block 3 incoming.
remote: [your_program] Piece 0 has block 3.
remote: [your_program] Piece 0, Block 4 incoming.
remote: [your_program] Piece 0 has block 4.
remote: [your_program] Piece 0, Block 5 incoming.
remote: [your_program] Piece 0 has block 5.
remote: [your_program] Piece 0, Block 6 incoming.
remote: [your_program] Piece 0 has block 6.
remote: [your_program] Piece 0, Block 7 incoming.
remote: [your_program] Piece 0 has block 7.
remote: [your_program] Piece 0, Block 8 incoming.
remote: [your_program] Piece 0 has block 8.
remote: [your_program] Piece 0, Block 9 incoming.
remote: [your_program] Piece 0 has block 9.
remote: [your_program] Piece 0, Block 10 incoming.
remote: [your_program] Piece 0 has block 10.
remote: [your_program] Piece 0, Block 11 incoming.
remote: [your_program] Piece 0 has block 11.
remote: [your_program] Piece 0, Block 12 incoming.
remote: [your_program] Piece 0 has block 12.
remote: [your_program] Piece 0, Block 13 incoming.
remote: [your_program] Piece 0 has block 13.
remote: [your_program] Piece 0, Block 14 incoming.
remote: [your_program] Piece 0 has block 14.
remote: [your_program] Piece 0, Block 15 incoming.
remote: [your_program] Piece 0 has block 15.
remote: [your_program] Piece 1, Block 0 incoming.
remote: [your_program] Piece 1 has block 0.
remote: [your_program] Piece 1, Block 1 incoming.
remote: [your_program] Piece 1 has block 1.
remote: [your_program] Piece 1, Block 2 incoming.
remote: [your_program] Piece 1 has block 2.
remote: [your_program] Piece 1, Block 3 incoming.
remote: [your_program] Piece 1 has block 3.
remote: [your_program] Piece 1, Block 4 incoming.
remote: [your_program] Piece 1 has block 4.
remote: [your_program] Piece 1, Block 5 incoming.
remote: [your_program] Piece 1 has block 5.
remote: [your_program] Piece 1, Block 6 incoming.
remote: [your_program] Piece 1 has block 6.
remote: [your_program] Piece 1, Block 7 incoming.
remote: [your_program] Piece 1 has block 7.
remote: [your_program] Piece 1, Block 8 incoming.
remote: [your_program] Piece 1 has block 8.
remote: [your_program] Piece 1, Block 9 incoming.
remote: [your_program] Piece 1 has block 9.
remote: [your_program] Piece 1, Block 10 incoming.
remote: [your_program] Piece 1 has block 10.
remote: [your_program] Piece 1, Block 11 incoming.
remote: [your_program] Piece 1 has block 11.
remote: [your_program] Piece 1, Block 12 incoming.
remote: [your_program] Piece 1 has block 12.
remote: [your_program] Piece 1, Block 13 incoming.
remote: [your_program] Piece 1 has block 13.
remote: [your_program] Piece 1, Block 14 incoming.
remote: [your_program] Piece 1 has block 14.
remote: [your_program] Piece 1, Block 15 incoming.
remote: [your_program] Piece 1 has block 15.
remote: [your_program] Piece 2, Block 0 incoming.
remote: [your_program] Piece 2 has block 0.
remote: [your_program] Piece 2, Block 1 incoming.
remote: [your_program] Piece 2 has block 1.
remote: [your_program] Piece 2, Block 2 incoming.
remote: [your_program] Piece 2 has block 2.
remote: [your_program] Piece 2, Block 3 incoming.
remote: [your_program] Piece 2 has block 3.
remote: [your_program] Piece 2, Block 4 incoming.
remote: [your_program] Piece 2 has block 4.
remote: [your_program] Piece 2, Block 5 incoming.
remote: [your_program] Piece 2 has block 5.
remote: [your_program] Piece 2, Block 6 incoming.
remote: [your_program] Piece 2 has block 6.
remote: [your_program] Piece 2, Block 7 incoming.
remote: [your_program] Piece 2 has block 7.
remote: [your_program] Piece 2, Block 8 incoming.
remote: [your_program] Piece 2 has block 8.
remote: [your_program] Piece 2, Block 9 incoming.
remote: [your_program] Piece 2 has block 9.
remote: [your_program] Piece 2, Block 10 incoming.
remote: [your_program] Piece 2 has block 10.
remote: [your_program] Piece 2, Block 11 incoming.
remote: [your_program] Piece 2 has block 11.
remote: [your_program] Piece 2, Block 12 incoming.
remote: [your_program] Piece 2 has block 12.
remote: [your_program] Piece 2, Block 13 incoming.
remote: [your_program] Piece 2 has block 13.
remote: [your_program] Piece 2, Block 14 incoming.
remote: [your_program] Piece 2 has block 14.
remote: [your_program] Piece 2, Block 15 incoming.
remote: [your_program] Piece 2 has block 15.
remote: [your_program] Piece 3, Block 0 incoming.
remote: [your_program] Piece 3 has block 0.
remote: [your_program] Piece 3, Block 1 incoming.
remote: [your_program] Piece 3 has block 1.
remote: [your_program] Piece 3, Block 2 incoming.
remote: [your_program] Piece 3 has block 2.
remote: [your_program] Piece 3, Block 3 incoming.
remote: [your_program] Piece 3 has block 3.
remote: [your_program] Piece 3, Block 4 incoming.
remote: [your_program] Piece 3 has block 4.
remote: [your_program] Piece 3, Block 5 incoming.
remote: [your_program] Piece 3 has block 5.
remote: [your_program] Piece 3, Block 6 incoming.
remote: [your_program] Piece 3 has block 6.
remote: [your_program] Piece 3, Block 7 incoming.
remote: [your_program] Piece 3 has block 7.
remote: [your_program] Piece 3, Block 8 incoming.
remote: [your_program] Piece 3 has block 8.
remote: [your_program] Piece 3, Block 9 incoming.
remote: [your_program] Piece 3 has block 9.
remote: [your_program] Piece 3, Block 10 incoming.
remote: [your_program] Piece 3 has block 10.
remote: [your_program] Piece 3, Block 11 incoming.
remote: [your_program] Piece 3 has block 11.
remote: [your_program] Piece 3, Block 12 incoming.
remote: [your_program] Piece 3 has block 12.
remote: [your_program] Piece 3, Block 13 incoming.
remote: [your_program] Piece 3 has block 13.
remote: [your_program] Piece 3, Block 14 incoming.
remote: [your_program] Piece 3 has block 14.
remote: [your_program] Piece 3, Block 15 incoming.
remote: [your_program] Piece 3 has block 15.
remote: [your_program] Piece 4, Block 0 incoming.
remote: [your_program] Piece 4 has block 0.
remote: [your_program] Piece 4, Block 1 incoming.
remote: [your_program] Piece 4 has block 1.
remote: [your_program] Piece 4, Block 2 incoming.
remote: [your_program] Piece 4 has block 2.
remote: [your_program] Piece 4, Block 3 incoming.
remote: [your_program] Piece 4 has block 3.
remote: [your_program] Piece 4, Block 4 incoming.
remote: [your_program] Piece 4 has block 4.
remote: [your_program] Piece 4, Block 5 incoming.
remote: [your_program] Piece 4 has block 5.
remote: [your_program] Piece 4, Block 6 incoming.
remote: [your_program] Piece 4 has block 6.
remote: [your_program] Piece 4, Block 7 incoming.
remote: [your_program] Piece 4 has block 7.
remote: [your_program] Piece 4, Block 8 incoming.
remote: [your_program] Piece 4 has block 8.
remote: [your_program] Piece 4, Block 9 incoming.
remote: [your_program] Piece 4 has block 9.
remote: [your_program] Piece 4, Block 10 incoming.
remote: [your_program] Piece 4 has block 10.
remote: [your_program] Piece 4, Block 11 incoming.
remote: [your_program] Piece 4 has block 11.
remote: [your_program] Piece 4, Block 12 incoming.
remote: [your_program] Piece 4 has block 12.
remote: [your_program] Piece 4, Block 13 incoming.
remote: [your_program] Piece 4 has block 13.
remote: [your_program] Piece 4, Block 14 incoming.
remote: [your_program] Piece 4 has block 14.
remote: [your_program] Piece 4, Block 15 incoming.
remote: [your_program] Piece 4 has block 15.
remote: [your_program] Piece 5, Block 0 incoming.
remote: [your_program] Piece 5 has block 0.
remote: [your_program] Piece 5, Block 1 incoming.
remote: [your_program] Piece 5 has block 1.
remote: [your_program] Piece 5, Block 2 incoming.
remote: [your_program] Piece 5 has block 2.
remote: [your_program] Piece 5, Block 3 incoming.
remote: [your_program] Piece 5 has block 3.
remote: [your_program] Piece 5, Block 4 incoming.
remote: [your_program] Piece 5 has block 4.
remote: [your_program] Piece 5, Block 5 incoming.
remote: [your_program] Piece 5 has block 5.
remote: [your_program] Piece 5, Block 6 incoming.
remote: [your_program] Piece 5 has block 6.
remote: [your_program] Piece 5, Block 7 incoming.
remote: [your_program] Piece 5 has block 7.
remote: [your_program] Piece 5, Block 8 incoming.
remote: [your_program] Piece 5 has block 8.
remote: [your_program] Piece 5, Block 9 incoming.
remote: [your_program] Piece 5 has block 9.
remote: [your_program] Piece 5, Block 10 incoming.
remote: [your_program] Piece 5 has block 10.
remote: [your_program] Piece 5, Block 11 incoming.
remote: [your_program] Piece 5 has block 11.
remote: [your_program] Piece 5, Block 12 incoming.
remote: [your_program] Piece 5 has block 12.
remote: [your_program] Piece 5, Block 13 incoming.
remote: [your_program] Piece 5 has block 13.
remote: [your_program] Piece 5, Block 14 incoming.
remote: [your_program] Piece 5 has block 14.
remote: [your_program] Piece 5, Block 15 incoming.
remote: [your_program] Piece 5 has block 15.
remote: [your_program] Piece 6, Block 0 incoming.
remote: [your_program] Piece 6 has block 0.
remote: [your_program] Piece 6, Block 1 incoming.
remote: [your_program] Piece 6 has block 1.
remote: [your_program] Piece 6, Block 2 incoming.
remote: [your_program] Piece 6 has block 2.
remote: [your_program] Piece 6, Block 3 incoming.
remote: [your_program] Piece 6 has block 3.
remote: [your_program] Piece 6, Block 4 incoming.
remote: [your_program] Piece 6 has block 4.
remote: [your_program] Piece 6, Block 5 incoming.
remote: [your_program] Piece 6 has block 5.
remote: [your_program] Piece 6, Block 6 incoming.
remote: [your_program] Piece 6 has block 6.
remote: [your_program] Piece 6, Block 7 incoming.
remote: [your_program] Piece 6 has block 7.
remote: [your_program] Piece 6, Block 8 incoming.
remote: [your_program] Piece 6 has block 8.
remote: [your_program] Piece 6, Block 9 incoming.
remote: [your_program] Piece 6 has block 9.
remote: [your_program] Piece 6, Block 10 incoming.
remote: [your_program] Piece 6 has block 10.
remote: [your_program] Piece 6, Block 11 incoming.
remote: [your_program] Piece 6 has block 11.
remote: [your_program] Piece 6, Block 12 incoming.
remote: [your_program] Piece 6 has block 12.
remote: [your_program] Piece 6, Block 13 incoming.
remote: [your_program] Piece 6 has block 13.
remote: [your_program] Piece 6, Block 14 incoming.
remote: [your_program] Piece 6 has block 14.
remote: [your_program] Piece 6, Block 15 incoming.
remote: [your_program] Piece 6 has block 15.
remote: [your_program] Piece 7, Block 0 incoming.
remote: [your_program] Piece 7 has block 0.
remote: [your_program] Piece 7, Block 1 incoming.
remote: [your_program] Piece 7 has block 1.
remote: [your_program] Piece 7, Block 2 incoming.
remote: [your_program] Piece 7 has block 2.
remote: [your_program] Piece 7, Block 3 incoming.
remote: [your_program] Piece 7 has block 3.
remote: [your_program] Piece 7, Block 4 incoming.
remote: [your_program] Piece 7 has block 4.
remote: [your_program] Piece 7, Block 5 incoming.
remote: [your_program] Piece 7 has block 5.
remote: [your_program] Piece 7, Block 6 incoming.
remote: [your_program] Piece 7 has block 6.
remote: [your_program] Piece 7, Block 7 incoming.
remote: [your_program] Piece 7 has block 7.
remote: [your_program] Piece 7, Block 8 incoming.
remote: [your_program] Piece 7 has block 8.
remote: [your_program] Piece 7, Block 9 incoming.
remote: [your_program] Piece 7 has block 9.
remote: [your_program] Piece 7, Block 10 incoming.
remote: [your_program] Piece 7 has block 10.
remote: [your_program] Piece 7, Block 11 incoming.
remote: [your_program] Piece 7 has block 11.
remote: [your_program] Piece 7, Block 12 incoming.
remote: [your_program] Piece 7 has block 12.
remote: [your_program] Piece 7, Block 13 incoming.
remote: [your_program] Piece 7 has block 13.
remote: [your_program] Piece 7, Block 14 incoming.
remote: [your_program] Piece 7 has block 14.
remote: [your_program] Piece 7, Block 15 incoming.
remote: [your_program] Piece 7 has block 15.
remote: [tester::#JV8] execution timed out
remote: [tester::#JV8] Test failed

(The files come in in order probably because the requests are sent in order. But I believe (from earlier tests where I didn’t send cancel messages) that they sometimes not all from one peer, though I haven’t printed out which peer they are coming from.) Would appreciate ideas of what might be going wrong! Thank you!

And for the test where there are only 4 pieces, the client isn’t downloading anything at all.

Hey @ptrhcpang, I added a log here:

But for the 4-piece case, nothing gets printed:

This seems to suggest I am having trouble with the final two to four pieces.

In other words, the current code is failing to request a specific piece. Ideally, issues like this should have been caught in the earlier #nd2 Download a piece stage.

Suggestion:

  • Try merging handle_receive and handle_receive2.

This way, you can ensure it’s thoroughly tested in #nd2, and reuse the same verified logic in the current stage.

Thanks so much for pointing this out! I shall have a look at the conditions under which request messages are sent. Not entirely sure what actually is wrong yet, and I hope to update this thread when I find out, in case someone else runs into a similar problem.

I wrote a separate but similar handler for incoming messages (handle_receive2) for #JV8 in order not to touch what appeared to have been working in #ND2, and plan to have handle_receive2 supersede all instances of handle_receive when I know handle_receive2 works, in the refactoring stage after passing #JV8.

Thank you again!

1 Like

Update: I believe it is a design issue rather than a code issue.

I used the function that handles incoming messages simultaneously to queue messages that need to be sent. For example, I queued request messages on receipt of an unchoke message. This means that if the messages to be sent (say, request messages) do not fit into the send buffer, or some other bad thing happens, then there is no chance for a request message to be queued/sent again.

One solution can be to let the function for parsing and handling incoming messages update a global variable that notifies the function for sending out messages both to queue and to send messages that need to be sent. (Or indeed, have a three separate functions for receiving, queuing, and sending messages.)

1 Like

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.