From 6896ff23dcbc23498894f7e16d8d91a6b61e0a7d Mon Sep 17 00:00:00 2001 From: Sasha Sherstnev Date: Mon, 16 Jun 2014 07:50:05 +0100 Subject: [PATCH] JWS-96 initial code for the stat crawler --- .classpath | 1 + lib/jcommander-1.30.jar | Bin 0 -> 60376 bytes .../stat/collector/ExecutionStatUpdater.java | 197 ++++++++++++++++++++ webservices/compbio/stat/collector/StatDB.java | 11 +- .../compbio/stat/servlet/StatisticCollector.java | 4 + webservices/compbio/ws/server/MainManager.java | 2 - 6 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 lib/jcommander-1.30.jar create mode 100644 webservices/compbio/stat/collector/ExecutionStatUpdater.java diff --git a/.classpath b/.classpath index 46b788d..794a7ca 100644 --- a/.classpath +++ b/.classpath @@ -17,5 +17,6 @@ + diff --git a/lib/jcommander-1.30.jar b/lib/jcommander-1.30.jar new file mode 100644 index 0000000000000000000000000000000000000000..ec6c420a312929edccac5c0f473b70f51035b4da GIT binary patch literal 60376 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 literal 0 HcmV?d00001 diff --git a/webservices/compbio/stat/collector/ExecutionStatUpdater.java b/webservices/compbio/stat/collector/ExecutionStatUpdater.java new file mode 100644 index 0000000..8e9a6e4 --- /dev/null +++ b/webservices/compbio/stat/collector/ExecutionStatUpdater.java @@ -0,0 +1,197 @@ +/* Copyright (c) 2013 Alexander Sherstnev + * Copyright (c) 2011 Peter Troshin + * + * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0 + * + * This library is free software; you can redistribute it and/or modify it under the terms of the + * Apache License version 2 as published by the Apache Software Foundation + * + * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache + * License for more details. + * + * A copy of the license is in apache_license.txt. It is also available here: + * @see: http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Any republication or derived work distributed in source code form + * must include this copyright and license notice. + */ +package compbio.stat.collector; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; + +import org.apache.log4j.Logger; + +import compbio.engine.client.PathValidator; +import compbio.engine.client.SkeletalExecutable; +import compbio.util.FileUtil; + +/** + * Class assumptions: 1. Number of runs of each WS = number of folders with name + * 2. Number of successful runs = all runs with no result file 3. Per period of + * time = limit per file creating time 4. Runtime (avg/max) = finish time - + * start time 5. Task & result size = result.size + * + * Abandoned runs - not collected runs + * + * Cancelled runs - cancelled + * + * Cluster vs local runs + * + * Reasons for failure = look in the err out? + * + * + * Metadata required: + * + * work directory for local and cluster tasks = from Helper or cmd parameter. WS + * names - enumeration. Status file names and content. + * + * @author Peter Troshin + * @author Alexander Sherstnev + * + */ + +class mainJCommander { + @Parameter + private List parameters = new ArrayList(); + + @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity") + Integer verbose = 1; + + @Parameter(names = "-start", description = "Start time") + String starttime; + + @Parameter(names = "-end", description = "Start time") + String endtime; + + @Parameter(names = "-db", description = "Path to database") + String dbname; +} + +public class ExecutionStatUpdater { + static SimpleDateFormat DF = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); + private static final Logger log = Logger.getLogger(ExecutionStatUpdater.class); + + final private File workingDirectory; + final private List stats; + /** + * Consider the job that has been working for longer than timeOutInHours + * completed, whatever the outcome + */ + final private int timeOutInHours; + + /** + * List subdirectories in the job directory + * + * @param workingDirectory + * @param timeOutInHours + */ + public ExecutionStatUpdater(String workingDirectory, int timeOutInHours) { + log.info("Starting stat collector for directory: " + workingDirectory); + log.info("Maximum allowed runtime(h): " + timeOutInHours); + if (!PathValidator.isValidDirectory(workingDirectory)) { + throw new IllegalArgumentException("workingDirectory '" + workingDirectory + "' does not exist!"); + } + this.workingDirectory = new File(workingDirectory); + stats = new ArrayList(); + if (timeOutInHours <= 0) { + throw new IllegalArgumentException("Timeout value must be greater than 0! Given value: " + timeOutInHours); + } + this.timeOutInHours = timeOutInHours; + } + + boolean hasCompleted(JobDirectory jd) { + JobStat jstat = jd.getJobStat(); + if (jstat.hasResult() || jstat.getIsCancelled() || jstat.getIsFinished() || hasTimedOut(jd)) { + return true; + } + return false; + } + + boolean hasTimedOut(JobDirectory jd) { + return ((System.currentTimeMillis() - jd.jobdir.lastModified()) / (1000 * 60 * 60)) > timeOutInHours; + } + + /* + * Make sure that collectStatistics methods was called prior to calling + * this! TODO consider running collectStatistics from here on the first call + */ + StatProcessor getStats() { + if (stats.isEmpty()) { + log.info("Please make sure collectStatistics method was called prior to calling getStats()!"); + } + return new StatProcessor(stats); + } + + void writeStatToDB() throws SQLException { + Set rjobs = new HashSet(stats); + StatDB statdb = new StatDB(); + log.debug("Removing records that has already been recorded"); + statdb.removeRecordedJobs(rjobs); + log.debug("New records left: " + rjobs.size()); + statdb.insertData(rjobs); + } + + /** + * main function + */ + public static void main(String[] args) throws IOException, SQLException { + mainJCommander jct = new mainJCommander(); + new JCommander(jct, args); + String WorkingDir = "jobout"; + String StartTime = jct.starttime; + String EndTime = jct.endtime; + String dbname = jct.dbname; + long StartTimeLong = 0; + long EndTimeLong = 0; + + ExecutionStatUpdater esu = new ExecutionStatUpdater(WorkingDir, 1); + esu.collectStatistics(StartTimeLong, EndTimeLong); + esu.writeStatToDB(); + } + + static FileFilter directories = new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.isDirectory() && !pathname.getName().startsWith("."); + } + }; + + // TODO test! + private void collectStatistics(long StartTime, long EndTime) { + // clear stats array; + stats.clear(); + File[] dirs = workingDirectory.listFiles(directories); + for (File dir : dirs) { + // skip work directory with test inputs and out of ordered time + // range + log.debug("check directory: " + dir.getName() + "..."); + if (InputFilter.accept(new File(dir.getPath() + File.separator + SkeletalExecutable.INPUT)) && StartTime < dir.lastModified() + && dir.lastModified() < EndTime) { + JobDirectory jd = new JobDirectory(dir); + JobStat jstat = jd.getJobStat(); + // Do not record stats on the job that has not completed yet + if (hasCompleted(jd)) { + stats.add(jstat); + } else { + log.debug("Skipping the job: " + jstat + " as it has not completed yet"); + } + } else { + log.trace("training input: " + dir.getName() + File.separator + SkeletalExecutable.INPUT); + } + } + } + +} diff --git a/webservices/compbio/stat/collector/StatDB.java b/webservices/compbio/stat/collector/StatDB.java index 32b7fde..45947a2 100644 --- a/webservices/compbio/stat/collector/StatDB.java +++ b/webservices/compbio/stat/collector/StatDB.java @@ -53,6 +53,10 @@ public class StatDB { static Connection conn; private synchronized static Connection getDBConnection() throws SQLException { + return getDBConnection(statDBName); + } + + private synchronized static Connection getDBConnection(String dbname) throws SQLException { if (conn != null && !conn.isClosed()) { return conn; @@ -64,7 +68,7 @@ public class StatDB { // Apparently under Tomcat webapp you cannot rely on Java // auto discovery and have to register the driver explicitly Class.forName(driver); - conn = DriverManager.getConnection(protocol + statDBName + ";create=false"); + conn = DriverManager.getConnection(protocol + dbname + ";create=false"); conn.setAutoCommit(true); } catch (ClassNotFoundException e) { @@ -74,6 +78,11 @@ public class StatDB { return conn; } + + public StatDB(String dbname) throws SQLException { + this.conn = getDBConnection(dbname); + } + public StatDB() throws SQLException { this.conn = getDBConnection(); } diff --git a/webservices/compbio/stat/servlet/StatisticCollector.java b/webservices/compbio/stat/servlet/StatisticCollector.java index e305fa5..5d7c251 100644 --- a/webservices/compbio/stat/servlet/StatisticCollector.java +++ b/webservices/compbio/stat/servlet/StatisticCollector.java @@ -108,6 +108,10 @@ public class StatisticCollector implements ServletContextListener { return getStringProperty(ph.getProperty("cluster.tmp.directory")); } + static String getStatDBname() { + return getStringProperty(ph.getProperty("cluster.tmp.directory")); + } + static int getClusterJobTimeOut() { int maxRunTime = 24 * 7; String clusterMaxRuntime = ph.getProperty("cluster.stat.maxruntime"); diff --git a/webservices/compbio/ws/server/MainManager.java b/webservices/compbio/ws/server/MainManager.java index 63267c7..8d57254 100644 --- a/webservices/compbio/ws/server/MainManager.java +++ b/webservices/compbio/ws/server/MainManager.java @@ -28,7 +28,6 @@ import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import compbio.stat.collector.DirCleaner; -import compbio.stat.collector.StatDB; import compbio.engine.conf.PropertyHelperManager; import compbio.engine.local.ExecutableWrapper; import compbio.engine.local.LocalExecutorService; @@ -75,7 +74,6 @@ public class MainManager implements ServletContextListener { log.info("Local engine is shutdown OK"); ExecutableWrapper.shutdownService(); log.info("Individual executables stream engine is shutdown OK"); - StatDB.shutdownDBServer(); } @Override -- 1.7.10.2