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; }