Skip to content

Add tokio 1.54.1, Rust 1.99.1 - #20

Merged
wfchandler merged 8 commits into
mainfrom
canary-releases
Oct 23, 2026
Merged

wfchandler merged 8 commits into
mainfrom
canary-releases

Conversation

@wfchandler

Copy link
Copy Markdown
Collaborator

Add latest tokio and toolchain versions.

wfchandler and others added 8 commits October 23, 2026 09:10
matrix.sh update pipes the Rust stable channel manifest, several
megabytes, into an awk program that exits at the first `version =`
line under `[pkg.rust]`. printf is still writing when awk exits, so
it takes SIGPIPE and the weekly canary's log reads "printf: write
error: Broken pipe". The version still parses, since nothing checks
that pipeline's status, but the error reads as a failure.

Have awk read to the end and print only the first match, as the
per-minor channel loop below it already does for curl's pipe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both patches change Semaphore::close the same way: it pops the
waiters in WakeList batches and wakes each batch with the list's lock
released, where it woke every waiter under the lock. It still sets
both closed flags and pops every node, which is all the acquire
protocol reads. 1.53.3's io driver also re-exports io_uring's new
register result. Neither patch moves a type a detector reads; the
rest is AsyncFd's unsafe register, the duplex stream waking after
unlocking, io_uring cancellation fixes, a current_thread self-unpark
and join!'s unreachable_code allowance.

Extend the 1.51 and 1.53 spans, add the new revisions' checksums,
note the changes in the acquire and io protocols' docs, and move the
tests' unread patches to 1.51.7 and 1.53.4. Pin 1.51.6 and 1.53.3 in
place of 1.51.5 and 1.53.2, which moves the 1.51 cell and the latest
role's four cells. Their walk, formats and summary goldens match their
predecessors', as do the 1.53.3 cells' semantics. In 1.51.6's
semantics, one more copy of async_trace_leaf's PollFn poll is
inlined, so each program lists one fewer poll symbol for it, and
http-conns lists the same rules in another order, renumbering them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tls-conns' unflushed client writes 64 KiB at a time until the socket
refuses, and its golden pins the one record rustls is left holding.
That count is not the program's: rustls cuts each write into four
16 KiB records and writes as much as the socket takes, so the records
left are however many the kernel's cut leaves of the last write. How
much the kernel takes is send-buffer autotuning and the host's memory,
which is why its bytes are already masked, and the cut lands in a
different record as that moves: an illumos host that had printed one
record now prints three, at 1.99.0 as at 1.99.1.

Write one record's worth at a time. The write the socket refuses then
leaves exactly the record it was writing, wherever the kernel cut it,
and the golden's one record holds on any host. No golden changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1.99.1 replaces 1.99.0 as the primary, so the fixtures build with it:
the full tokio axis and the no-unstable and ct-only cells move to
1.99.1. Raise the rustc reviews' 1.99 span to it: the release changes
only x86_64's bool-return extension in rustc_target's calling
conventions, a wcslen builtin and LLD's rpath on Darwin, and every
library file a convention lists hashes as it did in 1.99.0.
regen.sh, the extraction golden test and exegesis's testlib build
name the new primary with it.

The extraction goldens do not change. The new matrix cells differ
from the 1.99.0 cells they replace by the compiler's version string
and by orders that follow its symbol hashes: a dyn's associated
types, the order http-conns lists its rules and delegators in, and,
in the 1.47.5 cell, the ids of two many-tasks task entries that tie
on everything the canonical order compares.

The core goldens change by the same build. The linux-floor set's info
pages name the fixtures' new path. On Linux, http-conns' three hyper
tasks trade canonical ids: they share a spawn site and a state, and
their futures' types, which order them, are numbered in the bundle as
the compiler's DWARF lists them. On illumos, armed-select's binary
carries a second copy of futures-util's set waker vtable, so the
waker sweep finds two.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Build hansei with Rust 1.99.1, the release the fixtures moved their
primary to in the previous commit. Clippy 1.99.1 raises nothing the
tree has to change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
stale-local's one task parks on std::future::pending, which never
reads its context, and nothing else in the program builds a task
waker: its main future runs under block_on's thread waker and the
oneshot send takes no context. rustc 1.99 with tokio 1.54 sees that
the task's Context is never read, drops the waker it would have
built, and the linker then drops tokio's WAKER_VTABLE and the four
functions it names. Extraction requires that vtable, so the
acceptance suite fails every test in those cells before any runs.
Earlier toolchains, and 1.99 with tokio 1.53, happened to keep it.

Park the task on a oneshot receiver whose sender main keeps, so the
task registers its waker as a task waiting on anything does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tokio 1.54 replaces the blocking pool's shared mutex with an
InnerImpl enum: a Locked variant, one mutex over the queue and the
thread state as Shared was, and a Sharded one, sixteen mutex-guarded
shards each holding a queue, with the thread state behind a
ShardedCoord mutex. A runtime picks one when it is built, through an
unstable builder option or the TOKIO_UNSTABLE_SHARDED_BLOCKING_QUEUE
environment variable, which every build reads. Built and extracted,
1.54.1 has no Shared.queue or Shared.worker_threads to bind, so its
queued spawn_blocking cells cannot be listed and its pool threads
cannot be named.

Add a v1_54 family, descending from v1_53, whose module routes each
walk through the variant that holds it: the queue and the thread map
through Locked, the shards, each shard's queue and a second thread map
through Sharded. On a runtime built the other way the route reads as
an inactive variant, so the reader lists whichever queues the pool has
and takes the thread map from the variant that is active. The sharded
map is a new walk role, ShardedCoord.worker_threads, absent before
1.54; Shared.worker_threads and Shard.queue become versioned rows. The
bundle format moves to 107.

The rest of 1.54.1 leaves the reviews' claims standing.
Acquire::poll checks the cooperative budget after a grant, so a poll
the budget refuses returns Pending holding the whole grant, the
state a grant between two polls already leaves. The io driver
dispatches each event from a function of its own, a readiness clear
keeps the shutdown bit, ReadyEvent's tick widens to u16, a new socket
can be marked ready when it is created, and ReadExact and WriteAll
poll again on Interrupted. Sleep converts its deadline to a tick
itself, sleep and Interval clamp their delays, Notify relaxes its
orderings, and a semaphore permit's count widens to usize. Raise the
reviews to 1.54.1 with the new revisions' checksums and note each
change in its review's doc. 1.54.0 was yanked: it moved the runtime
handle out of the timer entry, which 1.54.1 reverted. So the 1.54
span starts at 1.54.1, 1.54.0 is refused as unreviewed, and the
tests' unread release moves to 1.55.0.

blocking-pool's builder sets the environment variable in the unstable
builds, which releases before 1.54 ignore, so the 1.54.1 unstable
cells core a sharded pool and the stable cell a locked one; the
fixture's lines do not move. Pin 1.54.1 as the latest role, which
moves its four cells off 1.53.3. Every walk binds in them. Every
other cell's and extraction golden's walk report gains the sharded
thread map, absent, and notes which family's entry
Shared.worker_threads took, as Shard.queue does in 1.52.0's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mask_core masks how many records tls-conns' stalled client holds
unsent, beside the bytes, because illumos left three where Linux left
one: the client wrote 64 KiB at a time, four records, and how many of
the refused write's records stayed unsent was where the send buffer
filled inside it. The client now writes one record's worth at a time,
so the write the socket refuses leaves exactly one record behind on
every host, and the count is the program's again.

Keep the count, as before the mask: a capture holding any other count
is a fixture that no longer stalls the way it says, which a masked
line cannot show. The bytes still mask, singular included, since the
kernel can cut the last write down to its final byte, and a
connection holding nothing unsent still passes through untouched. The
three platforms' tls-conns-tasks-exec-trace goldens go back to one
unsent record.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@wfchandler
wfchandler merged commit 259c98f into main Oct 23, 2026
5 checks passed
@wfchandler
wfchandler deleted the canary-releases branch October 23, 2026 16:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant