Stuck on replication #ZN8

Hi All,
Need help in debugging this stage (replication -11). I am able to individually run a master, replica and connect with redis-cli clients to the master to watch the logs on the replication. The tester program expecting some output which I am not able to figure out, the logs are so general.

Any help appreciated
code : toy-redis-python/app/main.py at master · Jothikumar-ekanath/toy-redis-python · GitHub
Below are the console Logs
Debug = true

[replication-11] Running tests for Replication > Stage #11: Single-replica propagation
[replication-11] $ ./spawn_redis_server.sh --port 6379
[your_program] master - Starting the server coroutine on port 6379
[your_program] master - Server running on (‘127.0.0.1’, 6379)
[replication-11] replica: $ redis-cli PING
[replication-11] replica: Sent bytes: “*1\r\n$4\r\nPING\r\n”
[replication-11] replica: Received bytes: “+PONG\r\n”
[replication-11] replica: Received RESP value: “PONG”
[your_program] master - Waiting for the next command from the client…(‘::1’, 55828, 0, 0)
[your_program] master - Waiting for the next command from the client…(‘::1’, 55832, 0, 0)
[your_program] master - RESP parsed_req: [‘PING’] for client (‘::1’, 55832, 0, 0)
[your_program] master - Waiting for the next command from the client…(‘::1’, 55832, 0, 0)
[replication-11] Received “PONG”
[replication-11] replica: $ redis-cli REPLCONF listening-port 6380
[replication-11] replica: Sent bytes: “*3\r\n$8\r\nREPLCONF\r\n$14\r\nlistening-port\r\n$4\r\n6380\r\n”
[replication-11] replica: Received bytes: “+OK\r\n”
[replication-11] replica: Received RESP value: “OK”
[your_program] master - RESP parsed_req: [‘REPLCONF’, ‘listening-port’, ‘6380’] for client (‘::1’, 55832, 0, 0)
[your_program] master - Replica connections added for (‘::1’, 55832, 0, 0)
[your_program] master - Waiting for the next command from the client…(‘::1’, 55832, 0, 0)
[replication-11] Received “OK”
[replication-11] replica: $ redis-cli REPLCONF capa psync2
[replication-11] replica: Sent bytes: “*3\r\n$8\r\nREPLCONF\r\n$4\r\ncapa\r\n$6\r\npsync2\r\n”
[replication-11] replica: Received bytes: “+OK\r\n”
[replication-11] replica: Received RESP value: “OK”
[your_program] master - RESP parsed_req: [‘REPLCONF’, ‘capa’, ‘psync2’] for client (‘::1’, 55832, 0, 0)
[your_program] master - Waiting for the next command from the client…(‘::1’, 55832, 0, 0)
[replication-11] Received “OK”
[replication-11] replica: $ redis-cli PSYNC ? -1
[replication-11] replica: Sent bytes: “*3\r\n$5\r\nPSYNC\r\n$1\r\n?\r\n$2\r\n-1\r\n”
[replication-11] replica: Received bytes: “+FULLRESYNC 8371b4fb1155b71f4a04d3e1bc3e18c4a990aeeb 0\r\n”
[replication-11] replica: Received RESP value: “FULLRESYNC 8371b4fb1155b71f4a04d3e1bc3e18c4a990aeeb 0”
[replication-11] Received “FULLRESYNC 8371b4fb1155b71f4a04d3e1bc3e18c4a990aeeb 0”
[replication-11] Reading RDB file…
[your_program] master - RESP parsed_req: [‘PSYNC’, ‘?’, ‘-1’] for client (‘::1’, 55832, 0, 0)
[your_program] master - Waiting for the next command from the client…(‘::1’, 55832, 0, 0)
[replication-11] replica: Received bytes: “$88\r\nREDIS0011\xfa\tredis-ver\x057.2.0\xfa\nredis-bits\xc0@\xfa\x05ctime\xc2m\b\xbce\xfa\bused-mem°\xc4\x10\x00\xfa\baof-base\xc0\x00\xff\xf0n;\xfe\xc0\xffZ\xa2”
[replication-11] Received RDB file
[replication-11] client: $ redis-cli SET foo 123
[replication-11] client: Sent bytes: “*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\n123\r\n”
[replication-11] client: Received bytes: “+OK\r\n”
[replication-11] client: Received RESP value: “OK”
[your_program] master - RESP parsed_req: [‘SET’, ‘foo’, ‘123’] for client (‘::1’, 55828, 0, 0)
[your_program] sent b’*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\n123\r\n’ to replica (‘::1’, 55832, 0, 0)
[your_program] master - Waiting for the next command from the client…(‘::1’, 55828, 0, 0)
[replication-11] Received “OK”
[replication-11] client: $ redis-cli SET bar 456
[replication-11] client: Sent bytes: “*3\r\n$3\r\nSET\r\n$3\r\nbar\r\n$3\r\n456\r\n”
[your_program] master - RESP parsed_req: [‘SET’, ‘bar’, ‘456’] for client (‘::1’, 55828, 0, 0)
[your_program] sent b’*3\r\n$3\r\nSET\r\n$3\r\nbar\r\n$3\r\n456\r\n’ to replica (‘::1’, 55832, 0, 0)
[your_program] master - Waiting for the next command from the client…(‘::1’, 55828, 0, 0)
**[replication-11] Received: “” (no content received)**
**[replication-11] ^ error**
**[replication-11] Error: Expected start of a new RESP2 value (either +, -, :, $ or *)**
**[replication-11] Test failed**
[replication-11] Terminating program
[replication-11] Program terminated successfully

This is no longer a blocker, was able to fix it. I had used same variable name for writing into client sockets ( both clients connecting to server, also writing to replica’s)
I still need to refactor the code in a better way so that these issues can be debug

The error message from the tester should have been a little bit elaborative on what it is doing and why we see the message

Hi, I have the same issue here, would you mind explaining a little bit more about this issue and how did you solve it? Much much appreciated! Thanks

The error message given by the tester is so generic, it will hard to debug. Please post the complete error log and code. I can try to debug.

I had a bug in my code where I used the same variable name for both master writing to clients and master replicating the set commands to replicas. once I fixed, the issue resolved

Thanks for responding. It looks like I have passed this stage after making multiple changes in my code. As you say, the error given is so generic and makes it really hard to debug.

Also, you mentioned the complete error log, do you mean that you can see some sort of detailed error log somewhere in the codecrafters log? I might be missing some information on how to use the codecrafters!

yes, It is hard to debug just using tester’s console output.

Please add more print statements in your code. Along with your print statements and the testers console log output it will eventually become easier to debug

Complete error log, I meant the console output when you run the tests.

We’re adding logs here to make it more clear what the tester expects. Will keep this open until that’s done!

1 Like

Note: I’ve updated the title of this post to include the stage ID (#ZN8). You can learn about the stages rename here: Upcoming change: Stages overhaul.

Logs should now include more details like “Expecting commands to be propagated”.

We’re also going to work on splitting logs into multiple stages (handshake, propagation etc.). Will close for now and wait for similar reports before we make further changes here!