Commit b3c09a07 authored by Nicola Fulvio Calabria's avatar Nicola Fulvio Calabria
Browse files

unlock nodes in case of copyNode failure after file service call

parent 7184b385
Loading
Loading
Loading
Loading
+13 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ import it.inaf.oats.vospace.exception.InvalidArgumentException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Service;
import it.inaf.oats.vospace.exception.VoSpaceErrorSummarizableException;
import it.inaf.oats.vospace.exception.VoSpaceErrorSummarizableException;
import it.inaf.oats.vospace.persistence.NodeDAO;
import java.util.List;
import java.util.List;
import java.util.Optional;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletableFuture;
@@ -53,6 +54,9 @@ public class JobService {
    @Autowired
    @Autowired
    private FileServiceClient fileServiceClient;
    private FileServiceClient fileServiceClient;
    
    
    @Autowired
    private NodeDAO nodeDao;

    public enum JobDirection {
    public enum JobDirection {
        pullToVoSpace,
        pullToVoSpace,
        pullFromVoSpace,
        pullFromVoSpace,
@@ -193,10 +197,19 @@ public class JobService {
        User user = (User) servletRequest.getUserPrincipal();
        User user = (User) servletRequest.getUserPrincipal();
        CompletableFuture.runAsync(() -> {
        CompletableFuture.runAsync(() -> {
            handleJobErrors(jobSummary, job -> {
            handleJobErrors(jobSummary, job -> {
                
                String jobId = jobSummary.getJobId();
                String jobId = jobSummary.getJobId();
                // Index 0: source 1: destination
                List<String> sourceAndDestination = copyService.processCopyNodes(transfer, jobId, user);
                List<String> sourceAndDestination = copyService.processCopyNodes(transfer, jobId, user);
                // Call file service and command copy
                // Call file service and command copy
                try{                
                fileServiceClient.startFileCopyJob(sourceAndDestination.get(0), sourceAndDestination.get(1), jobId, user);
                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;
                return null;
            });
            });