When writing the initial commit for nt + nct I realized this class was really just a ThreadGroupOutputTracker
-- The code is cleaner and the logical more obvious now.
This commit is contained in:
parent
3e8d992828
commit
9fd30d6f1c
|
|
@ -7,7 +7,7 @@ import org.broadinstitute.sting.gatk.datasources.reads.SAMDataSource;
|
||||||
import org.broadinstitute.sting.gatk.datasources.reads.Shard;
|
import org.broadinstitute.sting.gatk.datasources.reads.Shard;
|
||||||
import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource;
|
import org.broadinstitute.sting.gatk.datasources.rmd.ReferenceOrderedDataSource;
|
||||||
import org.broadinstitute.sting.gatk.io.OutputTracker;
|
import org.broadinstitute.sting.gatk.io.OutputTracker;
|
||||||
import org.broadinstitute.sting.gatk.io.ThreadBasedOutputTracker;
|
import org.broadinstitute.sting.gatk.io.ThreadGroupOutputTracker;
|
||||||
import org.broadinstitute.sting.gatk.resourcemanagement.ThreadAllocation;
|
import org.broadinstitute.sting.gatk.resourcemanagement.ThreadAllocation;
|
||||||
import org.broadinstitute.sting.gatk.walkers.TreeReducible;
|
import org.broadinstitute.sting.gatk.walkers.TreeReducible;
|
||||||
import org.broadinstitute.sting.gatk.walkers.Walker;
|
import org.broadinstitute.sting.gatk.walkers.Walker;
|
||||||
|
|
@ -39,7 +39,7 @@ public class HierarchicalMicroScheduler extends MicroScheduler implements Hierar
|
||||||
/**
|
/**
|
||||||
* A thread local output tracker for managing output per-thread.
|
* A thread local output tracker for managing output per-thread.
|
||||||
*/
|
*/
|
||||||
private ThreadBasedOutputTracker outputTracker = new ThreadBasedOutputTracker();
|
private ThreadGroupOutputTracker outputTracker = new ThreadGroupOutputTracker();
|
||||||
|
|
||||||
private final Queue<TreeReduceTask> reduceTasks = new LinkedList<TreeReduceTask>();
|
private final Queue<TreeReduceTask> reduceTasks = new LinkedList<TreeReduceTask>();
|
||||||
|
|
||||||
|
|
@ -101,7 +101,7 @@ public class HierarchicalMicroScheduler extends MicroScheduler implements Hierar
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates threads for HMS each with a unique thread group. Critical to
|
* Creates threads for HMS each with a unique thread group. Critical to
|
||||||
* track outputs via the ThreadBasedOutputTracker.
|
* track outputs via the ThreadGroupOutputTracker.
|
||||||
*/
|
*/
|
||||||
private static class UniqueThreadGroupThreadFactory implements ThreadFactory {
|
private static class UniqueThreadGroupThreadFactory implements ThreadFactory {
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import org.apache.log4j.Logger;
|
||||||
import org.broadinstitute.sting.gatk.datasources.providers.LocusShardDataProvider;
|
import org.broadinstitute.sting.gatk.datasources.providers.LocusShardDataProvider;
|
||||||
import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider;
|
import org.broadinstitute.sting.gatk.datasources.providers.ShardDataProvider;
|
||||||
import org.broadinstitute.sting.gatk.datasources.reads.Shard;
|
import org.broadinstitute.sting.gatk.datasources.reads.Shard;
|
||||||
import org.broadinstitute.sting.gatk.io.ThreadBasedOutputTracker;
|
import org.broadinstitute.sting.gatk.io.ThreadGroupOutputTracker;
|
||||||
import org.broadinstitute.sting.gatk.traversals.TraversalEngine;
|
import org.broadinstitute.sting.gatk.traversals.TraversalEngine;
|
||||||
import org.broadinstitute.sting.gatk.walkers.Walker;
|
import org.broadinstitute.sting.gatk.walkers.Walker;
|
||||||
import org.broadinstitute.sting.utils.Utils;
|
import org.broadinstitute.sting.utils.Utils;
|
||||||
|
|
@ -30,7 +30,7 @@ public class ShardTraverser implements Callable {
|
||||||
final private HierarchicalMicroScheduler microScheduler;
|
final private HierarchicalMicroScheduler microScheduler;
|
||||||
final private Walker walker;
|
final private Walker walker;
|
||||||
final private Shard shard;
|
final private Shard shard;
|
||||||
final private ThreadBasedOutputTracker outputTracker;
|
final private ThreadGroupOutputTracker outputTracker;
|
||||||
private OutputMergeTask outputMergeTask;
|
private OutputMergeTask outputMergeTask;
|
||||||
|
|
||||||
/** our log, which we want to capture anything from this class */
|
/** our log, which we want to capture anything from this class */
|
||||||
|
|
@ -44,7 +44,7 @@ public class ShardTraverser implements Callable {
|
||||||
public ShardTraverser( HierarchicalMicroScheduler microScheduler,
|
public ShardTraverser( HierarchicalMicroScheduler microScheduler,
|
||||||
Walker walker,
|
Walker walker,
|
||||||
Shard shard,
|
Shard shard,
|
||||||
ThreadBasedOutputTracker outputTracker) {
|
ThreadGroupOutputTracker outputTracker) {
|
||||||
this.microScheduler = microScheduler;
|
this.microScheduler = microScheduler;
|
||||||
this.walker = walker;
|
this.walker = walker;
|
||||||
this.shard = shard;
|
this.shard = shard;
|
||||||
|
|
|
||||||
|
|
@ -51,12 +51,12 @@ import java.util.Map;
|
||||||
* @author mhanna, depristo
|
* @author mhanna, depristo
|
||||||
* @version 0.2
|
* @version 0.2
|
||||||
*/
|
*/
|
||||||
public class ThreadBasedOutputTracker extends OutputTracker {
|
public class ThreadGroupOutputTracker extends OutputTracker {
|
||||||
/**
|
/**
|
||||||
* A map from thread ID of the master thread to the storage map from
|
* A map from thread ID of the master thread to the storage map from
|
||||||
* Stub to Storage objects
|
* Stub to Storage objects
|
||||||
*/
|
*/
|
||||||
private Map<Long, Map<Stub, Storage>> threadsToStorage = new HashMap<Long, Map<Stub, Storage>>();
|
private Map<ThreadGroup, Map<Stub, Storage>> threadsToStorage = new HashMap<ThreadGroup, Map<Stub, Storage>>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A total hack. If bypass = true, bypass thread local storage and write directly
|
* A total hack. If bypass = true, bypass thread local storage and write directly
|
||||||
|
|
@ -79,12 +79,12 @@ public class ThreadBasedOutputTracker extends OutputTracker {
|
||||||
* the master thread ID.
|
* the master thread ID.
|
||||||
*/
|
*/
|
||||||
public synchronized void initializeStorage() {
|
public synchronized void initializeStorage() {
|
||||||
final long threadID = Thread.currentThread().getId();
|
final ThreadGroup group = Thread.currentThread().getThreadGroup();
|
||||||
Map<Stub,Storage> threadLocalOutputStreams = threadsToStorage.get(threadID);
|
Map<Stub,Storage> threadLocalOutputStreams = threadsToStorage.get(group);
|
||||||
|
|
||||||
if( threadLocalOutputStreams == null ) {
|
if( threadLocalOutputStreams == null ) {
|
||||||
threadLocalOutputStreams = new HashMap<Stub,Storage>();
|
threadLocalOutputStreams = new HashMap<Stub,Storage>();
|
||||||
threadsToStorage.put( threadID, threadLocalOutputStreams );
|
threadsToStorage.put( group, threadLocalOutputStreams );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( final Stub stub : outputs.keySet() ) {
|
for ( final Stub stub : outputs.keySet() ) {
|
||||||
|
|
@ -118,27 +118,15 @@ public class ThreadBasedOutputTracker extends OutputTracker {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
final Thread[] members = new Thread[1000]; // TODO -- dangerous -- fixme
|
|
||||||
private synchronized Map<Stub,Storage> findStorage(final Thread thread) {
|
private synchronized Map<Stub,Storage> findStorage(final Thread thread) {
|
||||||
final Map<Stub, Storage> map = threadsToStorage.get(thread.getId());
|
final Map<Stub, Storage> map = threadsToStorage.get(thread.getThreadGroup());
|
||||||
|
|
||||||
if ( map != null ) {
|
if ( map != null ) {
|
||||||
return map;
|
return map;
|
||||||
} else {
|
} else {
|
||||||
final ThreadGroup tg = thread.getThreadGroup();
|
|
||||||
final int nInfo = tg.enumerate(members);
|
|
||||||
if ( nInfo == members.length )
|
|
||||||
throw new ReviewedStingException("too many threads in thread-group " + tg + " to safely get info. " +
|
|
||||||
"Maximum allowed threads is " + members.length);
|
|
||||||
|
|
||||||
for ( int i = 0; i < nInfo; i++ ) {
|
|
||||||
final Map<Stub, Storage> map2 = threadsToStorage.get(members[i].getId());
|
|
||||||
if ( map2 != null )
|
|
||||||
return map2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// something is terribly wrong, we have a storage lookup for a thread that doesn't have
|
// something is terribly wrong, we have a storage lookup for a thread that doesn't have
|
||||||
// any map data associated with it!
|
// any map data associated with it!
|
||||||
throw new ReviewedStingException("Couldn't find storage map associated with thread " + thread + " id " + thread.getId());
|
throw new ReviewedStingException("Couldn't find storage map associated with thread " + thread + " in group " + thread.getThreadGroup());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue