From a8caa2037832e63c4941cdc7f96c6bd25b23bcc0 Mon Sep 17 00:00:00 2001 From: hanna Date: Wed, 14 Jul 2010 20:34:43 +0000 Subject: [PATCH] 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 --- .../sting/gatk/executive/ShardTraverser.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java b/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java index 709a59e2c..40d194341 100755 --- a/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java +++ b/java/src/org/broadinstitute/sting/gatk/executive/ShardTraverser.java @@ -57,35 +57,36 @@ public class ShardTraverser implements Callable { } public Object call() { - long startTime = System.currentTimeMillis(); - - Object accumulator = walker.reduceInit(); - LocusWalker lWalker = (LocusWalker)walker; - WindowMaker windowMaker = new WindowMaker(microScheduler.getReadIterator(shard),shard.getGenomeLocs(),walker.getMandatoryReadFilters(), lWalker.getDiscards()); - ShardDataProvider dataProvider = null; try { + long startTime = System.currentTimeMillis(); + + Object accumulator = walker.reduceInit(); + LocusWalker lWalker = (LocusWalker)walker; + WindowMaker windowMaker = new WindowMaker(microScheduler.getReadIterator(shard),shard.getGenomeLocs(),walker.getMandatoryReadFilters(),lWalker.getDiscards()); + ShardDataProvider dataProvider = null; + for(WindowMaker.WindowMakerIterator iterator: windowMaker) { dataProvider = new LocusShardDataProvider(shard,iterator.getSourceInfo(),iterator.getLocus(),iterator,microScheduler.reference,microScheduler.rods); accumulator = traversalEngine.traverse( walker, dataProvider, accumulator ); dataProvider.close(); } - } - finally { + if (dataProvider != null) dataProvider.close(); windowMaker.close(); outputMergeTask = outputTracker.closeStorage(); + long endTime = System.currentTimeMillis(); + + microScheduler.reportShardTraverseTime(endTime-startTime); + + return accumulator; + } + finally { synchronized(this) { complete = true; notifyAll(); } } - - long endTime = System.currentTimeMillis(); - - microScheduler.reportShardTraverseTime(endTime-startTime); - - return accumulator; } /**