Previously the hierarchical microscheduler defensively coded around and reported exceptions of

the walker itself, but didn't do a great job of catching framework exceptions.  This became extremely
unfortunate in the case where walkers caused exceptions that manifested themselves in the framework,
such as when the walker opens more files than file handles are available.

Reworked the exception handling so that framework errors are treated like walker errors and the resulting
exception bubbles out of the walker.  Stack traces for threaded walkers are still convoluted and nasty.


git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@3794 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
hanna 2010-07-14 20:34:43 +00:00
parent bf384f48e1
commit a8caa20378
1 changed files with 15 additions and 14 deletions

View File

@ -57,36 +57,37 @@ public class ShardTraverser implements Callable {
} }
public Object call() { public Object call() {
try {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
Object accumulator = walker.reduceInit(); Object accumulator = walker.reduceInit();
LocusWalker lWalker = (LocusWalker)walker; LocusWalker lWalker = (LocusWalker)walker;
WindowMaker windowMaker = new WindowMaker(microScheduler.getReadIterator(shard),shard.getGenomeLocs(),walker.getMandatoryReadFilters(), lWalker.getDiscards()); WindowMaker windowMaker = new WindowMaker(microScheduler.getReadIterator(shard),shard.getGenomeLocs(),walker.getMandatoryReadFilters(),lWalker.getDiscards());
ShardDataProvider dataProvider = null; ShardDataProvider dataProvider = null;
try {
for(WindowMaker.WindowMakerIterator iterator: windowMaker) { for(WindowMaker.WindowMakerIterator iterator: windowMaker) {
dataProvider = new LocusShardDataProvider(shard,iterator.getSourceInfo(),iterator.getLocus(),iterator,microScheduler.reference,microScheduler.rods); dataProvider = new LocusShardDataProvider(shard,iterator.getSourceInfo(),iterator.getLocus(),iterator,microScheduler.reference,microScheduler.rods);
accumulator = traversalEngine.traverse( walker, dataProvider, accumulator ); accumulator = traversalEngine.traverse( walker, dataProvider, accumulator );
dataProvider.close(); dataProvider.close();
} }
}
finally {
if (dataProvider != null) dataProvider.close(); if (dataProvider != null) dataProvider.close();
windowMaker.close(); windowMaker.close();
outputMergeTask = outputTracker.closeStorage(); outputMergeTask = outputTracker.closeStorage();
synchronized(this) {
complete = true;
notifyAll();
}
}
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
microScheduler.reportShardTraverseTime(endTime-startTime); microScheduler.reportShardTraverseTime(endTime-startTime);
return accumulator; return accumulator;
} }
finally {
synchronized(this) {
complete = true;
notifyAll();
}
}
}
/** /**
* Has this traversal completed? * Has this traversal completed?