From fc21e897ea72c4561ccfcfb6f3ab340a5d53d0cd Mon Sep 17 00:00:00 2001 From: Harivansh Rathi Date: Fri, 10 Apr 2026 19:46:35 +0000 Subject: [PATCH] fix(firecracker-host): validate snapshot reflinks on deploy --- internal/daemon/files.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/internal/daemon/files.go b/internal/daemon/files.go index 5e0b442..a61cd94 100644 --- a/internal/daemon/files.go +++ b/internal/daemon/files.go @@ -137,11 +137,19 @@ func validateDiskCloneBackend(cfg appconfig.Config) error { if err := cloneDiskFile(sourcePath, targetPath, cfg.DiskCloneMode); err != nil { return fmt.Errorf("validate disk clone backend from artifacts dir %q to machine disks dir %q: %w", cfg.ArtifactsDir, cfg.MachineDisksDir, err) } + + snapshotProbePath := filepath.Join(cfg.SnapshotsDir, "."+filepath.Base(sourcePath)+".snapshot-target") + defer func() { + _ = os.Remove(snapshotProbePath) + }() + if err := cloneDiskFile(targetPath, snapshotProbePath, cfg.DiskCloneMode); err != nil { + return fmt.Errorf("validate disk clone backend from machine disks dir %q to snapshots dir %q: %w", cfg.MachineDisksDir, cfg.SnapshotsDir, err) + } return nil } func reflinkRequiredError(err error) error { - return fmt.Errorf("FIRECRACKER_HOST_DISK_CLONE_MODE=reflink requires a CoW filesystem with reflink support across artifacts and machine-disks; mount FIRECRACKER_HOST_ROOT_DIR on XFS with reflink=1 or Btrfs, preferably on local NVMe, or set FIRECRACKER_HOST_DISK_CLONE_MODE=copy for the slow full-copy fallback: %w", err) + return fmt.Errorf("FIRECRACKER_HOST_DISK_CLONE_MODE=reflink requires a CoW filesystem with reflink support across artifacts, machine-disks, and snapshots; mount FIRECRACKER_HOST_ROOT_DIR on XFS with reflink=1 or Btrfs, preferably on local NVMe, or set FIRECRACKER_HOST_DISK_CLONE_MODE=copy for the slow full-copy fallback: %w", err) } func reflinkFile(source string, target string) error {