← run

env-02-gossip-max

0.333
1/3 tests· goal-state-env
Challenge · difficulty 4/5
# Gossip convergence — global maximum

Three peer nodes (`peer0`, `peer1`, `peer2`) are on a private network, each running the **same**
program `peer.py` (launched as `python peer.py`). There is no coordinator.

- Each peer starts with an integer in `value.txt` in its working directory.
- Each peer listens on the port given by the `PORT` environment variable.
- Each peer is told its two peers' addresses via environment variables
  `PEER_<NAME>_HOST` / `PEER_<NAME>_PORT` (e.g. `PEER_PEER1_HOST`, `PEER_PEER1_PORT`).

Write `peer.py` so that, by exchanging information with its peers, **every** peer determines the
**global maximum** of all three starting values and writes it (as a decimal string) to `result.txt`
in its working directory. The peers must converge even though they start at different times.

Only the Python standard library is available (no internet, no pip). The same `peer.py` runs on all
three nodes.
Proposed solution
[turn 1] list_nodes({}) -> {"nodes": [{"name": "peer0", "provides": "python peer.py", "ports": [9000], "needs": ["peer1", "peer2"]}, {"name": "peer1", "provides": "python peer.py", "ports": [9000], "needs": ["peer0", "peer2"]},
[turn 2] write_file({"node": "peer0", "path": "peer.py", "content": "import socket\nimport threading\nimport time\nimport os\nimport random\n\n# Read initial value\nwith open('value.txt', 'r') as f:\n    initial_value = ) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 3] write_file({"node": "peer1", "path": "peer.py", "content": "import socket\nimport threading\nimport time\nimport os\nimport random\n\n# Read initial value\nwith open('value.txt', 'r') as f:\n    initial_value = ) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 4] write_file({"node": "peer2", "path": "peer.py", "content": "import socket\nimport threading\nimport time\nimport os\nimport random\n\n# Read initial value\nwith open('value.txt', 'r') as f:\n    initial_value = ) -> {"ok": true, "node": "peer2", "path": "peer.py"}
[turn 5] verify({}) -> {"passed": false, "checks": [{"name": "peer0 converged", "ok": false, "detail": "peer0='' want 12"}, {"name": "peer1 converged", "ok": false, "detail": "peer1='' want 12"}, {"name": "peer2 converged",
[turn 6] read_file({"node": "peer0", "path": "result.txt"}) -> {"error": "no such file: result.txt"}
[turn 7] read_file({"node": "peer0", "path": "value.txt"}) -> {"content": "5\n"}
[turn 8] read_file({"node": "peer1", "path": "value.txt"}) -> {"content": "12\n"}
[turn 9] read_file({"node": "peer2", "path": "value.txt"}) -> {"content": "3\n"}
[turn 10] write_file({"node": "peer0", "path": "peer.py", "content": "import socket\nimport threading\nimport time\nimport os\nimport random\n\n# Read initial value\nwith open('value.txt', 'r') as f:\n    initial_value = ) -> {"ok": true, "node": "peer0", "path": "peer.py"}
[turn 11] write_file({"node": "peer1", "path": "peer.py", "content": "import socket\nimport threading\nimport time\nimport os\nimport random\n\n# Read initial value\nwith open('value.txt', 'r') as f:\n    initial_value = ) -> {"ok": true, "node": "peer1", "path": "peer.py"}
[turn 12] write_file({"node": "peer2", "path": "peer.py", "content": "import socket\nimport threading\nimport time\nimport os\nimport random\n\n# Read initial value\nwith open('value.txt', 'r') as f:\n    initial_value = ) -> {"ok": true, "node": "peer2", "path": "peer.py"}