From 7ded831354d9309fd3d4afea2ecce00ce5e35de3 Mon Sep 17 00:00:00 2001 From: Claus Lohmar Date: Thu, 23 Jul 2026 09:28:02 +0000 Subject: [PATCH] fix: skip re-extraction if source directory already exists When reusing a source image (Copy flow), the archive was already extracted in /mnt/converter/in/. The extraction step failed with 'Destination path already exists' from 7z. Now extract_if_needed checks if the expected output directory already contains disk images, and returns it directly without re-extracting. --- backend/converter.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/converter.py b/backend/converter.py index 1ae989b..08c3d09 100644 --- a/backend/converter.py +++ b/backend/converter.py @@ -6,6 +6,7 @@ Runs on the Proxmox host (srv2) where qemu-img, 7z, unzip, tar are available. from __future__ import annotations +import logging import os import re import shutil @@ -17,6 +18,8 @@ from typing import Optional STAGING_IN = Path("/mnt/converter/in") STAGING_OUT = Path("/mnt/converter/out") +logger = logging.getLogger("backend.converter") + DISK_EXTENSIONS = {".vmdk", ".qcow2", ".qcow", ".img", ".raw", ".vhd", ".vhdx"} ARCHIVE_EXTENSIONS = {".7z", ".zip", ".rar", ".tar.gz", ".tgz", ".tar", ".gz", ".bz2", ".xz"} @@ -77,6 +80,16 @@ def extract_if_needed(filename: str) -> Path: stem = stem[:-len(e)] break + # If already extracted, skip re-extraction + expected_dir = STAGING_IN / stem + if expected_dir.is_dir() and any( + f.suffix.lower() in DISK_EXTENSIONS + for f in expected_dir.rglob("*") + if f.is_file() + ): + logger.info("Already extracted: %s", expected_dir) + return expected_dir + # Snapshot STAGING_IN before extraction before = set(STAGING_IN.iterdir()) if STAGING_IN.exists() else set()