fix(cache): handle missing cache hits when chaining two run steps #30762

Open
bfredl wants to merge 1 commit from bfredl/zig:cache4 into master
First-time contributor

fixes https://github.com/ziglang/zig/issues/19817
This is the same as https://github.com/ziglang/zig/pull/25788 but rebased due to unrelated std.Io name changes (I don't think I can close it over there)

This improves the efficiency of the cache when chaining muliple commands
like

const step1 = b.addRunArtifact(tool_fast);
step1.addFileArg(b.path("src/input.c"));
const output1 = step1.addOutputFileArg("output1.h");

const step2 = b.addRunArtifact(tool_slow);
step2.addFileArg(output1);
const chained_output = step2.addOutputFileArg("output2.h");

assume that step2 takes much long time than step1
if we make a change to "src/input.c" which produces an identical
"output1.h" as a previous input, one would expect step2 not to
rerun as the cached output2.h only depends on the content of output1.h

However, this does not work yet as the hash of src/input.c leaks into
the file name of the cached output1.h, which the second run step
interprets as a different cache key. Not using the ".zig-build/o/{HASH}"
part of the file name in the hash key fixes this.

https://github.com/bfredl/zig-run4run is updated for zig 0.16 as a demonstration. e.g. in src/foo.c changing implementation_of_foo() to new_implementation_of_foo() should only rerun the first step, not the second.

fixes https://github.com/ziglang/zig/issues/19817 This is the same as https://github.com/ziglang/zig/pull/25788 but rebased due to unrelated `std.Io` name changes (I don't think I can close it over there) This improves the efficiency of the cache when chaining muliple commands like const step1 = b.addRunArtifact(tool_fast); step1.addFileArg(b.path("src/input.c")); const output1 = step1.addOutputFileArg("output1.h"); const step2 = b.addRunArtifact(tool_slow); step2.addFileArg(output1); const chained_output = step2.addOutputFileArg("output2.h"); assume that step2 takes much long time than step1 if we make a change to "src/input.c" which produces an identical "output1.h" as a previous input, one would expect step2 not to rerun as the cached output2.h only depends on the content of output1.h However, this does not work yet as the hash of src/input.c leaks into the file name of the cached output1.h, which the second run step interprets as a different cache key. Not using the ".zig-build/o/{HASH}" part of the file name in the hash key fixes this. https://github.com/bfredl/zig-run4run is updated for zig 0.16 as a demonstration. e.g. in src/foo.c changing implementation_of_foo() to new_implementation_of_foo() should only rerun the first step, not the second.
bfredl force-pushed cache4 from e965df5c7f
All checks were successful
ci / x86_64-freebsd-release (pull_request) Successful in 1h7m20s
ci / aarch64-macos-release (pull_request) Successful in 1h12m10s
ci / x86_64-openbsd-release (pull_request) Successful in 1h14m6s
ci / x86_64-freebsd-debug (pull_request) Successful in 1h16m34s
ci / x86_64-openbsd-debug (pull_request) Successful in 1h17m51s
ci / aarch64-linux-release (pull_request) Successful in 1h36m6s
ci / aarch64-macos-debug (pull_request) Successful in 1h37m57s
ci / x86_64-windows-debug (pull_request) Successful in 58m4s
ci / x86_64-windows-release (pull_request) Successful in 55m3s
ci / aarch64-linux-debug (pull_request) Successful in 2h17m37s
ci / x86_64-linux-debug (pull_request) Successful in 1h50m18s
ci / x86_64-linux-debug-llvm (pull_request) Successful in 2h47m59s
ci / x86_64-linux-release (pull_request) Successful in 2h15m1s
ci / riscv64-linux-debug (pull_request) Has been skipped
ci / riscv64-linux-release (pull_request) Has been skipped
ci / s390x-linux-release (pull_request) Successful in 1h38m28s
ci / s390x-linux-debug (pull_request) Successful in 2h25m1s
ci / loongarch64-linux-release (pull_request) Successful in 2h28m7s
ci / loongarch64-linux-debug (pull_request) Successful in 3h24m58s
ci / powerpc64le-linux-release (pull_request) Successful in 1h47m23s
ci / powerpc64le-linux-debug (pull_request) Successful in 3h48m0s
to cb7d0dc557
All checks were successful
ci / riscv64-linux-debug (pull_request) Has been skipped
ci / riscv64-linux-release (pull_request) Has been skipped
ci / x86_64-netbsd-release (pull_request) Successful in 32m27s
ci / aarch64-macos-release (pull_request) Successful in 33m10s
ci / x86_64-freebsd-release (pull_request) Successful in 34m1s
ci / x86_64-freebsd-debug (pull_request) Successful in 36m17s
ci / x86_64-netbsd-debug (pull_request) Successful in 39m44s
ci / x86_64-openbsd-release (pull_request) Successful in 41m55s
ci / x86_64-openbsd-debug (pull_request) Successful in 47m0s
ci / x86_64-windows-debug (pull_request) Successful in 49m29s
ci / x86_64-windows-release (pull_request) Successful in 51m7s
ci / x86_64-linux-debug (pull_request) Successful in 51m43s
ci / aarch64-macos-debug (pull_request) Successful in 59m38s
ci / powerpc64le-linux-release (pull_request) Successful in 1h22m48s
ci / aarch64-linux-release (pull_request) Successful in 1h32m27s
ci / s390x-linux-release (pull_request) Successful in 1h48m54s
ci / x86_64-linux-debug-llvm (pull_request) Successful in 2h2m10s
ci / x86_64-linux-release (pull_request) Successful in 2h4m35s
ci / aarch64-linux-debug (pull_request) Successful in 2h22m35s
ci / s390x-linux-debug (pull_request) Successful in 2h30m53s
ci / powerpc64le-linux-debug (pull_request) Successful in 4h17m34s
2026-02-18 09:25:29 +01:00
Compare
Owner

Sorry I still need more time to get around to helping get this landed.

Sorry I still need more time to get around to helping get this landed.
bfredl force-pushed cache4 from cb7d0dc557
All checks were successful
ci / riscv64-linux-debug (pull_request) Has been skipped
ci / riscv64-linux-release (pull_request) Has been skipped
ci / x86_64-netbsd-release (pull_request) Successful in 32m27s
ci / aarch64-macos-release (pull_request) Successful in 33m10s
ci / x86_64-freebsd-release (pull_request) Successful in 34m1s
ci / x86_64-freebsd-debug (pull_request) Successful in 36m17s
ci / x86_64-netbsd-debug (pull_request) Successful in 39m44s
ci / x86_64-openbsd-release (pull_request) Successful in 41m55s
ci / x86_64-openbsd-debug (pull_request) Successful in 47m0s
ci / x86_64-windows-debug (pull_request) Successful in 49m29s
ci / x86_64-windows-release (pull_request) Successful in 51m7s
ci / x86_64-linux-debug (pull_request) Successful in 51m43s
ci / aarch64-macos-debug (pull_request) Successful in 59m38s
ci / powerpc64le-linux-release (pull_request) Successful in 1h22m48s
ci / aarch64-linux-release (pull_request) Successful in 1h32m27s
ci / s390x-linux-release (pull_request) Successful in 1h48m54s
ci / x86_64-linux-debug-llvm (pull_request) Successful in 2h2m10s
ci / x86_64-linux-release (pull_request) Successful in 2h4m35s
ci / aarch64-linux-debug (pull_request) Successful in 2h22m35s
ci / s390x-linux-debug (pull_request) Successful in 2h30m53s
ci / powerpc64le-linux-debug (pull_request) Successful in 4h17m34s
to c223d50428
Some checks failed
ci / aarch64-macos-release (pull_request) Successful in 1h13m26s
ci / aarch64-macos-debug (pull_request) Successful in 1h59m14s
ci / x86_64-netbsd-debug (pull_request) Successful in 57m4s
ci / x86_64-netbsd-release (pull_request) Successful in 52m32s
ci / x86_64-freebsd-release (pull_request) Successful in 57m0s
ci / x86_64-freebsd-debug (pull_request) Successful in 58m25s
ci / aarch64-linux-release (pull_request) Successful in 1h34m23s
ci / powerpc64le-linux-release (pull_request) Successful in 2h4m7s
ci / aarch64-linux-debug (pull_request) Successful in 2h31m40s
ci / x86_64-openbsd-release (pull_request) Successful in 54m8s
ci / x86_64-windows-debug (pull_request) Successful in 1h10m57s
ci / x86_64-windows-release (pull_request) Successful in 1h8m8s
ci / x86_64-openbsd-debug (pull_request) Successful in 1h18m33s
ci / powerpc64le-linux-debug (pull_request) Successful in 3h34m0s
ci / s390x-linux-release (pull_request) Successful in 1h25m6s
ci / s390x-linux-debug (pull_request) Successful in 3h14m17s
ci / x86_64-linux-debug (pull_request) Successful in 55m37s
ci / x86_64-linux-debug-llvm (pull_request) Successful in 3h23m2s
ci / x86_64-linux-release (pull_request) Successful in 3h31m11s
ci / loongarch64-linux-release (pull_request) Successful in 2h5m1s
ci / loongarch64-linux-debug (pull_request) Successful in 3h10m54s
ci / riscv64-linux-debug (pull_request) Has been skipped
ci / riscv64-linux-release (pull_request) Has been skipped
ci / aarch64-freebsd-debug (pull_request) Has been cancelled
ci / aarch64-freebsd-release (pull_request) Has been cancelled
ci / aarch64-netbsd-debug (pull_request) Has been cancelled
ci / aarch64-netbsd-release (pull_request) Has been cancelled
2026-05-27 09:55:12 +02:00
Compare
Author
First-time contributor

rebased on top of #35428 (took a guesswork at how serialization should be done, seems to still work but lmk if it is wrong)

rebased on top of #35428 (took a guesswork at how serialization should be done, seems to still work but lmk if it is wrong)
@ -10,11 +10,13 @@ root_dir: Cache.Directory,
/// The path, relative to the root dir, that this `Path` represents.
/// Empty string means the root_dir is the path.
sub_path: []const u8 = "",
content_hash_name: ?[]const u8 = null,
Owner

I definitely want to solve the issue being tackled here, but this approach introduces this "content hash" into an abstraction which is only meant to represent an open root directory handle along with the information needed to convert it to a string representation.

The problem needs to be solved at a higher layer than here.

I definitely want to solve the issue being tackled here, but this approach introduces this "content hash" into an abstraction which is only meant to represent an open root directory handle along with the information needed to convert it to a string representation. The problem needs to be solved at a higher layer than here.
Author
First-time contributor

What would be the right abstraction to solve this? The reason this struct was touched is that it currently represents the info associated with a GeneratedFileIndex which is passed from the producer to the consumer.

Thus I can see two different paths ahead:

  • keep the overall basic approach but just move this info to a separate medadata array still indexed by GeneratedFileIndex
  • A very different approach would be to make sure the physical path of an output file only depends on its contents and basename. This would require an extra filesystem copy (or at least move) for every output file generated by a Step.Run regardless if it is used as a chained input or not.

Does any of these seem right to you?

Regardless, I realized that it is unnecessary to serialize any extra info into Configuration, so I just removed that for now (without addressing this concern just yet)

What would be the right abstraction to solve this? The reason this struct was touched is that it currently represents the info associated with a GeneratedFileIndex which is passed from the producer to the consumer. Thus I can see two different paths ahead: - keep the overall basic approach but just move this info to a separate medadata array still indexed by GeneratedFileIndex - A very different approach would be to make sure the physical path of an output file only depends on its contents and basename. This would require an extra filesystem copy (or at least move) for every output file generated by a `Step.Run` regardless if it is used as a chained input or not. Does any of these seem right to you? Regardless, I realized that it is unnecessary to serialize any extra info into Configuration, so I just removed that for now (without addressing this concern just yet)
bfredl force-pushed cache4 from c223d50428
Some checks failed
ci / aarch64-macos-release (pull_request) Successful in 1h13m26s
ci / aarch64-macos-debug (pull_request) Successful in 1h59m14s
ci / x86_64-netbsd-debug (pull_request) Successful in 57m4s
ci / x86_64-netbsd-release (pull_request) Successful in 52m32s
ci / x86_64-freebsd-release (pull_request) Successful in 57m0s
ci / x86_64-freebsd-debug (pull_request) Successful in 58m25s
ci / aarch64-linux-release (pull_request) Successful in 1h34m23s
ci / powerpc64le-linux-release (pull_request) Successful in 2h4m7s
ci / aarch64-linux-debug (pull_request) Successful in 2h31m40s
ci / x86_64-openbsd-release (pull_request) Successful in 54m8s
ci / x86_64-windows-debug (pull_request) Successful in 1h10m57s
ci / x86_64-windows-release (pull_request) Successful in 1h8m8s
ci / x86_64-openbsd-debug (pull_request) Successful in 1h18m33s
ci / powerpc64le-linux-debug (pull_request) Successful in 3h34m0s
ci / s390x-linux-release (pull_request) Successful in 1h25m6s
ci / s390x-linux-debug (pull_request) Successful in 3h14m17s
ci / x86_64-linux-debug (pull_request) Successful in 55m37s
ci / x86_64-linux-debug-llvm (pull_request) Successful in 3h23m2s
ci / x86_64-linux-release (pull_request) Successful in 3h31m11s
ci / loongarch64-linux-release (pull_request) Successful in 2h5m1s
ci / loongarch64-linux-debug (pull_request) Successful in 3h10m54s
ci / riscv64-linux-debug (pull_request) Has been skipped
ci / riscv64-linux-release (pull_request) Has been skipped
ci / aarch64-freebsd-debug (pull_request) Has been cancelled
ci / aarch64-freebsd-release (pull_request) Has been cancelled
ci / aarch64-netbsd-debug (pull_request) Has been cancelled
ci / aarch64-netbsd-release (pull_request) Has been cancelled
to cce3110c03
Some checks failed
ci / aarch64-freebsd-debug (pull_request) Has been cancelled
ci / aarch64-freebsd-release (pull_request) Has been cancelled
ci / aarch64-netbsd-debug (pull_request) Has been cancelled
ci / aarch64-netbsd-release (pull_request) Has been cancelled
ci / loongarch64-linux-debug (pull_request) Has been cancelled
ci / loongarch64-linux-release (pull_request) Has been cancelled
ci / riscv64-linux-debug (pull_request) Has been cancelled
ci / riscv64-linux-release (pull_request) Has been cancelled
ci / s390x-linux-debug (pull_request) Has been cancelled
ci / s390x-linux-release (pull_request) Has been cancelled
ci / x86_64-freebsd-release (pull_request) Has been cancelled
ci / x86_64-linux-debug (pull_request) Has been cancelled
ci / x86_64-linux-debug-llvm (pull_request) Has been cancelled
ci / x86_64-linux-release (pull_request) Has been cancelled
ci / x86_64-netbsd-release (pull_request) Has been cancelled
ci / x86_64-openbsd-debug (pull_request) Has been cancelled
ci / x86_64-openbsd-release (pull_request) Has been cancelled
ci / x86_64-windows-debug (pull_request) Has been cancelled
ci / x86_64-windows-release (pull_request) Has been cancelled
ci / aarch64-linux-debug (pull_request) Has been cancelled
ci / aarch64-linux-release (pull_request) Has been cancelled
ci / aarch64-macos-release (pull_request) Has been cancelled
ci / aarch64-macos-debug (pull_request) Has been cancelled
ci / x86_64-netbsd-debug (pull_request) Has been cancelled
ci / x86_64-freebsd-debug (pull_request) Has been cancelled
ci / powerpc64le-linux-debug (pull_request) Has been cancelled
ci / powerpc64le-linux-release (pull_request) Has been cancelled
2026-05-30 11:32:37 +02:00
Compare
bfredl force-pushed cache4 from cce3110c03
Some checks failed
ci / aarch64-freebsd-debug (pull_request) Has been cancelled
ci / aarch64-freebsd-release (pull_request) Has been cancelled
ci / aarch64-netbsd-debug (pull_request) Has been cancelled
ci / aarch64-netbsd-release (pull_request) Has been cancelled
ci / loongarch64-linux-debug (pull_request) Has been cancelled
ci / loongarch64-linux-release (pull_request) Has been cancelled
ci / riscv64-linux-debug (pull_request) Has been cancelled
ci / riscv64-linux-release (pull_request) Has been cancelled
ci / s390x-linux-debug (pull_request) Has been cancelled
ci / s390x-linux-release (pull_request) Has been cancelled
ci / x86_64-freebsd-release (pull_request) Has been cancelled
ci / x86_64-linux-debug (pull_request) Has been cancelled
ci / x86_64-linux-debug-llvm (pull_request) Has been cancelled
ci / x86_64-linux-release (pull_request) Has been cancelled
ci / x86_64-netbsd-release (pull_request) Has been cancelled
ci / x86_64-openbsd-debug (pull_request) Has been cancelled
ci / x86_64-openbsd-release (pull_request) Has been cancelled
ci / x86_64-windows-debug (pull_request) Has been cancelled
ci / x86_64-windows-release (pull_request) Has been cancelled
ci / aarch64-linux-debug (pull_request) Has been cancelled
ci / aarch64-linux-release (pull_request) Has been cancelled
ci / aarch64-macos-release (pull_request) Has been cancelled
ci / aarch64-macos-debug (pull_request) Has been cancelled
ci / x86_64-netbsd-debug (pull_request) Has been cancelled
ci / x86_64-freebsd-debug (pull_request) Has been cancelled
ci / powerpc64le-linux-debug (pull_request) Has been cancelled
ci / powerpc64le-linux-release (pull_request) Has been cancelled
to 44c2b186c6
All checks were successful
ci / x86_64-netbsd-release (pull_request) Successful in 43m16s
ci / x86_64-netbsd-debug (pull_request) Successful in 45m45s
ci / x86_64-freebsd-release (pull_request) Successful in 49m16s
ci / x86_64-freebsd-debug (pull_request) Successful in 53m25s
ci / x86_64-openbsd-debug (pull_request) Successful in 1h2m10s
ci / x86_64-openbsd-release (pull_request) Successful in 47m1s
ci / aarch64-macos-release (pull_request) Successful in 1h13m56s
ci / x86_64-windows-release (pull_request) Successful in 1h6m38s
ci / x86_64-windows-debug (pull_request) Successful in 1h17m55s
ci / aarch64-linux-release (pull_request) Successful in 1h32m27s
ci / aarch64-macos-debug (pull_request) Successful in 1h36m5s
ci / powerpc64le-linux-release (pull_request) Successful in 1h48m33s
ci / aarch64-linux-debug (pull_request) Successful in 2h59m21s
ci / powerpc64le-linux-debug (pull_request) Successful in 3h48m54s
ci / s390x-linux-release (pull_request) Successful in 1h28m11s
ci / s390x-linux-debug (pull_request) Successful in 2h20m56s
ci / x86_64-linux-debug (pull_request) Successful in 1h46m13s
ci / x86_64-linux-debug-llvm (pull_request) Successful in 3h38m35s
ci / x86_64-linux-release (pull_request) Successful in 3h46m57s
ci / loongarch64-linux-release (pull_request) Successful in 1h53m12s
ci / loongarch64-linux-debug (pull_request) Successful in 3h1m53s
ci / riscv64-linux-debug (pull_request) Has been skipped
ci / riscv64-linux-release (pull_request) Has been skipped
ci / aarch64-freebsd-debug (pull_request) Has been skipped
ci / aarch64-freebsd-release (pull_request) Has been skipped
ci / aarch64-netbsd-debug (pull_request) Has been skipped
ci / aarch64-netbsd-release (pull_request) Has been skipped
2026-05-30 11:34:53 +02:00
Compare
All checks were successful
ci / x86_64-netbsd-release (pull_request) Successful in 43m16s
Required
Details
ci / x86_64-netbsd-debug (pull_request) Successful in 45m45s
Required
Details
ci / x86_64-freebsd-release (pull_request) Successful in 49m16s
Required
Details
ci / x86_64-freebsd-debug (pull_request) Successful in 53m25s
Required
Details
ci / x86_64-openbsd-debug (pull_request) Successful in 1h2m10s
Required
Details
ci / x86_64-openbsd-release (pull_request) Successful in 47m1s
Required
Details
ci / aarch64-macos-release (pull_request) Successful in 1h13m56s
Required
Details
ci / x86_64-windows-release (pull_request) Successful in 1h6m38s
Required
Details
ci / x86_64-windows-debug (pull_request) Successful in 1h17m55s
Required
Details
ci / aarch64-linux-release (pull_request) Successful in 1h32m27s
Required
Details
ci / aarch64-macos-debug (pull_request) Successful in 1h36m5s
Required
Details
ci / powerpc64le-linux-release (pull_request) Successful in 1h48m33s
Required
Details
ci / aarch64-linux-debug (pull_request) Successful in 2h59m21s
Required
Details
ci / powerpc64le-linux-debug (pull_request) Successful in 3h48m54s
Required
Details
ci / s390x-linux-release (pull_request) Successful in 1h28m11s
Required
Details
ci / s390x-linux-debug (pull_request) Successful in 2h20m56s
Required
Details
ci / x86_64-linux-debug (pull_request) Successful in 1h46m13s
Required
Details
ci / x86_64-linux-debug-llvm (pull_request) Successful in 3h38m35s
Required
Details
ci / x86_64-linux-release (pull_request) Successful in 3h46m57s
Required
Details
ci / loongarch64-linux-release (pull_request) Successful in 1h53m12s
ci / loongarch64-linux-debug (pull_request) Successful in 3h1m53s
ci / riscv64-linux-debug (pull_request) Has been skipped
ci / riscv64-linux-release (pull_request) Has been skipped
ci / aarch64-freebsd-debug (pull_request) Has been skipped
ci / aarch64-freebsd-release (pull_request) Has been skipped
ci / aarch64-netbsd-debug (pull_request) Has been skipped
ci / aarch64-netbsd-release (pull_request) Has been skipped
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u cache4:bfredl-cache4
git switch bfredl-cache4
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ziglang/zig!30762
No description provided.