diff --git a/src/main/java/it/inaf/oats/vospace/JobService.java b/src/main/java/it/inaf/oats/vospace/JobService.java index f10136767c1069499fdb69354fbefb4384d88f9f..938fbee1462b45ddde14206af8663321d47eea69 100644 --- a/src/main/java/it/inaf/oats/vospace/JobService.java +++ b/src/main/java/it/inaf/oats/vospace/JobService.java @@ -18,6 +18,7 @@ import it.inaf.oats.vospace.exception.InvalidArgumentException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import it.inaf.oats.vospace.exception.VoSpaceErrorSummarizableException; +import it.inaf.oats.vospace.persistence.NodeDAO; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -52,6 +53,9 @@ public class JobService { @Autowired private FileServiceClient fileServiceClient; + + @Autowired + private NodeDAO nodeDao; public enum JobDirection { pullToVoSpace, @@ -193,10 +197,19 @@ public class JobService { User user = (User) servletRequest.getUserPrincipal(); CompletableFuture.runAsync(() -> { handleJobErrors(jobSummary, job -> { + String jobId = jobSummary.getJobId(); + // Index 0: source 1: destination List<String> sourceAndDestination = copyService.processCopyNodes(transfer, jobId, user); // Call file service and command copy + try{ fileServiceClient.startFileCopyJob(sourceAndDestination.get(0), sourceAndDestination.get(1), jobId, user); + } catch (Exception e) { + // We decided not to purge metadata in case of failure + // just release busy nodes setting job_id = null + nodeDao.releaseBusyNodesByJobId(jobId); + throw e; + } return null; });