]> git.99rst.org Git - git.git/commit
fast-import: use writev(3p) to send cat-blob responses
authorPatrick Steinhardt <redacted>
Fri, 7 Aug 2026 06:18:07 +0000 (08:18 +0200)
committerJunio C Hamano <redacted>
Fri, 7 Aug 2026 15:57:26 +0000 (08:57 -0700)
commit5bd4f43456aae6fa942eb6c6ace6244d09e01d08
tree13ec0bcc3420706d6aa66d7dafa576f615c60496
parent21db416cd2bf658ce79fc928c65b86e981062e8e
fast-import: use writev(3p) to send cat-blob responses

When answering a `cat-blob` command, `cat_blob()` issues three separate
calls to write(3p) on the cat-blob fd: one for the header line, one for
the full blob payload, and one for the trailing newline. Frontends like
git-filter-repo issue these commands in bulk, once per rewritten blob,
so the syscall overhead adds up.

Use `writev_in_full()` to send all three parts with a single syscall.

This can be benchmarked with the following setup:

    $ git cat-file --unordered --filter=object:type=blob
        --batch-check='cat-blob %(objectname)' --batch-all-objects >request
    $ git fast-import --cat-blob-fd=3 <request

Executing this with 100,000 objects in linux.git:

  Benchmark 1: HEAD~
    Time (mean ± σ):      1.320 s ±  0.003 s    [User: 1.154 s, System: 0.161 s]
    Range (min … max):    1.314 s …  1.324 s    10 runs

  Benchmark 2: HEAD
    Time (mean ± σ):      1.270 s ±  0.022 s    [User: 1.133 s, System: 0.132 s]
    Range (min … max):    1.209 s …  1.282 s    10 runs

  Summary
    HEAD ran
      1.04 ± 0.02 times faster than HEAD~

Signed-off-by: Patrick Steinhardt <redacted>
Signed-off-by: Junio C Hamano <redacted>
builtin/fast-import.c
git clone https://git.99rst.org/PROJECT