mirror of
https://github.com/containerd/containerd.git
synced 2026-11-06 13:27:16 +00:00
The cache used to serve a hit by committing the layer during Prepare and returning ErrAlreadyExists, which is incompatible with parallel unpacking: the "rebase" capability defers the parent to Commit time, so a commit-at-Prepare layer ends up parentless. The erofs snapshotter therefore had to disable rebase whenever the cache was enabled, making every cache *miss* fall back to a fully sequential (slower-than-cold) pull. Introduce snapshots.ErrAlreadyStaged, returned from Prepare to mean "the active snapshot's content is staged; skip the layer download and apply, but still Commit it" (where the parent is applied). Unlike ErrAlreadyExists it does not end the layer's lifecycle. The unpacker handles it by emitting a status whose bottom half runs the normal serialized commit (rebasing the parent in), and the metadata snapshotter threads it through Prepare like a normal active snapshot. The erofs cache hit now stages the blob and returns ErrAlreadyStaged instead of committing, so it can advertise "rebase" unconditionally: hits skip download+conversion and misses stay parallel. Also promote the "rebase" capability string to snapshots.RebaseCap (shared by the unpacker, erofs, and overlay). Follow up: fetch is range-based, so only a fully cached contiguous prefix skips downloads; a miss in a lower layer still pulls everything above it. Per-layer fetch-skip is left as a follow-up. Signed-off-by: Maksym Pavlenko <pavlenko.maksym@gmail.com>