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] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nfrom urllib.request impor) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 3] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nfrom urllib.request impor) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 4] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nfrom urllib.request impor) -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 5] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport time\nimport threading\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nfrom urllib.request impor) -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 6] verify({}) -> {"passed": false, "checks": [{"name": "verifier crashed", "ok": false, "detail": "NotImplementedError: this provider cannot change the network at runtime"}], "launch_errors": []}
[turn 7] read_file({"node": "peer0", "path": "result.txt"}) -> {"content": "alpha,bravo,charlie,delta"}
[turn 8] read_file({"node": "peer1", "path": "result.txt"}) -> {"content": "alpha,bravo,charlie,delta"}
[turn 9] read_file({"node": "peer2", "path": "result.txt"}) -> {"content": "alpha,bravo,charlie,delta"}
[turn 10] read_file({"node": "peer3", "path": "result.txt"}) -> {"content": "alpha,bravo,charlie,delta"}
[turn 11] verify({}) -> {"passed": false, "checks": [{"name": "verifier crashed", "ok": false, "detail": "NotImplementedError: this provider cannot change the network at runtime"}], "launch_errors": []}
[turn 12] read_file({"node": "peer0", "path": "element.txt"}) -> {"content": "alpha\n"}
[turn 13] read_file({"node": "peer1", "path": "element.txt"}) -> {"content": "bravo\n"}
[turn 14] read_file({"node": "peer2", "path": "element.txt"}) -> {"content": "charlie\n"}