Lock: three run slots for functional runs; a measurement waits for all of them
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
00baf7501d
commit
be99cb3821
1 changed files with 17 additions and 4 deletions
|
|
@ -5,7 +5,8 @@
|
|||
# three at once use 12 of the 16 cores); waits when all are busy
|
||||
# tools/lock/with-lock.sh measure <command...> exclusive: waits for every build slot and blocks new builds
|
||||
# tools/lock/with-lock.sh run <command...> a functional run (test network, attack harness, simulator whose
|
||||
# outputs are counts, locks, forks, seconds): one at a time, builds continue
|
||||
# outputs are counts, locks, forks, seconds): one of THREE run slots,
|
||||
# builds continue; a measurement waits for all of them
|
||||
# tools/lock/with-lock.sh status who holds what, and for how long
|
||||
# Rule (4 October 2026): code and documents run in parallel; builds share three slots; measurements are exclusive.
|
||||
# Evening of 4 October: one build slot and a 3-hour network run under `measure` left twelve agents queued; hence the
|
||||
|
|
@ -15,7 +16,7 @@ set -euo pipefail
|
|||
kind="${1:-}"; shift || true
|
||||
dir=/tmp/igneum-locks; mkdir -p "$dir"
|
||||
if [ "$kind" = status ]; then
|
||||
for f in measure build build-0 build-1 build-2; do
|
||||
for f in measure build build-0 build-1 build-2 run-0 run-1 run-2; do
|
||||
[ -e "$dir/$f" ] || continue
|
||||
holder=$(python3 - "$dir/$f" <<'PY'
|
||||
import fcntl, sys, os
|
||||
|
|
@ -70,10 +71,22 @@ if mode == 'build':
|
|||
if got[0] != k: os.close(fd)
|
||||
held = [(f"build-{got[0]}", got[1])]
|
||||
elif mode == 'measure':
|
||||
for name in ['measure', 'build', 'build-0', 'build-1', 'build-2']:
|
||||
for name in ['measure', 'build', 'build-0', 'build-1', 'build-2', 'run-0', 'run-1', 'run-2']:
|
||||
fd = opened(name); wait_lock(fd, name); held.append((name, fd))
|
||||
else:
|
||||
fd = opened('measure'); wait_lock(fd, 'measure'); held.append(('measure', fd))
|
||||
# run: one of THREE run slots (functional runs on their own port ranges can overlap), none while a measurement
|
||||
# holds every slot; a measurement waits for every run slot in turn
|
||||
slots = [opened(f"run-{k}") for k in range(3)]
|
||||
got = None
|
||||
while got is None:
|
||||
for k, fd in enumerate(slots):
|
||||
if try_lock(fd): got = (k, fd); break
|
||||
if got is None:
|
||||
if time.time() - t0 > 7200: print("with-lock: gave up waiting for a run slot after 2 h", file=sys.stderr); sys.exit(1)
|
||||
time.sleep(5)
|
||||
for k, fd in enumerate(slots):
|
||||
if got[0] != k: os.close(fd)
|
||||
held = [(f"run-{got[0]}", got[1])]
|
||||
for name, fd in held:
|
||||
os.ftruncate(fd, 0); os.lseek(fd, 0, 0)
|
||||
os.write(fd, f"pid {os.getpid()} since {time.strftime('%H:%M:%S', time.gmtime())}Z waited {int(time.time()-t0)} s: {' '.join(cmd)[:120]}\n".encode())
|
||||
|
|
|
|||
Loading…
Reference in a new issue