Merge pull request #1433 from broadinstitute/rhl_progress_meter_periodicity

Enable control of reporting periodicity
This commit is contained in:
Ron Levine 2016-07-13 10:14:01 -04:00 committed by GitHub
commit 5255435f0e
4 changed files with 21 additions and 31 deletions

View File

@ -52,6 +52,9 @@ public class GATKArgumentCollection {
// the default value of the stop of the expanded window
public static final int DEFAULT_REFERENCE_WINDOW_STOP = 0;
// the default time in seconds between progress meter calls
public final static long DEFAULT_SECONDS_BETWEEN_PROGRESS_UPDATES = 10;
/** the constructor */
public GATKArgumentCollection() {
}
@ -354,6 +357,10 @@ public class GATKArgumentCollection {
@Argument(fullName = "globalQScorePrior", shortName = "globalQScorePrior", doc = "Global Qscore Bayesian prior to use for BQSR", required = false)
public double globalQScorePrior = -1.0;
@Advanced
@Argument(fullName="secondsBetweenProgressUpdates", shortName = "secondsBetweenProgressUpdates", doc = "Time interval for process meter information output (in seconds)", required=false)
public long secondsBetweenProgressUpdates = DEFAULT_SECONDS_BETWEEN_PROGRESS_UPDATES;
// --------------------------------------------------------------------------------------------------------------
//

View File

@ -204,7 +204,8 @@ public abstract class MicroScheduler implements MicroSchedulerMBean {
// Create the progress meter, and register it with the analysis engine
engine.registerProgressMeter(new ProgressMeter(progressLogFile,
availableTraversalEngines.peek().getTraversalUnits(),
engine.getRegionsOfGenomeBeingProcessed()));
engine.getRegionsOfGenomeBeingProcessed(),
engine.getArguments().secondsBetweenProgressUpdates));
// Now that we have a progress meter, go through and initialize the traversal engines
for ( final TraversalEngine traversalEngine : allCreatedTraversalEngines )

View File

@ -170,22 +170,15 @@ public class ProgressMeter {
/**
* Create a new ProgressMeter
*
* Note that progress meter isn't started until the client calls start()
*
* @param performanceLogFile an optional performance log file where a table of performance logs will be written
* @param processingUnitName the name of the unit type being processed, suitable for saying X seconds per processingUnitName
* @param processingIntervals the intervals being processed
* @param secondsBetweenProgressUpdates how frequently (in seconds) to print progress
*/
public ProgressMeter(final File performanceLogFile,
final String processingUnitName,
final GenomeLocSortedSet processingIntervals) {
this(performanceLogFile, processingUnitName, processingIntervals, ProgressMeterDaemon.DEFAULT_POLL_FREQUENCY_MILLISECONDS);
}
protected ProgressMeter(final File performanceLogFile,
final String processingUnitName,
final GenomeLocSortedSet processingIntervals,
final long pollingFrequency) {
final long secondsBetweenProgressUpdates) {
if ( processingUnitName == null ) throw new IllegalArgumentException("processingUnitName cannot be null");
if ( processingIntervals == null ) throw new IllegalArgumentException("Target intervals cannot be null");
@ -212,7 +205,7 @@ public class ProgressMeter {
targetSizeInBP = processingIntervals.coveredSize();
// start up the timer
progressMeterDaemon = new ProgressMeterDaemon(this, pollingFrequency);
progressMeterDaemon = new ProgressMeterDaemon(this, secondsBetweenProgressUpdates);
}
public ProgressMeterDaemon getProgressMeterDaemon() {

View File

@ -25,6 +25,8 @@
package org.broadinstitute.gatk.utils.progressmeter;
import java.util.concurrent.TimeUnit;
/**
* Daemon thread that periodically prints the progress of the progress meter
*
@ -33,20 +35,10 @@ package org.broadinstitute.gatk.utils.progressmeter;
* Time: 9:16 PM
*/
public final class ProgressMeterDaemon extends Thread {
public final static long DEFAULT_POLL_FREQUENCY_MILLISECONDS = 10 * 1000;
/**
* How frequently should we poll and print progress?
*/
private final long pollFrequencyMilliseconds;
/**
* How long are we waiting between print progress calls are issued?
* @return the time in milliseconds between progress meter calls
*/
private long getPollFrequencyMilliseconds() {
return pollFrequencyMilliseconds;
}
private final long secondsBetweenProgressUpdates;
/**
* Are we to continue periodically printing status, or should we shut down?
@ -60,22 +52,19 @@ public final class ProgressMeterDaemon extends Thread {
/**
* Create a new ProgressMeterDaemon printing progress for meter
* @param meter the progress meter to print progress of
* @param meter the progress meter to print progress
* @param secondsBetweenProgressUpdates how frequently (in seconds) to print progress
*/
public ProgressMeterDaemon(final ProgressMeter meter, final long pollFrequencyMilliseconds) {
public ProgressMeterDaemon(final ProgressMeter meter, final long secondsBetweenProgressUpdates) {
if ( meter == null ) throw new IllegalArgumentException("meter cannot be null");
if ( pollFrequencyMilliseconds <= 0 ) throw new IllegalArgumentException("pollFrequencyMilliseconds must be greater than 0 but got " + pollFrequencyMilliseconds);
if ( secondsBetweenProgressUpdates <= 0 ) throw new IllegalArgumentException("secondsBetweenProgressUpdates must be greater than 0 but got " + secondsBetweenProgressUpdates);
this.meter = meter;
this.pollFrequencyMilliseconds = pollFrequencyMilliseconds;
this.secondsBetweenProgressUpdates = secondsBetweenProgressUpdates;
setDaemon(true);
setName("ProgressMeterDaemon");
}
public ProgressMeterDaemon(final ProgressMeter meter) {
this(meter, DEFAULT_POLL_FREQUENCY_MILLISECONDS);
}
/**
* Tells this daemon thread to shutdown at the next opportunity, as the progress
* metering is complete.
@ -102,7 +91,7 @@ public final class ProgressMeterDaemon extends Thread {
meter.printProgress(false);
meter.updateElapsedTimeInNanoseconds();
try {
Thread.sleep(getPollFrequencyMilliseconds());
Thread.sleep(TimeUnit.SECONDS.toMillis(secondsBetweenProgressUpdates));
} catch (InterruptedException e) {
throw new RuntimeException(e);
}