From b3c09a0747eafca34f66b7e40784cdf1af53a922 Mon Sep 17 00:00:00 2001
From: Nicola Fulvio Calabria <nicola.calabria@inaf.it>
Date: Mon, 2 Aug 2021 22:48:56 +0200
Subject: [PATCH] unlock nodes in case of copyNode failure after file service
 call

---
 src/main/java/it/inaf/oats/vospace/JobService.java | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/main/java/it/inaf/oats/vospace/JobService.java b/src/main/java/it/inaf/oats/vospace/JobService.java
index f101367..938fbee 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;
             });
-- 
GitLab