GenomeLocProcessingTracker was using SimpleTimer in a non-thread safe way. No longer providing an interface to time parallel operations. Now issues warning if someone enables distributed GATK, as this is considered an unstable, experimental engine feature.
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@5842 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
a18b0152df
commit
d005c4bf09
|
|
@ -71,15 +71,6 @@ public class LinearMicroScheduler extends MicroScheduler {
|
||||||
accumulator.accumulate(dataProvider,result);
|
accumulator.accumulate(dataProvider,result);
|
||||||
dataProvider.close();
|
dataProvider.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( logger.isDebugEnabled() ) {
|
|
||||||
counter++;
|
|
||||||
logger.debug(String.format("At %s: processed %d shards. %.2e s / lock (n=%d), %.2e s / read (n=%d), %.2e s / write (n=%d)",
|
|
||||||
shard.getLocation(), counter,
|
|
||||||
processingTracker.getTimePerLock(), processingTracker.getNLocks(),
|
|
||||||
processingTracker.getTimePerRead(), processingTracker.getNReads(),
|
|
||||||
processingTracker.getTimePerWrite(), processingTracker.getNWrites()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Object result = accumulator.finishTraversal();
|
Object result = accumulator.finishTraversal();
|
||||||
|
|
|
||||||
|
|
@ -165,6 +165,7 @@ public abstract class MicroScheduler implements MicroSchedulerMBean {
|
||||||
// create the processing tracker
|
// create the processing tracker
|
||||||
//
|
//
|
||||||
if ( engine.getArguments().processingTrackerFile != null ) {
|
if ( engine.getArguments().processingTrackerFile != null ) {
|
||||||
|
logger.warn("Distributed GATK is an experimental engine feature, and is likely to not work correctly or reliably.");
|
||||||
if ( engine.getArguments().restartProcessingTracker && engine.getArguments().processingTrackerFile.exists() ) {
|
if ( engine.getArguments().restartProcessingTracker && engine.getArguments().processingTrackerFile.exists() ) {
|
||||||
engine.getArguments().processingTrackerFile.delete();
|
engine.getArguments().processingTrackerFile.delete();
|
||||||
logger.info("Deleting ProcessingTracker file " + engine.getArguments().processingTrackerFile);
|
logger.info("Deleting ProcessingTracker file " + engine.getArguments().processingTrackerFile);
|
||||||
|
|
|
||||||
|
|
@ -82,10 +82,13 @@ public abstract class GenomeLocProcessingTracker {
|
||||||
|
|
||||||
//
|
//
|
||||||
// Timers for recording performance information
|
// Timers for recording performance information
|
||||||
|
// Note -- these cannot be used because this class isn't thread safe, and neither are the
|
||||||
|
// timers, so they result in invalid operations w.r.t. the SimpleTimer contract
|
||||||
//
|
//
|
||||||
protected final SimpleTimer writeTimer = new SimpleTimer("writeTimer");
|
// protected final SimpleTimer writeTimer = new SimpleTimer("writeTimer");
|
||||||
protected final SimpleTimer readTimer = new SimpleTimer("readTimer");
|
// protected final SimpleTimer readTimer = new SimpleTimer("readTimer");
|
||||||
protected final SimpleTimer lockWaitTimer = new SimpleTimer("lockWaitTimer");
|
// protected final SimpleTimer lockWaitTimer = new SimpleTimer("lockWaitTimer");
|
||||||
|
protected final SimpleTimer timer = new SimpleTimer();
|
||||||
protected long nLocks = 0, nWrites = 0, nReads = 0;
|
protected long nLocks = 0, nWrites = 0, nReads = 0;
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------
|
||||||
|
|
@ -318,10 +321,10 @@ public abstract class GenomeLocProcessingTracker {
|
||||||
protected final Map<GenomeLoc, ProcessingLoc> updateAndGetProcessingLocs(String myName) {
|
protected final Map<GenomeLoc, ProcessingLoc> updateAndGetProcessingLocs(String myName) {
|
||||||
return new WithLock<Map<GenomeLoc, ProcessingLoc>>(myName) {
|
return new WithLock<Map<GenomeLoc, ProcessingLoc>>(myName) {
|
||||||
public Map<GenomeLoc, ProcessingLoc> doBody() {
|
public Map<GenomeLoc, ProcessingLoc> doBody() {
|
||||||
readTimer.restart();
|
// readTimer.restart();
|
||||||
for ( ProcessingLoc p : readNewLocs() )
|
for ( ProcessingLoc p : readNewLocs() )
|
||||||
processingLocs.put(p.getLocation(), p);
|
processingLocs.put(p.getLocation(), p);
|
||||||
readTimer.stop();
|
// readTimer.stop();
|
||||||
nReads++;
|
nReads++;
|
||||||
return processingLocs;
|
return processingLocs;
|
||||||
}
|
}
|
||||||
|
|
@ -335,10 +338,10 @@ public abstract class GenomeLocProcessingTracker {
|
||||||
* @param myName
|
* @param myName
|
||||||
*/
|
*/
|
||||||
protected final void registerNewLocsWithTimers(Collection<ProcessingLoc> plocs, String myName) {
|
protected final void registerNewLocsWithTimers(Collection<ProcessingLoc> plocs, String myName) {
|
||||||
writeTimer.restart();
|
// writeTimer.restart();
|
||||||
registerNewLocs(plocs);
|
registerNewLocs(plocs);
|
||||||
nWrites++;
|
nWrites++;
|
||||||
writeTimer.stop();
|
// writeTimer.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void printStatusHeader() {
|
private final void printStatusHeader() {
|
||||||
|
|
@ -360,15 +363,15 @@ public abstract class GenomeLocProcessingTracker {
|
||||||
* @param id the name of the process doing the locking
|
* @param id the name of the process doing the locking
|
||||||
*/
|
*/
|
||||||
private final void lock(String id) {
|
private final void lock(String id) {
|
||||||
lockWaitTimer.restart();
|
//lockWaitTimer.restart();
|
||||||
boolean hadLock = lock.ownsLock();
|
boolean hadLock = lock.ownsLock();
|
||||||
if ( ! hadLock ) {
|
if ( ! hadLock ) {
|
||||||
nLocks++;
|
nLocks++;
|
||||||
printStatus(id, lockWaitTimer.currentTime(), GOING_FOR_LOCK);
|
//printStatus(id, lockWaitTimer.currentTime(), GOING_FOR_LOCK);
|
||||||
}
|
}
|
||||||
lock.lock();
|
lock.lock();
|
||||||
lockWaitTimer.stop();
|
//lockWaitTimer.stop();
|
||||||
if ( ! hadLock ) printStatus(id, lockWaitTimer.currentTime(), HAVE_LOCK);
|
//if ( ! hadLock ) printStatus(id, lockWaitTimer.currentTime(), HAVE_LOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -376,18 +379,18 @@ public abstract class GenomeLocProcessingTracker {
|
||||||
* @param id the name of the process doing the unlocking
|
* @param id the name of the process doing the unlocking
|
||||||
*/
|
*/
|
||||||
private final void unlock(String id) {
|
private final void unlock(String id) {
|
||||||
if ( lock.getHoldCount() == 1 ) printStatus(id, lockWaitTimer.currentTime(), RELEASING_LOCK);
|
if ( lock.getHoldCount() == 1 ) printStatus(id, timer.currentTime(), RELEASING_LOCK);
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
if ( ! lock.ownsLock() ) printStatus(id, lockWaitTimer.currentTime(), RUNNING);
|
if ( ! lock.ownsLock() ) printStatus(id, timer.currentTime(), RUNNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
// useful code for getting
|
// useful code for getting
|
||||||
public final long getNLocks() { return nLocks; }
|
public final long getNLocks() { return nLocks; }
|
||||||
public final long getNReads() { return nReads; }
|
public final long getNReads() { return nReads; }
|
||||||
public final long getNWrites() { return nWrites; }
|
public final long getNWrites() { return nWrites; }
|
||||||
public final double getTimePerLock() { return lockWaitTimer.getElapsedTime() / Math.max(nLocks, 1); }
|
// public final double getTimePerLock() { return lockWaitTimer.getElapsedTime() / Math.max(nLocks, 1); }
|
||||||
public final double getTimePerRead() { return readTimer.getElapsedTime() / Math.max(nReads,1); }
|
// public final double getTimePerRead() { return readTimer.getElapsedTime() / Math.max(nReads,1); }
|
||||||
public final double getTimePerWrite() { return writeTimer.getElapsedTime() / Math.max(nWrites,1); }
|
// public final double getTimePerWrite() { return writeTimer.getElapsedTime() / Math.max(nWrites,1); }
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue