Author: [log in to unmask] Date: Tue May 26 13:54:51 2015 New Revision: 3023 Log: Miscellaneous updates to the EVIO crawler (still unstable). Added: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLogUpdater.java Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileList.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/JCacheManager.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLog.java java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileCrawler.java Tue May 26 13:54:51 2015 @@ -26,6 +26,9 @@ * * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a> */ +// TODO: write out Auger XML (and don't actually execute job) +// TODO: write summary EVIO file with control/EPICS events (maybe?) +// TODO: flag to allow overwriting existing information in run table public final class EvioFileCrawler { /** @@ -342,7 +345,7 @@ // Insert run information into the database. if (this.update) { // Update run log. - runs.insert(); + new RunLogUpdater(runs).insert(); } // Update the timestamp file which can be used to tell which files have been processed. Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileList.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileList.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileList.java Tue May 26 13:54:51 2015 @@ -1,9 +1,6 @@ package org.hps.record.evio.crawler; import java.io.File; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -74,30 +71,7 @@ } return totalEvents; } - - /** - * Insert the file names into the run database. - * - * @param connection the database connection - * @param run the run number - * @throws SQLException if there is a problem executing one of the database queries - */ - void insert(final Connection connection, final int run) throws SQLException { - LOGGER.info("updating file list ..."); - PreparedStatement filesStatement = null; - filesStatement = connection.prepareStatement("INSERT INTO run_log_files (run, directory, name) VALUES(?, ?, ?)"); - LOGGER.info("inserting files from run " + run + " into database"); - for (final File file : this) { - LOGGER.info("creating update statement for " + file.getPath()); - filesStatement.setInt(1, run); - filesStatement.setString(2, file.getParentFile().getPath()); - filesStatement.setString(3, file.getName()); - LOGGER.info("executing statement: " + filesStatement); - filesStatement.executeUpdate(); - } - LOGGER.info("run_log_files was updated!"); - } - + /** * Get the last file. * Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/EvioFileUtilities.java Tue May 26 13:54:51 2015 @@ -59,7 +59,7 @@ Date date = null; EvioReader reader = null; try { - reader = open(file); + reader = open(file, true); EvioEvent event; if (gotoEvent > 0) { reader.gotoEventNumber(gotoEvent); @@ -118,7 +118,7 @@ if (date == null) { EvioReader reader = null; try { - reader = open(file); + reader = open(file, true); reader.gotoEventNumber(reader.getEventCount() - 11); EvioEvent event = null; while ((event = reader.parseNextEvent()) != null) { @@ -170,7 +170,7 @@ if (date == null) { EvioReader reader = null; try { - reader = open(file); + reader = open(file, true); EvioEvent event = null; while ((event = reader.parseNextEvent()) != null) { if (EvioEventUtilities.isPhysicsEvent(event)) { @@ -268,6 +268,6 @@ * @throws EvioException if there is an error reading the EVIO data */ static EvioReader open(final String path) throws IOException, EvioException { - return open(new File(path)); + return open(new File(path), true); } } Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/JCacheManager.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/JCacheManager.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/JCacheManager.java Tue May 26 13:54:51 2015 @@ -462,8 +462,10 @@ LOGGER.info("waiting for files to be cached ..."); + // This can happen if all the files are already cached. if (this.cacheStatuses.isEmpty()) { - throw new IllegalStateException("There are no files registered with the cache manager."); + LOGGER.warning("no files to be cached"); + return true; } // This is the return value which will be changed to true if all files are cached successfully. Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLog.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLog.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLog.java Tue May 26 13:54:51 2015 @@ -1,17 +1,13 @@ package org.hps.record.evio.crawler; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; -import org.hps.conditions.database.ConnectionParameters; import org.lcsim.util.log.LogUtil; /** @@ -32,7 +28,7 @@ /** * A map between run numbers and the run summary information. */ - private final Map<Integer, RunSummary> runs = new HashMap<Integer, RunSummary>(); + private final Map<Integer, RunSummary> runs = new LinkedHashMap<Integer, RunSummary>(); /** * Get a run summary by run number. @@ -49,6 +45,10 @@ } return this.runs.get(run); } + + public Collection<RunSummary> getRunSummaries() { + return this.runs.values(); + } /** * Get a list of sorted run numbers in this run log. @@ -61,79 +61,6 @@ final List<Integer> runList = new ArrayList<Integer>(this.runs.keySet()); Collections.sort(runList); return runList; - } - - /** - * Insert all the information from the run log into the run database. - */ - void insert() { - - LOGGER.info("inserting runs into run_log ..."); - final ConnectionParameters cp = new ConnectionParameters("root", "derp", "hps_run_db", "localhost"); - final Connection connection = cp.createConnection(); - try { - connection.setAutoCommit(false); - - this.insertRunLog(connection); - - this.insertFiles(connection); - - connection.commit(); - - } catch (final SQLException e) { - LOGGER.log(Level.SEVERE, "rolling back transaction", e); - try { - connection.rollback(); - } catch (final SQLException e2) { - throw new RuntimeException(e); - } - } finally { - if (connection != null) { - try { - connection.setAutoCommit(true); - connection.close(); - } catch (final SQLException e) { - throw new RuntimeException(e); - } - } - } - } - - /** - * Insert the file lists into the run database. - * - * @param connection the database connection - * @throws SQLException if there is an error executing the SQL query - */ - private void insertFiles(final Connection connection) throws SQLException { - for (final int run : this.getSortedRunNumbers()) { - this.getRunSummary(run).getEvioFileList().insert(connection, run); - } - } - - /** - * Insert the run summary information into the database. - * - * @param connection the database connection - * @throws SQLException if there is an error querying the database - */ - private void insertRunLog(final Connection connection) throws SQLException { - PreparedStatement runLogStatement = null; - runLogStatement = connection - .prepareStatement("INSERT INTO run_log (run, start_date, end_date, nevents, nfiles, end_ok, last_updated) VALUES(?, ?, ?, ?, ?, ?, NOW())"); - for (final Integer run : this.getSortedRunNumbers()) { - LOGGER.info("preparing to insert run " + run + " into database .."); - final RunSummary runSummary = this.runs.get(run); - runLogStatement.setInt(1, run); - runLogStatement.setTimestamp(2, new java.sql.Timestamp(runSummary.getStartDate().getTime())); - runLogStatement.setTimestamp(3, new java.sql.Timestamp(runSummary.getEndDate().getTime())); - runLogStatement.setInt(4, runSummary.getTotalEvents()); - runLogStatement.setInt(5, runSummary.getEvioFileList().size()); - runLogStatement.setBoolean(6, runSummary.isEndOkay()); - runLogStatement.executeUpdate(); - LOGGER.info("committed run " + run + " to run_log"); - } - LOGGER.info("run_log was updated!"); } /** Added: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLogUpdater.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLogUpdater.java (added) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunLogUpdater.java Tue May 26 13:54:51 2015 @@ -0,0 +1,151 @@ +package org.hps.record.evio.crawler; + +import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.hps.conditions.database.ConnectionParameters; +import org.lcsim.util.log.LogUtil; + +/** + * Updates the run database with run log information from crawler job. + * + * @author Jeremy McCormick + */ +public class RunLogUpdater { + + /** + * Setup logging. + */ + private static final Logger LOGGER = LogUtil.create(RunLogUpdater.class); + + RunLog runLog; + + final Connection connection; + + RunLogUpdater(RunLog runLog) { + this.runLog = runLog; + + // Create database connection to use in this session. + final ConnectionParameters cp = new ConnectionParameters("root", "derp", "hps_run_db", "localhost"); + connection = cp.createConnection(); + } + + void close() { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + boolean hasRun(int run) { + boolean hasRun = false; + PreparedStatement statement = null; + try { + statement = connection.prepareStatement("SELECT run from run_log where run = ?"); + statement.setInt(1, run); + ResultSet rs = statement.executeQuery(); + if (rs.next()) hasRun = true; + } catch (final SQLException e) { + throw new RuntimeException(e); + } + return hasRun; + } + + /** + * Insert all the information from the run log into the run database. + */ + void insert() { + + LOGGER.info("inserting runs into run_log ..."); + try { + connection.setAutoCommit(false); + + this.insertRunLog(connection); + + this.insertFiles(connection); + + connection.commit(); + + } catch (final SQLException e) { + LOGGER.log(Level.SEVERE, "rolling back transaction", e); + try { + connection.rollback(); + } catch (final SQLException e2) { + throw new RuntimeException(e); + } + } finally { + try { + connection.setAutoCommit(true); + } catch (final SQLException e) { + throw new RuntimeException(e); + } + } + } + + /** + * Insert the file lists into the run database. + * + * @param connection the database connection + * @throws SQLException if there is an error executing the SQL query + */ + private void insertFiles(final Connection connection) throws SQLException { + for (final int run : runLog.getSortedRunNumbers()) { + insertFiles(connection, run, runLog.getRunSummary(run).getEvioFileList()); + } + } + + /** + * Insert the run summary information into the database. + * + * @param connection the database connection + * @throws SQLException if there is an error querying the database + */ + private void insertRunLog(final Connection connection) throws SQLException { + PreparedStatement runLogStatement = null; + runLogStatement = connection + .prepareStatement("INSERT INTO run_log (run, start_date, end_date, nevents, nfiles, end_ok, last_updated) VALUES(?, ?, ?, ?, ?, ?, NOW())"); + for (final Integer run : runLog.getSortedRunNumbers()) { + LOGGER.info("preparing to insert run " + run + " into database .."); + final RunSummary runSummary = runLog.getRunSummary(run); + runLogStatement.setInt(1, run); + runLogStatement.setTimestamp(2, new java.sql.Timestamp(runSummary.getStartDate().getTime())); + runLogStatement.setTimestamp(3, new java.sql.Timestamp(runSummary.getEndDate().getTime())); + runLogStatement.setInt(4, runSummary.getTotalEvents()); + runLogStatement.setInt(5, runSummary.getEvioFileList().size()); + runLogStatement.setBoolean(6, runSummary.isEndOkay()); + runLogStatement.executeUpdate(); + LOGGER.info("committed run " + run + " to run_log"); + } + LOGGER.info("run_log was updated!"); + } + + /** + * Insert the file names into the run database. + * + * @param connection the database connection + * @param run the run number + * @throws SQLException if there is a problem executing one of the database queries + */ + void insertFiles(final Connection connection, final int run, List<File> files) throws SQLException { + LOGGER.info("updating file list ..."); + PreparedStatement filesStatement = null; + filesStatement = connection.prepareStatement("INSERT INTO run_log_files (run, directory, name) VALUES(?, ?, ?)"); + LOGGER.info("inserting files from run " + run + " into database"); + for (final File file : files) { + LOGGER.info("creating update statement for " + file.getPath()); + filesStatement.setInt(1, run); + filesStatement.setString(2, file.getParentFile().getPath()); + filesStatement.setString(3, file.getName()); + LOGGER.info("executing statement: " + filesStatement); + filesStatement.executeUpdate(); + } + LOGGER.info("run_log_files was updated!"); + } +} Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java Tue May 26 13:54:51 2015 @@ -134,6 +134,13 @@ return this.processors; } + /** + * Return <code>true</code> if valid END event can be located. + * + * @param reader the EVIO reader + * @return <code>true</code> if valid END event is located + * @throws Exception if there are IO problems using the reader + */ boolean isEndOkay(final EvioReader reader) throws Exception { LOGGER.info("checking is END okay ..."); boolean endOkay = false; @@ -196,7 +203,7 @@ try { // Open with wrapper method which will use the cached file path if necessary. LOGGER.fine("opening " + file.getPath() + " for reading ..."); - reader = EvioFileUtilities.open(file); + reader = EvioFileUtilities.open(file, true); LOGGER.fine("done opening " + file.getPath()); // If this is the first file then get the start date.