package water.api; import water.*; import water.H2ONode.TaskInfo; import water.H2ONode.task_status; import java.util.Arrays; /** * Created by tomasnykodym on 9/17/14. */ public class TaskStatus extends Request2 { static final int API_WEAVER = 1; // This file has auto-gen'd doc & json fields static public DocGen.FieldDoc[] DOC_FIELDS; // Initialized from Auto-Gen code. public static class NodeTaskInfo extends Iced { static final int API_WEAVER = 1; // This file has auto-gen'd doc & json fields static public DocGen.FieldDoc[] DOC_FIELDS; // Initialized from Auto-Gen code. @API(help="node name") final String _node; @API(help="tasks sent here by remote nodes") final TaskInfo[][] _remotes; @API(help="pending tasks sent by me to remotes") final TaskInfo [] _pending; public NodeTaskInfo(TaskInfo [] pending, TaskInfo[][] ts) { _node = H2O.SELF.toString(); _remotes = ts; _pending = pending; } } public static class GetTaskInfo extends DRemoteTask<GetTaskInfo>{ NodeTaskInfo [] _infos; @Override public void reduce(GetTaskInfo drt) { if(_infos == null) _infos = drt._infos; else { for(int i = 0; i < _infos.length; ++i){ if(_infos[i] == null) _infos[i] = drt._infos[i]; } } } @Override public void lcompute() { _infos = new NodeTaskInfo[H2O.CLOUD.size()]; TaskInfo [][] ts = new TaskInfo[H2O.CLOUD.size()][]; int i = 0; for (H2ONode n : H2O.CLOUD._memary) ts[i++] = n.currentTasksInfo(); RPC [] pendingRPCs = UDPTimeOutThread.pendingRPCs(); TaskInfo [] pending = new TaskInfo[pendingRPCs.length]; for(int j = 0; j < pendingRPCs.length; ++j) pending[j] = new TaskInfo(pendingRPCs[j].task(),pendingRPCs[j].taskNum(),pendingRPCs[j].target().index(), pendingRPCs[j].isDone()? task_status.DONE:task_status.CMP,pendingRPCs[j]._callCnt); _infos[H2O.SELF.index()] = new NodeTaskInfo(pending,ts); tryComplete(); } } @API(help="task infos for each node") NodeTaskInfo[] _infos; @Override protected Response serve() { _infos = new GetTaskInfo().invokeOnAllNodes()._infos; return Response.done(this); } public boolean toHTML( StringBuilder sb ) { for(NodeTaskInfo x:_infos) { sb.append("<div>"); sb.append("<h3>" + x._node + "</h3>"); sb.append("<table class='table table-bordered table-condensed'>"); for(int i = 0; i < H2O.CLOUD.size(); ++i){ if(H2O.CLOUD._memary[i] == H2O.SELF) continue; sb.append("<tr>"); sb.append("<th>Pending[" + H2O.CLOUD._memary[i] + "]</th>"); sb.append("<td>"); for(TaskInfo ti:x._pending) if(ti.nodeId == i) sb.append(" " + ti.toString()); sb.append("</td>"); sb.append("</tr>"); } int i = 0; for (TaskInfo[] ti : x._remotes) { sb.append("<tr>"); sb.append("<th>Remote[" + H2O.CLOUD._memary[i++] + "]</th>"); sb.append("<td>"); sb.append(Arrays.deepToString(ti)); sb.append("</td>"); sb.append("</tr>"); } sb.append("</table>"); sb.append("</div>"); sb.append("</p>"); } return true; } }