package com.github.martinprillard.shavadoop.master.tasktracker; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import com.github.martinprillard.shavadoop.util.Constant; /** * * @author martin prillard * */ public class CheckStateSlave extends Thread { private Socket socket; private StateSlaveManager stateSlaveManager; public CheckStateSlave(StateSlaveManager _stateSlaveManager, Socket _socket) { stateSlaveManager = _stateSlaveManager; socket = _socket; } public void run() { if (!stateSlaveManager.getTaskFinished()) { String hostClient = socket.getRemoteSocketAddress().toString(); try { BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // send request sendRequestStateSlave(socket); // get the state slave String slaveAliveString = in.readLine(); if (slaveAliveString != null && !slaveAliveString.equalsIgnoreCase(Constant.ANSWER_TASKTRACKER_REQUEST_OK)) { if (Constant.MODE_DEBUG) System.out.println("TASK_TRACKER receive slave's state : " + slaveAliveString + " (" + hostClient + ")"); } if (slaveAliveString != null && slaveAliveString.equalsIgnoreCase(Constant.ANSWER_TASKTRACKER_REQUEST_TASK_FINISHED)) { stateSlaveManager.caseWorkerTaskIsFinished(); // else get the slave's state } else if (slaveAliveString == null) { stateSlaveManager.caseWorkerDied(); } } catch (IOException e) { // slave too long to answer if (Constant.MODE_DEBUG) System.out.println("TASK_TRACKER slave " + hostClient + " not respond..."); stateSlaveManager.caseWorkerDied(); } } } /** * Send request to the slave to know his state * * @param socket */ public void sendRequestStateSlave(Socket socket) { // request slave state PrintWriter out = null; try { out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); // send state out.println(Constant.MESSAGE_TASKTRACKER_REQUEST); out.flush(); } catch (IOException e) { e.printStackTrace(); } } }