dagger/dagger · error
failed to get mounts of %q
Error message
failed to get mounts of %q
What it means
Merge wraps failures from sn.Mounts(ctx, prepareKey) with "failed to get mounts of %q". After successfully preparing an intermediate snapshot, the code asks the snapshotter for its mount configuration to apply the diffs onto; if the snapshotter cannot compute mounts (snapshot vanished, backend error), this error is returned. The %q is the destination key, not the internal prepareKey.
Source
Thrown at engine/snapshots/merge.go:122
}
ctx = leaseCtx
}
if leaseID, ok := leases.FromContext(ctx); !ok || leaseID == "" {
leaseCtx, done, err := WithLease(ctx, sn.lm, MakeTemporary)
if err != nil {
return errors.Wrap(err, "failed to create temporary lease for view mounts during merge")
}
defer done(context.TODO())
ctx = leaseCtx
}
prepareKey := identity.NewID()
if err := sn.Prepare(ctx, prepareKey, baseKey); err != nil {
return errors.Wrapf(err, "failed to prepare %q", key)
}
applyMounts, err := sn.Mounts(ctx, prepareKey)
if err != nil {
return errors.Wrapf(err, "failed to get mounts of %q", key)
}
usage, err := sn.diffApply(ctx, applyMounts, diffs...)
if err != nil {
return errors.Wrap(err, "failed to apply diffs")
}
if err := sn.Commit(ctx, key, prepareKey, withMergeUsage(usage)); err != nil {
return errors.Wrapf(err, "failed to commit %q", key)
}
return nil
}
func (sn *mergeSnapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) {
if info, err := sn.Stat(ctx, key); err != nil {
return snapshots.Usage{}, err
} else if usage, ok, err := mergeUsageOf(info); err != nil {
return snapshots.Usage{}, err
} else if ok {View on GitHub (pinned to 82ba2681db)
Solutions
- Retry the Merge operation — prepareKey is a fresh identity.NewID() each time, so a retry allocates a new snapshot
- Check containerd daemon logs for snapshotter/Mounts errors around the timestamp
- Verify no aggressive GC/pruning job runs concurrently with merges
- Confirm the snapshotter driver (overlayfs/stargz/native) is healthy on the node
Defensive patterns
Strategy: retry
Validate before calling
// prepareKey is internal; validate the diff endpoints exist
for _, d := range diffs {
if _, err := sn.Stat(ctx, d.Lower); err != nil { return err }
} Try / catch
if err := sn.Merge(ctx, key, diffs); err != nil {
if strings.Contains(err.Error(), "failed to get mounts of") {
return retryMerge(ctx, key, diffs) // fresh prepareKey on retry
}
return err
} Prevention
- Retry Merge on transient mount errors — a new snapshot is prepared each attempt
- Disable concurrent GC pruning while merges run
- Watch containerd logs for snapshotter mount failures
- Keep the snapshotter driver healthy (kernel module, backing fs)
When it happens
Trigger: Merge(ctx, key, diffs) where the snapshotter's Mounts call on the freshly prepared prepareKey fails — e.g. snapshot was deleted between Prepare and Mounts, or the overlay backend cannot construct the mount options.
Common situations: Concurrent garbage collection removing prepareKey; containerd snapshotter wedged after node restart; overlayfs kernel/module issues on the host.
Related errors
- failed to stat lower snapshot %s
- failed to mount lower snapshot view %s
- failed to mount lower snapshot %s
- failed to stat upper snapshot %s
- failed to mount upper snapshot view %s
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/07ca0ce022b3ede9.
Report an issue: GitHub.