From fe6d37456d85e0c6a6fec6aeaf7557c4ad4b2cca Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Tue, 10 Mar 2026 16:56:35 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=98=EB=93=9C=EB=A7=81=ED=81=AC=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=8B=9C=20=EC=8B=AC=EB=B3=BC=EB=A6=AD=20?= =?UTF-8?q?=EB=A7=81=ED=81=AC=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EC=96=B4?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../train/service/TmpDatasetService.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/kamco/cd/training/train/service/TmpDatasetService.java b/src/main/java/com/kamco/cd/training/train/service/TmpDatasetService.java index 978fe2b..7a54f47 100644 --- a/src/main/java/com/kamco/cd/training/train/service/TmpDatasetService.java +++ b/src/main/java/com/kamco/cd/training/train/service/TmpDatasetService.java @@ -74,7 +74,6 @@ public class TmpDatasetService { } private long link(Path tmp, String type, String part, String fullPath) throws IOException { - if (fullPath == null || fullPath.isBlank()) return 0; Path src = Path.of(fullPath); @@ -87,12 +86,26 @@ public class TmpDatasetService { String fileName = src.getFileName().toString(); Path dst = tmp.resolve(type).resolve(part).resolve(fileName); - // 충돌 시 덮어쓰기 + Files.createDirectories(dst.getParent()); + if (Files.exists(dst)) { Files.delete(dst); } - Files.createLink(dst, src); + try { + Files.createLink(dst, src); + log.info("hardlink created: {} -> {}", dst, src); + } catch (FileSystemException e) { + if (e.getMessage() != null && e.getMessage().contains("Invalid cross-device link")) { + log.warn( + "Hardlink failed due to cross-device link. Fallback to symlink. src={}, dst={}", + src, + dst); + Files.createSymbolicLink(dst, src); + } else { + throw e; + } + } return 1; }