package water.util; import java.util.Map; import java.util.Map.Entry; import water.DRemoteTask; import water.H2O; public class JStackCollectorTask extends DRemoteTask<JStackCollectorTask> { public String[] _result; // for each node in the cloud it contains all threads stack traces @Override public void reduce(JStackCollectorTask that) { if( _result == null ) _result = that._result; else for (int i=0; i<_result.length; ++i) if (_result[i] == null) _result[i] = that._result[i]; } @Override public void lcompute() { _result = new String[H2O.CLOUD.size()]; Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); StringBuilder sb = new StringBuilder(); for (Entry<Thread,StackTraceElement[]> el : allStackTraces.entrySet()) { append(sb, el.getKey()); append(sb, el.getValue()); sb.append('\n'); } _result[H2O.SELF.index()] = sb.toString(); tryComplete(); } @Override public byte priority() { return H2O.GUI_PRIORITY; } private void append(final StringBuilder sb, final Thread t) { sb.append('"').append(t.getName()).append('"'); if (t.isDaemon()) sb.append(" daemon"); sb.append(" prio=").append(t.getPriority()); sb.append(" tid=").append(t.getId()); sb.append(" java.lang.Thread.State: ").append(t.getState()); sb.append('\n'); } private void append(final StringBuilder sb, final StackTraceElement[] trace) { for (int i=0; i < trace.length; i++) sb.append("\tat ").append(trace[i]).append('\n'); } }