diff --git a/pom.xml b/pom.xml
index cadf191..9b822a8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
fr.insalyon.creatis.moteur2
workflow-agent
- 0.2
+ 1.0
UTF-8
diff --git a/src/main/java/fr/insalyon/creatis/agent/workflow/WorkflowAgent.java b/src/main/java/fr/insalyon/creatis/agent/workflow/WorkflowAgent.java
index 80576d0..dce36b4 100644
--- a/src/main/java/fr/insalyon/creatis/agent/workflow/WorkflowAgent.java
+++ b/src/main/java/fr/insalyon/creatis/agent/workflow/WorkflowAgent.java
@@ -23,7 +23,7 @@ public static void main(String[] args) {
String workflowId = args[2];
JobDatabase db = new JobDatabase(workflowsPath, workflowId);
Command command = null;
- if (cmd.toLowerCase().equals("kill")) {
+ if (cmd.equalsIgnoreCase("kill")) {
logger.info("Received kill signal to '" + workflowId + "'");
command = new KillCommand(db);
}
diff --git a/src/main/java/fr/insalyon/creatis/agent/workflow/command/KillCommand.java b/src/main/java/fr/insalyon/creatis/agent/workflow/command/KillCommand.java
index 5f0b597..6165500 100644
--- a/src/main/java/fr/insalyon/creatis/agent/workflow/command/KillCommand.java
+++ b/src/main/java/fr/insalyon/creatis/agent/workflow/command/KillCommand.java
@@ -4,6 +4,8 @@
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+
import org.apache.log4j.Logger;
public class KillCommand implements Command {
@@ -15,24 +17,33 @@ public KillCommand(JobDatabase jobDB) {
}
public void run() {
- List jobIds = this.jobDB.getJobIds();
-
- for (String id : jobIds) {
- try {
- logger.info("Killing job id '" + id + "'");
- String exec = "dirac-wms-job-kill " + id;
- Process process = Runtime.getRuntime().exec(exec);
- process.waitFor();
- if (process.exitValue() != 0) {
- logger.error("Unable to kill job id '" + id + "'");
- } else {
- this.jobDB.updateStatus(id);
- }
- } catch (InterruptedException | IOException e) {
- logger.error("Error killing job " + id, e);
- }
+ Map jobIds = this.jobDB.getJobsToKill();
+
+ for (String id : jobIds.keySet()) {
+ // kill running jobs, delete waiting and succesfully submitted
+ boolean mustDelete = ! jobIds.get(id).equalsIgnoreCase("RUNNING");
+ killJob(id, mustDelete);
}
this.jobDB.close();
}
+
+ public void killJob(String id, boolean mustDelete) {
+ try {
+ String command = mustDelete ? "delete" : "kill";
+ logger.info("Doing " + command + " on job id '" + id + "'");
+ String exec = "dirac-wms-job-" + command + " " + id;
+ Process process = Runtime.getRuntime().exec(exec);
+ process.waitFor();
+ if (process.exitValue() != 0) {
+ logger.error("Unable to " + command + " job id '" + id + "' with dirac");
+ } else if (mustDelete) {
+ this.jobDB.updateStatusToDeleted(id);
+ } else {
+ this.jobDB.updateStatusToCancelled(id);
+ }
+ } catch (InterruptedException | IOException e) {
+ logger.error("Error killing job " + id, e);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/fr/insalyon/creatis/agent/workflow/database/JobDatabase.java b/src/main/java/fr/insalyon/creatis/agent/workflow/database/JobDatabase.java
index 02fe496..d265f62 100644
--- a/src/main/java/fr/insalyon/creatis/agent/workflow/database/JobDatabase.java
+++ b/src/main/java/fr/insalyon/creatis/agent/workflow/database/JobDatabase.java
@@ -7,7 +7,10 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+
import org.apache.log4j.Logger;
public class JobDatabase {
@@ -22,27 +25,36 @@ public JobDatabase(String workflowsPath, String workflowId) {
this.connect();
}
- public List getJobIds() {
+ public Map getJobsToKill() {
try {
- PreparedStatement ps = this.connection.prepareStatement("SELECT id FROM Jobs WHERE status='SUCCESSFULLY_SUBMITTED' OR status='QUEUED' OR status='RUNNING'");
+ PreparedStatement ps = this.connection.prepareStatement("SELECT id, status FROM Jobs WHERE status='SUCCESSFULLY_SUBMITTED' OR status='QUEUED' OR status='RUNNING'");
ResultSet rs = ps.executeQuery();
- ArrayList jobIds = new ArrayList();
+ Map jobs = new HashMap<>();
while(rs.next()) {
- jobIds.add(rs.getString("id"));
+ jobs.put(rs.getString("id"),rs.getString("status"));
}
- return jobIds;
+ return jobs;
} catch (SQLException e) {
logger.error("Error getting job ids", e);
return null;
}
}
- public void updateStatus(String jobId) {
+
+ public void updateStatusToCancelled(String jobId) {
+ updateStatus(jobId, "CANCELLED");
+ }
+
+ public void updateStatusToDeleted(String jobId) {
+ updateStatus(jobId, "DELETED");
+ }
+
+ public void updateStatus(String jobId, String status) {
try {
PreparedStatement ps = this.connection.prepareStatement("UPDATE Jobs SET status = ? WHERE id = ?");
- ps.setString(1, "CANCELLED");
+ ps.setString(1, status);
ps.setString(2, jobId);
ps.executeUpdate();
ps.close();