env-05-partition-heal
0.000
Challenge · difficulty 5/5
# Partition recovery Four peers run a grow-only set (G-Set CRDT). They start **split by a network partition**: `peer0` and `peer1` (side A) can reach each other but not `peer2`/`peer3`; side B (`peer2`, `peer3`) is symmetric. Each peer seeds one distinct element (`element.txt`). Implement `peer.py` so that the peers run **anti-entropy gossip**: each serves its current set and continuously merges in its reachable peers' sets, writing the sorted, comma-joined set to `result.txt`. While partitioned, each side will only know its own two elements. **After the partition heals**, every peer must converge on the union of all four elements. The merge must be safe to repeat (a set union is idempotent + commutative), and peers must keep retrying every peer so reconciliation resumes once cross-side links come back. Discovery: `PORT` (your listen port) and `PEER_<NAME>_HOST` / `PEER_<NAME>_PORT` for each peer.
Proposed solution
[turn 1] list_nodes({}) -> {"nodes": [{"name": "peer0", "provides": "python peer.py", "ports": [9000], "needs": ["peer1", "peer2", "peer3"]}, {"name": "peer1", "provides": "python peer.py", "ports": [9000], "needs": ["peer0", "
[turn 2] run({"node": "peer0", "cmd": "env | grep -E 'PORT|PEER'"}) -> {"rc": 0, "output": "PORT=35195\nPORTS=35195\nPEER_PEER1_HOST=127.0.0.1\nPEER_PEER2_HOST=127.0.0.1\nPEER_PEER3_HOST=127.0.0.1\nPEER_PEER1_PORT=53217\nPEER_PEER2_PORT=37781\nPEER_PEER3_PORT=38093\n"}
[turn 3] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nimport json\n\n# Get environment variables\nMY_PORT = int(os.environ[') -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 4] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nimport json\n\n# Get environment variables\nMY_PORT = int(os.environ[') -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 5] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nimport json\n\n# Get environment variables\nMY_PORT = int(os.environ[') -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 6] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nimport json\n\n# Get environment variables\nMY_PORT = int(os.environ[') -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 7] run({"node": "peer0", "cmd": "ls -la"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul 2 15:34 .\ndrwx------ 6 psc psc 4096 Jul 2 15:33 ..\n-rw-rw-r-- 1 psc psc 6 Jul 2 15:33 element.txt\n-rw-rw-r-- 1 psc psc 3240 Jul 2
[turn 8] run({"node": "peer1", "cmd": "ls -la"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul 2 15:34 .\ndrwx------ 6 psc psc 4096 Jul 2 15:33 ..\n-rw-rw-r-- 1 psc psc 6 Jul 2 15:33 element.txt\n-rw-rw-r-- 1 psc psc 3240 Jul 2
[turn 9] run({"node": "peer2", "cmd": "ls -la"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul 2 15:34 .\ndrwx------ 6 psc psc 4096 Jul 2 15:33 ..\n-rw-rw-r-- 1 psc psc 8 Jul 2 15:33 element.txt\n-rw-rw-r-- 1 psc psc 3240 Jul 2
[turn 10] run({"node": "peer3", "cmd": "ls -la"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul 2 15:34 .\ndrwx------ 6 psc psc 4096 Jul 2 15:33 ..\n-rw-rw-r-- 1 psc psc 6 Jul 2 15:33 element.txt\n-rw-rw-r-- 1 psc psc 3240 Jul 2
[turn 11] read_file({"node": "peer0", "path": "element.txt"}) -> {"content": "alpha\n"}
[turn 12] read_file({"node": "peer1", "path": "element.txt"}) -> {"content": "bravo\n"}
[turn 13] read_file({"node": "peer2", "path": "element.txt"}) -> {"content": "charlie\n"}
[turn 14] read_file({"node": "peer3", "path": "element.txt"}) -> {"content": "delta\n"}