Skip to content

test_gap_fetch_request_from_node_incoming_message SIGABRTs deterministically on pristine main, and is in no allowlist #7629

Description

@proggeramlug

test_gap_fetch_request_from_node_incoming_message dies with SIGABRT (exit
134)
after printing 5 lines, while node exits 0 with len=55 match=true.

It is not a flake, and it is not in the allowlist

  • 3/3 reproducible on a build of pristine origin/main (38ff7eccc,
    --profile perry-dev, macOS arm64), via
    ./run_parity_tests.sh --filter test_gap_fetch_request_from_node_incoming_message.
  • Absent from test-parity/known_failures.json, so nothing is suppressing it —
    it is simply not being run by anything that can block a merge.
  • Found while A/B-ing refactor(codegen): migrate instance_misc1 + logical_collections + map_set onto the Layer 1 rooting API (#7615) #7627 (Layer 1 slice 2). It reproduces identically on both
    arms, so it is unrelated to that change; it is reported here rather than
    passed over, because "fails on clean main too" is not the same as "flake".

Why it has been able to hide

parity is tag-gated (v0.5.1018), so a gap regression in this family is only
judged at release time, not per merge. That is the mechanism CLAUDE.md's hazard
list describes and the one #7580 already paid for in test_gap_diagchannel_*.
This crash may therefore be considerably older than its discovery date.

What the test does

#6432's regression cover: new Request(url, { body: req, duplex: "half" })
where req is a Node http.IncomingMessage, read back through
request.text(). It starts a real node:http server on port 18994, POSTs to
itself with http.request, and compares the body length. Node prints:

len=55 match=true
expected len=55

Perry prints five lines and then aborts. The abort is a signal death rather
than an output mismatch, so the harness classifies it CRASH, not FAIL.

Suggested next step

Run it under PERRY_GC_ZEAL=1 PERRY_GC_PROTECT_FROMSPACE=1 with a raised
PERRY_GC_PROTECT_FROMSPACE_DEPTH, and bisect. A deterministic abort in a path
that mixes a native small-handle body (IncomingMessage) with the Web Request
reader is the shape CLAUDE.md flags as "a perfectly reproducible GC bug means a
table, not a register" — worth checking the gc_register_mutable_root_scanner
registry for the http/fetch side tables before assuming a register.

Either way the first fix is procedural: if it is going to stay red, it needs a
known_failures.json entry with provenance so parity_known_failures.py --audit
can see it.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions