From 0c0ae16c2b5ad27e521d332976565abe7d270a56 Mon Sep 17 00:00:00 2001 From: teddy Date: Thu, 12 Feb 2026 17:23:34 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9E=84=EC=8B=9C=ED=8F=B4=EB=8D=94=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/service/TmpDatasetService.java | 62 ++++++++++++++----- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/kamco/cd/training/model/service/TmpDatasetService.java b/src/main/java/com/kamco/cd/training/model/service/TmpDatasetService.java index 189f96c..16471c7 100644 --- a/src/main/java/com/kamco/cd/training/model/service/TmpDatasetService.java +++ b/src/main/java/com/kamco/cd/training/model/service/TmpDatasetService.java @@ -7,7 +7,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; @Slf4j @Service @@ -17,48 +16,74 @@ public class TmpDatasetService { @Value("${train.docker.requestDir}") private String requestDir; - @Transactional(readOnly = true) public Path buildTmpDatasetSymlink(String uid, List datasetUids) throws IOException { - // 환경에 맞게 yml로 빼는 걸 추천 + log.info("========== buildTmpDatasetSymlink START =========="); + log.info("uid={}", uid); + log.info("datasetUids={}", datasetUids); + log.info("requestDir(raw)={}", requestDir); + Path BASE = toPath(requestDir); Path tmp = BASE.resolve("tmp").resolve(uid); - log.info("requestDir(raw)={}", requestDir); - log.info("BASE(abs)={}", BASE.toAbsolutePath().normalize()); + log.info("BASE={}", BASE); log.info("BASE exists? {}", Files.isDirectory(BASE)); + log.info("tmp={}", tmp); + + long noDir = 0, scannedDirs = 0, regularFiles = 0, symlinksMade = 0; - // mkdir -p "$TMP"/train/{input1,input2,label} ... for (String type : List.of("train", "val")) { for (String part : List.of("input1", "input2", "label")) { - Files.createDirectories(tmp.resolve(type).resolve(part)); + Path dir = tmp.resolve(type).resolve(part); + Files.createDirectories(dir); + log.info("createDirectories: {}", dir); } } for (String id : datasetUids) { Path srcRoot = BASE.resolve(id); + log.info("---- dataset id={} srcRoot={} exists? {}", id, srcRoot, Files.isDirectory(srcRoot)); for (String type : List.of("train", "val")) { for (String part : List.of("input1", "input2", "label")) { Path srcDir = srcRoot.resolve(type).resolve(part); - log.info("srcRoot={} exists={}", srcRoot, Files.isDirectory(srcRoot)); - // zsh NULL_GLOB: 폴더가 없으면 그냥 continue - if (!Files.isDirectory(srcDir)) continue; + if (!Files.isDirectory(srcDir)) { + log.warn("SKIP (not directory): {}", srcDir); + noDir++; + continue; + } + + scannedDirs++; + log.info("SCAN dir={}", srcDir); try (DirectoryStream stream = Files.newDirectoryStream(srcDir)) { for (Path f : stream) { - if (!Files.isRegularFile(f)) continue; + if (!Files.isRegularFile(f)) { + log.debug("skip non-regular file: {}", f); + continue; + } + + regularFiles++; String dstName = id + "__" + f.getFileName(); Path dst = tmp.resolve(type).resolve(part).resolve(dstName); - // 이미 있으면 스킵(원하면 덮어쓰기 로직으로 바꿀 수 있음) - if (Files.exists(dst)) continue; + try { + // ✅ 덮어쓰기 + if (Files.exists(dst) || Files.isSymbolicLink(dst)) { + Files.delete(dst); + log.debug("deleted existing: {}", dst); + } - // ln -s "$f" "$dst" 와 동일 - Files.createSymbolicLink(dst, f.toAbsolutePath()); + Files.createSymbolicLink(dst, f.toAbsolutePath()); + symlinksMade++; + log.debug("created symlink: {} -> {}", dst, f.toAbsolutePath()); + + } catch (Exception e) { + log.error("FAILED create symlink: {} -> {}", dst, f.toAbsolutePath(), e); + } } } } @@ -66,6 +91,13 @@ public class TmpDatasetService { } log.info("tmp dataset created: {}", tmp); + log.info( + "summary: scannedDirs={}, noDir={}, regularFiles={}, symlinksMade={}", + scannedDirs, + noDir, + regularFiles, + symlinksMade); + return tmp; }