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();