row 250 r2 (Vikunja #450): R13 closes its controller (Filbert C1, #1755 c30125)

R13 left the in-process controller's socket server open. It now closes the
controller after its checks and asserts close reused the stop's release, as
R2 does, and closes it again in finally for a failure partway through.
This commit is contained in:
jason.woltje committed 2026-10-21 14:24:04 -05:00
1 parent e9cfd92f89
commit c1a8589753
2 files changed
+15 -1

No files matched your search

+12 -1
View File
@@ -73,7 +73,9 @@ was false. Now an `events()` answer that isn't `ok` is returned as it is, with t
- On release, the controller records one entry `["force-stop", "unavailable", <that reason>]`.
- The unit stays active, and the shim still answers `hello`.
The `finally` restores mode 444, the kernel's mode for cgroup.events, and releases the scope. On
Then `close()` reuses the stop's release, so there is still one entry. The `finally` closes the
controller again (a second close is a no-op), restores mode 444, the kernel's mode for cgroup.events,
and releases the scope. On
3b0aef995's shim.mjs, R13 fails on the reason, because it reads "the engine cgroup is not empty".
- K15 already covers a stop, as opposed to a release, with `events` unavailable: the shim gone, the file
mode 000, or `engine` missing, each ending `uncertain` with its reason.
@@ -87,3 +89,12 @@ packages/conversation/README.md:599 listed "R1–R3, R5–R12" for cohort.test.m
None yet. They need Sage's slot. Sage's sage-2082 says the run is on the pushed candidate in a clean
worktree, and that it adds the control-board suite whole, so it counts as the gate run.
## Round 2
Filbert's C1 (#1755 comment 30125): R13 never closed its in-process controller, so the controller's
socket server (controller.mjs:548) stayed open, and `reap` only kills units and engines. Only `close()`
closes it (:1789). R13 now calls `h.ctrl.close()` after its checks and asserts one release entry, as R2
does. Its `finally` also closes the controller, for a failure partway through. The second close is safe:
`server` is null by then (:1791), and `#releaseScope` returns the cached release (:1634-1648). Branch
gizmoduck/row250-r2, on e9cfd92f8.
@@ -886,8 +886,11 @@ test("R13: a release with engine/cgroup.events unreadable answers the read's rea
assert.deepEqual(h.ctrl.evidence.releases.map((r) => [r.why, r.outcome, r.reason]), [["force-stop", "unavailable", ev.unavailable]]);
assert.ok(unitActive(unit), "the scope stays up");
assert.equal((await shimRequest(shim, "hello")).ok, true, "the shim got no release");
await h.ctrl.close();
assert.equal(h.ctrl.evidence.releases.length, 1, "close reuses the stop's release");
} finally {
g.release("scope-release");
await h.ctrl.close();
if (events) {
chmodSync(events, 0o444);
await releaseCohort({ kind: "scope", unitName: unit, invocationId: h.rec().invocationId, shimSocket: shim });