test(perception): seal source end marker before IPC shutdown

This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 12:28:23 +03:00
parent da60feff90
commit a937400942
@@ -145,6 +145,7 @@ def producer(args):
}, },
) )
end_ns = time.monotonic_ns() end_ns = time.monotonic_ns()
(root / "source-end.json").write_text(json.dumps({"end_monotonic_ns": str(end_ns)}))
sender.end() sender.end()
else: else:
connection.sendall(wire.open_packet(identity, "recorded-acquisition", 1)) connection.sendall(wire.open_packet(identity, "recorded-acquisition", 1))
@@ -164,8 +165,8 @@ def producer(args):
connection.sendall(payload) connection.sendall(payload)
emit_json(journal, record(event)) emit_json(journal, record(event))
end_ns = time.monotonic_ns() end_ns = time.monotonic_ns()
(root / "source-end.json").write_text(json.dumps({"end_monotonic_ns": str(end_ns)}))
connection.close() # Deliberate EOF between fragments; no End. connection.close() # Deliberate EOF between fragments; no End.
(root / "source-end.json").write_text(json.dumps({"end_monotonic_ns": str(end_ns)}))
# The supervised source child remains alive until owned-group cleanup. # The supervised source child remains alive until owned-group cleanup.
# Its normal completion is not mistaken for an unexpected model death. # Its normal completion is not mistaken for an unexpected model death.
threading.Event().wait(30) threading.Event().wait(30)
@@ -184,11 +185,12 @@ def run_case(base, case, generation):
"fragment_timeout_ms": 250, "fragment_timeout_ms": 250,
"idle_timeout_ms": 2000, "idle_timeout_ms": 2000,
} }
experiment_id = json.loads(bounded_file(base / "metadata.json", 65536))["experiment_id"]
identity = StreamStart( identity = StreamStart(
run_id=f"binary-ingress-{case}", run_id=f"{experiment_id}-{case}",
source_id="RAVNOVES00-prefix" if case == "recorded" else "synthetic", source_id="RAVNOVES00-prefix" if case == "recorded" else "synthetic",
worker_id="worker-006", worker_id="worker-006",
epoch_id=f"ipc-{generation}", epoch_id=f"{experiment_id}-epoch-{generation}",
lease_generation=generation, lease_generation=generation,
profile_sha256=hashlib.sha256( profile_sha256=hashlib.sha256(
bounded_file(base / "candidate-profile.json", 65536) bounded_file(base / "candidate-profile.json", 65536)