Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
status: open
kind: tooling
opened: 2026-09-29
---

# A compiler fixture's git commit could not create a temporary file

`src/compiler.rs`'s `a_missing_primary_record_is_refused_and_builds_nothing`
went red in 1 of 200 full runs of the toyos-build lib test binary at
`e3a1cdc8`. Those runs went beside a `cargo test --workspace --exclude
toyos-build` loop as host load, with the 1-minute load average at 62.82 for
that run. The fixture's own git failed, not the code under test:

panicked at src/compiler.rs:373:9:
git ["commit", "-qam", "a target"] in $TMPDIR/toyos-tmp-4827-0/compiler-record-29/fork-src:
error: unable to create temporary file: Invalid argument
fatal: failed to write commit object

The other 199 runs passed. Nothing has measured why git's temporary file in
that repository's object store failed with EINVAL. No host-test counterpart of
`src/redlist.rs` disables the test, so every `cargo test -p toyos-build --lib`
still runs it.

## Exit condition

The EINVAL is traced to a cause the test can rule out by construction, and a
loop of 200 loaded runs shows the test green each time.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
status: open
kind: tooling
opened: 2026-09-28
---

# A first dial turned away before a line is waited on to its caller's bound

`src/metaltalk.rs`'s `serve` never asks a first dial again when its
connection closes before a line (`again` is false), and it records no
`unopened` for it. So `Stream::wait_for_connection` still reads the stream as
dialling (`state.unopened.is_none()`) and waits out its whole `by`. Its doc says
it returns "once the dial asked for it ended with none". Through QEMU's
forward that close is the only sign the guest refused, and each caller then
names the wrong thing, late:

- `metalswap::swap` says "no boot opened the record stream within N s" once
the whole window has passed.
- `tests/common/logstream.rs`'s `reader` says "the stream never opened" once
`CEILING` has passed.
- `converse` waits `FOREVER` and returns only at the metal loop's `give_up`.

The close itself is recorded in `end`.

Measured: a mutation of
`a_refused_first_dial_is_asked_again_up_to_its_ceiling` hands its first dial
to a listener that accepts it and closes it before a line. That test's
`wait_connected(5 s)` returned `None` after 5.02 s, and `unopened()` was still
`None`.

## Exit condition

A first dial whose connection closes before a line ends `wait_for_connection`
at once, and `unopened` names the close. A host test stages that close
through a listener it owns and accepts on, and fails on the base.
Loading