Skip to content

Commit 8b74b4e

Browse files
committed
Ensure asynchronous cwltool is on same git checkout
... by aquiring its own semaphore within the async job and getting the git repository again. Note that this will mean an uncessary duplicate "fetch" - however this also mean that the async "retryCwltool" works as intended by pulling the branch again.
1 parent fa3ccef commit 8b74b4e

File tree

3 files changed

+46
-42
lines changed

3 files changed

+46
-42
lines changed

src/main/java/org/commonwl/view/cwl/CWLToolRunner.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,27 @@
1919

2020
package org.commonwl.view.cwl;
2121

22+
import java.io.IOException;
23+
import java.nio.file.Path;
24+
import java.util.Date;
25+
2226
import org.apache.jena.query.QueryException;
27+
import org.commonwl.view.git.GitDetails;
28+
import org.commonwl.view.git.GitSemaphore;
29+
import org.commonwl.view.git.GitService;
2330
import org.commonwl.view.researchobject.ROBundleFactory;
2431
import org.commonwl.view.workflow.QueuedWorkflow;
2532
import org.commonwl.view.workflow.QueuedWorkflowRepository;
2633
import org.commonwl.view.workflow.Workflow;
2734
import org.commonwl.view.workflow.WorkflowRepository;
35+
import org.eclipse.jgit.api.Git;
2836
import org.slf4j.Logger;
2937
import org.slf4j.LoggerFactory;
3038
import org.springframework.beans.factory.annotation.Autowired;
3139
import org.springframework.scheduling.annotation.Async;
3240
import org.springframework.scheduling.annotation.EnableAsync;
3341
import org.springframework.stereotype.Component;
3442

35-
import java.io.File;
36-
import java.io.IOException;
37-
import java.util.Date;
38-
3943
/**
4044
* Replace existing workflow with the one given by cwltool
4145
*/
@@ -50,31 +54,38 @@ public class CWLToolRunner {
5054
private final CWLService cwlService;
5155
private final ROBundleFactory roBundleFactory;
5256
private final String cwlToolVersion;
57+
private final GitSemaphore gitSemaphore;
58+
private final GitService gitService;
5359

5460
@Autowired
55-
public CWLToolRunner(WorkflowRepository workflowRepository,
56-
QueuedWorkflowRepository queuedWorkflowRepository,
57-
CWLService cwlService,
58-
CWLTool cwlTool,
59-
ROBundleFactory roBundleFactory) {
61+
public CWLToolRunner(WorkflowRepository workflowRepository, QueuedWorkflowRepository queuedWorkflowRepository,
62+
CWLService cwlService, CWLTool cwlTool, ROBundleFactory roBundleFactory, GitSemaphore gitSemaphore,
63+
GitService gitService) {
6064
this.workflowRepository = workflowRepository;
6165
this.queuedWorkflowRepository = queuedWorkflowRepository;
6266
this.cwlService = cwlService;
6367
this.cwlToolVersion = cwlTool.getVersion();
6468
this.roBundleFactory = roBundleFactory;
69+
this.gitSemaphore = gitSemaphore;
70+
this.gitService = gitService;
6571
}
6672

6773
@Async
68-
public void createWorkflowFromQueued(QueuedWorkflow queuedWorkflow, File workflowFile)
74+
public void createWorkflowFromQueued(QueuedWorkflow queuedWorkflow)
6975
throws IOException, InterruptedException {
7076

7177
Workflow tempWorkflow = queuedWorkflow.getTempRepresentation();
72-
78+
GitDetails gitInfo = tempWorkflow.getRetrievedFrom();
79+
final String repoUrl = gitInfo.getRepoUrl();
7380
// Parse using cwltool and replace in database
7481
try {
82+
boolean safeToAccess = gitSemaphore.acquire(repoUrl);
83+
Git repo = gitService.getRepository(gitInfo, safeToAccess);
84+
Path localPath = repo.getRepository().getWorkTree().toPath();
85+
Path workflowFile = localPath.resolve(gitInfo.getPath()).normalize().toAbsolutePath();
7586
Workflow newWorkflow = cwlService.parseWorkflowWithCwltool(
7687
tempWorkflow,
77-
workflowFile);
88+
workflowFile.toFile());
7889

7990
// Success
8091
newWorkflow.setRetrievedFrom(tempWorkflow.getRetrievedFrom());
@@ -105,6 +116,7 @@ public void createWorkflowFromQueued(QueuedWorkflow queuedWorkflow, File workflo
105116
"error occurred in CWLViewer!\n" +
106117
"Help us by reporting it on Gitter or a Github issue\n");
107118
} finally {
119+
gitSemaphore.release(repoUrl);
108120
queuedWorkflowRepository.save(queuedWorkflow);
109121
}
110122

src/main/java/org/commonwl/view/git/GitService.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@
1919

2020
package org.commonwl.view.git;
2121

22+
import static org.apache.jena.ext.com.google.common.io.Files.createTempDir;
23+
24+
import java.io.IOException;
25+
import java.net.URI;
26+
import java.net.URISyntaxException;
27+
import java.nio.file.Files;
28+
import java.nio.file.Path;
29+
import java.util.HashSet;
30+
import java.util.Set;
31+
2232
import org.apache.commons.codec.digest.DigestUtils;
2333
import org.commonwl.view.researchobject.HashableAgent;
2434
import org.eclipse.jgit.api.Git;
@@ -33,16 +43,6 @@
3343
import org.springframework.beans.factory.annotation.Value;
3444
import org.springframework.stereotype.Service;
3545

36-
import java.io.IOException;
37-
import java.net.URI;
38-
import java.net.URISyntaxException;
39-
import java.nio.file.Files;
40-
import java.nio.file.Path;
41-
import java.util.HashSet;
42-
import java.util.Set;
43-
44-
import static org.apache.jena.ext.com.google.common.io.Files.createTempDir;
45-
4646
/**
4747
* Handles Git related functionality
4848
*/
@@ -82,7 +82,6 @@ public Git getRepository(GitDetails gitDetails, boolean reuseDir)
8282
// Check if folder already exists
8383
Path repoDir = gitStorage.resolve(baseName);
8484
if (Files.isReadable(repoDir) && Files.isDirectory(repoDir)) {
85-
repo = Git.open(repoDir.toFile());
8685
repo.fetch().call();
8786
} else {
8887
// Create a folder and clone repository into it

src/main/java/org/commonwl/view/workflow/WorkflowService.java

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@
1919

2020
package org.commonwl.view.workflow;
2121

22+
import java.io.File;
23+
import java.io.IOException;
24+
import java.nio.file.Files;
25+
import java.nio.file.Path;
26+
import java.nio.file.Paths;
27+
import java.util.ArrayList;
28+
import java.util.Calendar;
29+
import java.util.Date;
30+
import java.util.List;
31+
2232
import org.commonwl.view.cwl.CWLService;
2333
import org.commonwl.view.cwl.CWLToolRunner;
2434
import org.commonwl.view.cwl.CWLToolStatus;
@@ -38,16 +48,6 @@
3848
import org.springframework.data.domain.Pageable;
3949
import org.springframework.stereotype.Service;
4050

41-
import java.io.File;
42-
import java.io.IOException;
43-
import java.nio.file.Files;
44-
import java.nio.file.Path;
45-
import java.nio.file.Paths;
46-
import java.util.ArrayList;
47-
import java.util.Calendar;
48-
import java.util.Date;
49-
import java.util.List;
50-
5151
@Service
5252
public class WorkflowService {
5353

@@ -320,7 +320,7 @@ public QueuedWorkflow createQueuedWorkflow(GitDetails gitInfo)
320320
// ASYNC OPERATIONS
321321
// Parse with cwltool and update model
322322
try {
323-
cwlToolRunner.createWorkflowFromQueued(queuedWorkflow, workflowFile);
323+
cwlToolRunner.createWorkflowFromQueued(queuedWorkflow);
324324
} catch (Exception e) {
325325
logger.error("Could not update workflow with cwltool", e);
326326
}
@@ -341,17 +341,10 @@ public void retryCwltool(QueuedWorkflow queuedWorkflow) {
341341
queuedWorkflow.setMessage(null);
342342
queuedWorkflow.setCwltoolStatus(CWLToolStatus.RUNNING);
343343
queuedWorkflowRepository.save(queuedWorkflow);
344-
GitDetails gitDetails = queuedWorkflow.getTempRepresentation().getRetrievedFrom();
345-
boolean safeToAccess = gitSemaphore.acquire(gitDetails.getRepoUrl());
346344
try {
347-
Git repo = gitService.getRepository(gitDetails, safeToAccess);
348-
File localPath = repo.getRepository().getWorkTree();
349-
Path pathToWorkflowFile = localPath.toPath().resolve(gitDetails.getPath()).normalize().toAbsolutePath();
350-
cwlToolRunner.createWorkflowFromQueued(queuedWorkflow, new File(pathToWorkflowFile.toString()));
345+
cwlToolRunner.createWorkflowFromQueued(queuedWorkflow);
351346
} catch (Exception e) {
352347
logger.error("Could not update workflow with cwltool", e);
353-
} finally {
354-
gitSemaphore.release(gitDetails.getRepoUrl());
355348
}
356349
}
357350

0 commit comments

Comments
 (0)