ebc630b231e96717ba03b62b2e435b19a5aa553a
The pool let an idle worker steal the back half of a slower in-flight segment, behind a mutex that also serialized every advance. At the default -x 1 it never fired, and it carried the trickiest invariant in the tree (minSplit >= readBuf keeps an owner's in-flight write out of the stolen tail). makeSegments already caps the segment count at the connection count, so the segments map one-to-one onto workers: give each its own goroutine, advance written with a plain atomic add, and snapshot the fixed slice with no lock. pool/newPool/acquire/steal/advance and the seg.owned field all go away. Net -156 lines. Behaviour at the user's flags is unchanged, except a slow mirror's tail segment is no longer rebalanced onto idle connections.
got
A command-line download tool in Go. It fetches HTTP(S) files over multiple
connections and downloads BitTorrent magnets and .torrent files — one binary,
familiar flags.
Build
go build -o got .
Needs Go 1.25+.
Usage
# HTTP download with 16 connections
got -x16 -s16 https://example.com/big.iso
# let got pick the connection count from the file size
got --auto-split https://example.com/big.iso
# resume an interrupted download
got -c https://example.com/big.iso
# one file from several mirrors (connections spread across servers,
# a dead mirror falls over); -Z downloads them as separate files instead
got -x4 https://a.example/big.iso https://b.example/big.iso
# a torrent or magnet; seed for 30 minutes after finishing
got --seed-time=30 ubuntu.torrent
got 'magnet:?xt=urn:btih:...'
# many downloads, two at a time
got -j2 -i urls.txt
Run got --help (or --help=all) for every option.
Common options
| flag | meaning | default |
|---|---|---|
-d, --dir |
output directory | . |
-o, --out |
output filename | from URL |
-c, --continue |
resume a partial download | false |
-x, --max-connection-per-server |
connections to one server (1–16) | 1 |
-s, --split |
split a download into N connections | 5 |
--auto-split |
choose connections from file size (overrides -x/-s) |
false |
-j, --max-concurrent-downloads |
downloads at once | 5 |
--max-overall-download-limit |
global speed cap | 0 (off) |
--checksum |
verify the finished file: TYPE=DIGEST (sha-256, sha-1, …) |
|
--seed-time |
minutes to seed after a torrent finishes | by ratio |
--seed-ratio |
stop seeding at this ratio | 1.0 |
-S, --show-files |
list torrent files and exit | |
-q, --quiet |
no progress output | false |
Resume
HTTP downloads resume from a small <file>.got sidecar — just re-run with -c.
Torrents resume from the data already on disk. To resume across runs, point
--save-session and -i at the same file:
got -c --save-session=got.session -i got.session <urls/magnets...>
Notes
- BitTorrent uses
anacrolix/torrent; HTTP uses the standard library. - Not implemented: FTP/SFTP, Metalink, and the JSON-RPC server.
- When several torrents run at once,
--max-download-limit/--max-upload-limitapply per run rather than per torrent (--max-overall-*are exact).
Description
Languages
Go
100%