Skip to content

README: the Net::FTP hang figures describe code that has since changed - #934

Merged
tannevaled merged 3 commits into
mainfrom
docs-netftp-numbers
Nov 14, 2026
Merged

tannevaled merged 3 commits into
mainfrom
docs-netftp-numbers

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

README: the Net::FTP hang figures describe code that has since changed

The map of where the work is still says:

The largest single debt is a hang, not a missing feature. Net::FTP alone
is 442 examples behind, and 39 of its 56 spec files have to be killed by the
clock on rbgo and none on MRI.

Re-measured today against MRI 4.0.6, same corpus, 30 s per file, on main at
ba89ba6f: Net::FTP is 128 behind (459 → 331), and no file is killed at
all.

Only the figures that measurement covers are touched. The whole-corpus numbers
in the lines above that bullet are left exactly as they were, because I have not
re-swept the corpus and will not quote a number I did not take.

What the replacement says that a single figure cannot

One symptom, two unrelated causes — which is the thing that took a day to
establish:

then now what it was
library/net-ftp 39 killed 0 a blocking socket call held the emulated GVL (#924)
library/net-http 27 killed 27 TCPSocket.open { … } never closed the socket (#932, open)
library/socket 8 killed 8 Thread#kill cannot interrupt a blocking native call (#933)
library/timeout 1 killed 1 ditto

Neither fix moves the other's files. That is exactly why #924 looked like it had
done nothing when I first measured it against the HTTP specs, and why the table
names a cause per row instead of a count: a reader should be able to tell what
is fixed from what is merely counted.

⛔ The note that outlives all of these numbers

None of this was measurable until the reference interpreter was repaired. It had
been scoring a clean 0 on every file, because its bundled gems were off the
load path — and a sweep reports that as a result: 56 rows of
control 0 passing reads as the implementation under test beating the
reference. cmd/mriref (#930) is named in the README so the next person to
measure starts from an oracle that answers.

Refs #916, #924, #930, #932, #933

(All stay open or already merged as noted; this changes documentation only.)

🤖 Generated with Claude Code

tannevaled and others added 3 commits November 13, 2026 20:25
The map of where the work is said:

    The largest single debt is a hang, not a missing feature. Net::FTP alone
    is 442 examples behind, and 39 of its 56 spec files have to be killed by
    the clock on rbgo and none on MRI (#916).

Re-measured today against MRI 4.0.6, same corpus, 30 s per file, on main at
ba89ba6: Net::FTP is 128 behind (459 -> 331) and NO file is killed at all.
Only the figures this measurement actually covers are touched; the whole-corpus
numbers above that bullet are left exactly as they were, because I have not
re-swept the corpus.

The replacement states the thing that took a day to establish and that a
single number hides: ONE SYMPTOM, TWO UNRELATED CAUSES. Half the files hung
because a blocking socket call held the emulated GVL (#924); the other half
because TCPSocket.open with a block never closed the socket, so the peer waited
for an EOF that never came (#932, open). Neither fix moves the other's files,
which is why the first one looked like it had done nothing when it was measured
against the second one's specs.

The table also carries what is NOT fixed, with its cause named rather than left
as a count: library/socket 8 and library/timeout 1, both because Thread#kill
cannot interrupt a thread blocked in a native call (#933). A reader should be
able to tell the fixed from the merely counted.

⛔ And the note that outlives all of these numbers: none of it was measurable
until the reference interpreter was repaired. It had been scoring a clean 0 on
every file because its bundled gems were off the load path, and a sweep reports
that as a RESULT -- 56 files of "control 0 passing" reads as the implementation
under test beating the reference. cmd/mriref (#930) is named so the next person
measuring starts from a working oracle.

Co-Authored-By: Claude Opus 5 <[email protected]>
#932 merged while this was in review, so the table's net-http row said 27
as the CURRENT figure for a module that no longer hangs at all. Publishing
that would have been the same defect this pull request exists to correct.

Re-measured on main at 6b51deb, 321 files across library/net-http +
library/socket + library/timeout, MRI 4.0.6 as the control, 30 s per file:
275 passing against MRI's 371, NINE killed under rbgo and none under MRI.

So the tally is 75 -> 9, and the nine are the last two rows: Thread#kill
cannot interrupt a thread blocked in a native call (#933).

Co-Authored-By: Claude Opus 5 <[email protected]>
@tannevaled
tannevaled merged commit 6bc84ee into main Nov 14, 2026
26 checks passed
@tannevaled
tannevaled deleted the docs-netftp-numbers branch November 14, 2026 12:14
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