test(download): write the yt-dlp stub under ForkLock #235
Open
logan
wants to merge 1 commits from
fix/146-stub-etxtbsy into main
pull from: fix/146-stub-etxtbsy
merge into: :main
:main
:fix/146-stub-etxtbsy
:fix/175-wizard-follows-the-library
:fix/231-setter-rollback
:fix/197-duplicate-column-label
:docs/225-fixtures-wav-tags
:docs/220-skill-check-scope
:test/217-fixture-names-in-queue-selection
:fix/216-riff-parse-allocation
:fix/170-queue-header-action-names
:fix/210-nav-sheet-scroll-affordance
:docs/50-readme-landing-page
:feat/65-art-prefetch-ahead
:feat/71-more-as-a-bottom-sheet
:feat/54-native-touch-feel
:feat/67-entity-links-into-menus
:test/196-visual-tier-gates
:fix/138-ui-test-storage-leak
:fix/104-wav-tags-read
:fix/207-sheet-scroll-affordance
:fix/204-ui-visual-update-filter
:pi-agent-backlog-automation
:63-touch-model-phase-2
:63-android-touch-model
:186-touch-targets-settings
:186-touch-targets-page-header
:187-seek-bar-hit-area
:189-190-explore-correctness
:135-android-underrun-instrumentation
:51-android-small-screens
:fix/171-phone-queue-scrim
:fix/137-touch-only-affordances
:fix/154-nested-css-check
:feat/58-mini-player-progress-line
:fix/66-album-page-scrolls-as-one
:60-context-menu-action-sheet
:64-android-system-volume
:59-slim-the-mini-player
:55-queue-as-a-screen
:feat/57-drop-the-android-top-bar
:feat/62-jobs-as-a-notification
:fix/53-seek-bar-never-moves
:fix/159-android-task-app-id
:fix/52-android-activity-recreation-restarts-the-process
:fix/150-expand-button-under-the-art
:feat/42-inline-volume-and-centred-transport
:fix/156-queue-selection-fixture-order
:fix/151-fuse-the-scroll-guard-and-the-write
:fix/43-queue-panel-selection
:fix/143-top-bar-fits-its-window
:feat/27-jobs-into-settings
:feat/25-configurable-sidebar-tabs
:feat/6-global-back-forward
:fix/72-active-view-broadcast
:fix/69-page-header-action-overflow
:fix/quick-wins-batch
:fix/118-in-library-clear
:fix/61-mini-player-plain-text
:fix/68-hover-affordances-pointer
:fix/119-dev-headless-port
:fix/130-issue-claim-user
:fix/131-codegen-check-scope
:feat/28-autotag-match-on-album
:feat/17-demote-version-selector
:feat/38-ownership-visibility
:ci/115-manual-release
:feat/34-icon-language
:feat/7-full-tracklist-toggle
:fix/16-tagwriter-totals
:fix/unclaim-ca-certs
:fix/unclaim-shell
:ci/unclaim-on-close
:docs/closing-keyword
:docs/retire-stale-planning-docs
:docs/issue-driven-workflow
:integration/small-fixes
:fix/small-issue-batch
:fix/queue-toggle-state
:fix/drag-count-badge
:fix/album-card-year
:fix/album-tracklist-heading
:fix/seek-bar-clock-width
:fix/explore-art-scanner-requests
:chore/workflow-guardrails
No Reviewers
Labels
Clear labels
Area/Design
Area/Downloads
Area/Explore
Area/Library-UI
Area/Metadata
Area/Packaging
Area/Player
Area/Queue
Area/Settings
Area/Shell-Nav
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Platform/Android
Platform/Desktop
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
In Progress
Somebody is actively working on this right now
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: yonlu/yellowjacket#235
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The issue.
TestYtDlpSearchSkipsUnparseableLinesfailed once in afull
make testrun and once in CI, both times on a tree whose diffcontained no Go at all, with
fork/exec …/yt-dlp: text file busy. #146 diagnosed the mechanism:the kernel refuses to exec a file that is open for writing anywhere in
the process, and these tests are
t.Parallel(), so a sibling'sforkduplicatesstubYtDlp's write descriptor in the moment it isopen and carries it past our close.
What changed. The write in
stubYtDlpis held undersyscall.ForkLock— six lines and a comment, in one test file. Noproduction code, nothing user-visible.
Why that and not either fix the issue named. "Close the file before
any sibling can fork" is not available:
os.WriteFilehas alreadyclosed it before anything execs, and the offending descriptor is a
copy taken by a fork that was already in flight. "Write the stub once
per package into a shared dir" narrows the window without removing it,
since the first write of each script still races.
ForkLockis thelock
syscall.forkExectakes across the fork itself, so holding itover the write means no child can exist while the descriptor does, and
a child forked earlier cannot hold one for a file that did not yet
exist. It is declared on Windows and darwin as well as Unix, which
matters because this helper skips at runtime rather than behind a build
tag.
Verification.
backend/download(12 goroutines × 200 realstubYtDlpcalls + exec)go test -race ./backend/download/, ×3make lint(three build configurations)make test(all three passes), ×2GOOS=windows go vet ./backend/download/GOOS=darwinfails for the documentedwails/v3/pkg/maccgo reason, unrelated)The probe is not committed: it is a measurement, and a stress test
that only sometimes fails is the class of thing this issue is about.
The before/after numbers above are what it produced.
Deliberately not done.
make ui-test,make e2e,make generate,make bindings— nofrontend, no
.sql, no.templ, no bound signature.CLAUDE.mduntouched: it documents no test helper at this level, andfour open PRs are each editing that file in a different place.
is now impossible is the mechanism. A recurrence would mean a
different cause and deserves its own issue.
No new issues filed —
stubYtDlpis the only test helper in the repothat writes an executable and then execs it (
cmd/indexbuild/deps_test.goexecs
go list), so there is no second site.Closes #146
CI is green. Run 18482:
checksuccess,e2esuccess (chromiumand WebKit both ran).
Not merging — leaving it for a human, with
Status/In Progressstill on#146.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.