85 lines
4.2 KiB
Python
85 lines
4.2 KiB
Python
"""Bounded execution recorder; refuses to overwrite evidence or repeat a run."""
|
|
import datetime
|
|
import hashlib
|
|
import importlib.metadata
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
import platform
|
|
import resource
|
|
import shlex
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
|
|
evidence = Path(__file__).resolve().parent
|
|
base = evidence.parent
|
|
script = base / "local_stress_observable_v1.py"
|
|
reference = base / "cpu_reference.py"
|
|
expected_env = {
|
|
"OPENBLAS_NUM_THREADS": "1",
|
|
"PYTHONDONTWRITEBYTECODE": "1",
|
|
"PYTHONNOUSERSITE": "1",
|
|
"PYTHONOPTIMIZE": "0",
|
|
"PYTHONPATH": str(base),
|
|
"CPU_REFERENCE_PATH": str(reference),
|
|
}
|
|
limits = {
|
|
"address_space_bytes": (resource.RLIMIT_AS, 268435456),
|
|
"output_file_bytes": (resource.RLIMIT_FSIZE, 2097152),
|
|
"core_bytes": (resource.RLIMIT_CORE, 0),
|
|
}
|
|
assert all(os.environ.get(k) == v for k, v in expected_env.items())
|
|
assert all(resource.getrlimit(key) == (value, value) for key, value in limits.values())
|
|
assert sys.executable == "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python"
|
|
assert hashlib.sha256(script.read_bytes()).hexdigest() == "0e2777990359a7cf2bb29884173b7b01de37c49bcf49e1f29fc59fe83d62b456"
|
|
assert hashlib.sha256(reference.read_bytes()).hexdigest() == "bba2a06a9f6517b32079ffff15e4060d8c3b7ed35f16ca134e1877226c9e4e1e"
|
|
input_hashes = {'local_stress_observable_v1.py': '0e2777990359a7cf2bb29884173b7b01de37c49bcf49e1f29fc59fe83d62b456', 'stdout_local_stress_observable_v1.txt': '6a826e5ad729ce45af6879a07a1c659d8b4a21403fde5b9c6d9696cc6a5b09d4', 'TABLE_local_stress_observable_v1.md': 'd8ff0568d9c473a4bb09396a8948ddc8dc5af2f0f3a23ac84d238814fc779501', 'source_manifest.json': 'd2cf90b73458f493c665c9a281d06aef0c190cf0d143639fb77ab838c78f020c'}
|
|
for name, digest in input_hashes.items():
|
|
path = (base if name.endswith(".py") else evidence) / name
|
|
assert hashlib.sha256(path.read_bytes()).hexdigest() == digest, name
|
|
archive_path = Path("/tmp/celerislab-local-stress-input-20261013-0e277799.tar")
|
|
archive_sha = "5834b23711496beb152188df5f47ff8175baf7e52543774401bd2c1183433eed"
|
|
assert hashlib.sha256(archive_path.read_bytes()).hexdigest() == archive_sha
|
|
log_path = evidence / "stdout_horsea.txt"
|
|
result_path = evidence / "results_horsea.json"
|
|
assert not log_path.exists() and not result_path.exists(), "Existing execution evidence; do not rerun"
|
|
prefix = ["/usr/bin/prlimit", "--as=268435456", "--fsize=2097152", "--core=0", "--", sys.executable, "-B"]
|
|
command = prefix + [str(script)]
|
|
report = {
|
|
"started_utc": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
|
"cwd": str(base),
|
|
"parent_command": ["env"] + [f"{k}={v}" for k, v in expected_env.items()] + prefix + [str(Path(__file__).resolve())],
|
|
"script_command": command,
|
|
"environment": expected_env,
|
|
"python_version": sys.version,
|
|
"numpy_version_from_installed_metadata": importlib.metadata.version("numpy"),
|
|
"platform": platform.platform(),
|
|
"hard_limits": {name: resource.getrlimit(key) for name, (key, _) in limits.items()},
|
|
"input_hashes_verified_before_execution": input_hashes,
|
|
"archive_sha256_verified_before_execution": archive_sha,
|
|
"reference_sha256_verified_before_execution": hashlib.sha256(reference.read_bytes()).hexdigest(),
|
|
"planned_runs": 7,
|
|
"coarse_steps_per_run": 32,
|
|
"attempt": 1,
|
|
}
|
|
with log_path.open("xb", buffering=0) as log:
|
|
log.write(("RECORDER " + json.dumps(report) + "\nCOMMAND " + shlex.join(command) + "\n").encode())
|
|
start = time.monotonic()
|
|
child = subprocess.run(command, cwd=base, stdout=log, stderr=subprocess.STDOUT, check=False)
|
|
report.update(
|
|
returncode=child.returncode,
|
|
elapsed_seconds=time.monotonic() - start,
|
|
child_peak_rss_MiB=resource.getrusage(resource.RUSAGE_CHILDREN).ru_maxrss / 1024,
|
|
parent_peak_rss_MiB=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024,
|
|
completed_utc=datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
|
)
|
|
log.write(("\nRUN_RESULT " + json.dumps(report) + "\n").encode())
|
|
report["stdout_bytes"] = log_path.stat().st_size
|
|
with result_path.open("x") as result:
|
|
json.dump(report, result, indent=2)
|
|
result.write("\n")
|
|
print(json.dumps(report, indent=2))
|
|
assert report["stdout_bytes"] < 2097152
|
|
sys.exit(child.returncode if child.returncode >= 0 else 1)
|