← run

env-03-elect-collect

0.000
0/4 tests· goal-state-env
Challenge · difficulty 5/5
# Leader election + aggregation

Four peers (`peer0`..`peer3`) run on a private network, fully connected — each can reach the other
three. There is **no coordinator**. Every peer starts with:

- `priority.txt` — a unique integer priority,
- `value.txt` — an integer value.

Implement `peer.py` so the peers cooperatively:

1. **Elect a leader** = the peer with the highest priority.
2. **Aggregate**: every non-leader peer hands its value to the leader. The leader computes the
   **sum of all four values** (including its own) once it has heard from everyone, and writes
   `SUM=<total>` to `result.txt`. Each non-leader writes `OK` to `result.txt`.

Discovery contract (environment variables):

- `PORT` — the port your peer must listen on.
- `PEER_<NAME>_HOST` / `PEER_<NAME>_PORT` — address of each other peer (e.g. `PEER_PEER1_HOST`).

No peer knows its own name, so identify the leader by its priority value. The leader must not
finalize until it has collected a value from **every** peer (count them from the discovery vars).
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": "ls -la && cat priority.txt 2>/dev/null && cat value.txt 2>/dev/null"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul  2 14:39 .\ndrwx------ 6 psc psc 4096 Jul  2 14:39 ..\n-rw-rw-r-- 1 psc psc    2 Jul  2 14:39 priority.txt\n-rw-rw-r-- 1 psc psc    3 Jul  
[turn 3] run({"node": "peer1", "cmd": "ls -la && cat priority.txt 2>/dev/null && cat value.txt 2>/dev/null"}) -> {"rc": 0, "output": "total 16\ndrwxrwxr-x 2 psc psc 4096 Jul  2 14:39 .\ndrwx------ 6 psc psc 4096 Jul  2 14:39 ..\n-rw-rw-r-- 1 psc psc    3 Jul  2 14:39 priority.txt\n-rw-rw-r-- 1 psc psc    3 Jul  
[turn 4] run({"node": "peer2", "cmd": "cat priority.txt && cat value.txt"}) -> {"rc": 0, "output": "15\n30\n"}
[turn 5] run({"node": "peer3", "cmd": "cat priority.txt && cat value.txt"}) -> {"rc": 0, "output": "4\n40\n"}
[turn 6] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nfrom concurrent.futures import ThreadPoolExecutor\n\ndef get_priority() -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 7] run({"node": "peer0", "cmd": "python peer.py &"}) -> {"rc": 0, "output": ""}
[turn 8] run({"node": "peer1", "cmd": "python peer.py &"}) -> {"rc": 0, "output": "python: can't open file '/tmp/psenv-env-03-elect-collect-c4dx9g5r/peer1/peer.py': [Errno 2] No such file or directory\n"}
[turn 9] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nfrom concurrent.futures import ThreadPoolExecutor\n\ndef get_priority() -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 10] write_file({"node": "peer2", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nfrom concurrent.futures import ThreadPoolExecutor\n\ndef get_priority() -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 11] write_file({"node": "peer3", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\nfrom concurrent.futures import ThreadPoolExecutor\n\ndef get_priority() -> {"ok": true, "node": "peer3", "path": "peer.py"}
[turn 12] verify({}) -> {"passed": false, "checks": [{"name": "leader peer1 totalled all values", "ok": false, "detail": "peer1='SUM=20' want 'SUM=100'"}, {"name": "peer0 deferred to the leader", "ok": false, "detail": "peer
[turn 13] write_file({"node": "peer0", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\ndef get_priority():\n    with open('priority.txt', 'r') as f:\n     ) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 14] write_file({"node": "peer1", "path": "peer.py", "content": "#!/usr/bin/env python3\nimport os\nimport socket\nimport threading\nimport time\n\ndef get_priority():\n    with open('priority.txt', 'r') as f:\n     ) -> {"ok": true, "node": "peer1", "path": "peer.py"}